You are on page 1of 3

ĐỀ THI GIỮA KÌ

Lưu ý: Các câu này mình viết lại theo trí nhớ của mình nên nếu có sai sót mong mọi người thông cảm. Có
gì thì có thể hỏi lại mình.

1) Hãy viết biểu diễn các token sau với điều kiện không quá 7 kí tự: =, +=, -=, *=

Đáp án: [+ - *]? =

2) Hãy viết mô tả token của một comment bằng ANTLR. Comment sẽ được trình biên dịch bỏ qua
trong quá trình biên dịch. Nó bắt đầu và kết thúc bằng hai dấu nháy kép. Trong comment có thể
chứa bất kì kí tự nào tuy nhiên không được tồn tại 2 dấu nháp kép liền nhau.

Đáp án: ‘ ”” ’ .*? “~” ‘ ”” ’ -> skip;

3) Hãy viết văn phạm với đặc tả như sau: Có 3 loại toán tử, các toán tử này đều là toán tử 2 ngôi (Có
2 toán hạng), @, ^, ?

Toán tử Độ ưu tiên Tính kết hợp


@ 3 Kết hợp phải
^ 2 Không kết hợp
? 1 Kết hợp trái

Token INT là các số nguyên integer. Nếu thêm dấu () ở bên ngoài biểu thức thì biểu thức đó có độ ưu tiên
cao nhất.

Đáp án:

exp -> exp1 @ exp | exp1

exp1 -> exp2 ^ exp2 | exp2

exp2 -> exp2 ? exp3 | exp3

exp3 -> INT | (exp)

4) Hãy viết mô tả văn phạm của ngôn ngữ sau: (Phần này nhớ không kĩ nên mọi người thông cảm).

Có một ngôn ngữ có cách khai báo kiểu array như sau: array [-1 .. 1,0 .. 1,1 .. 2] of type ;

Trong đó array là tên định danh của kiểu array. Type bao gồm các kiểu: integer, float và kiểu array.

Đáp án: Đáp án viết bằng biểu thức nhưng thầy yêu cầu viết bằng ANTLR, mọi người cố gắng chuyển nó
qua ANTLR nha.

ARRAY, OF, COMMA, INT, FLOAT, SIGN, INTLIT, [, ]

array -> ARRAY dsmien OF type

dsmien -> “[” cacmien “]”


cacmien -> mien COMMA cacmien | mien

mien -> sn “..” sn

sn -> SIGN INTLIT| INTLIT

type -> INT | FLOAT | array

5) Giải quyết vấn đề đa thừa kế trong Python3. Ta có hình sau biểu diễn sự đa thừa kế của các lớp.

B D E

Đáp án: Đáp án này có ghi lại nhưng sau đó thầy nói nó không đúng vì vậy mọi người chỉ nên coi đây là
tham khảo. Mọi người cần tìm hiểu kĩ lại những quy luật của đa thừa kế trong Python3. Nên nhớ Python2
và Python3 khác nhau rất nhiều.

L[A] = [A]

L[B] = B + [A]

 [B,A]

L[C] = C + L[B]

 [C,B,A]

L[D] = [D,A]

L[E] = [E,A]

L[F] = F + new(L[D],L[E])

new([D,A],[E,A])

F[D,E,A]

G = G + new(L(C),L(D),L(F))

[C,B,A],[D,A],[F,D,E,A]
6) Hãy viết output của biểu thức sau: 3 – 5 + 4*6

Dấu cộng là hàm Add(toán hạng trái,toán hạng phải).

Dấu trừ là hàm Minus(toán hạng trái, toán hạng phải).

Dấu nhân là hàm Mul(toán hạng trái, toán hạng phải).

Số nguyên là hàm Lit(số nguyên)

Đáp án: Add(Minus(Lit(3),Lit(5)),Mul(Lit(4),Lit(6)))

7) Cách để hiện thực ngôn ngữ lập trình Python là gì ? (Câu này thầy không trả lời mà chỉ yêu cầu
về nhà tìm hiểu.)

Gợi ý: Xem lại bài đầu tiên học về trình biên dịch và trình thông dịch. Hãy tìm hiểu xem Python là trình
biên dịch hay trình thông dịch. Nếu là trình thông dịch thì là thông dịch theo dòng hay là trình thông dịch
toàn chương trình. Phần này mình không nhớ rõ lắm. Mọi người cố gắng giải thích được nguyên nhân tại
sao thì mới được tính điểm câu này.

8) Viết lập trình hàm: Các câu này thầy không sửa nha mọi người. Mọi người cẩn thận vì các câu
này có thể có liên quan tới bài tập lớn đang làm hiện tại.
a) Cho một hàm có tên là HAM với tham số đầu vào là một danh sách và một số nguyên. Hàm đó có
nhiệm vụ như sau:

List([1,2,3],3) => [(1,3),(2,3),(3,3)]

Hãy sửa lại ở chỗ vị trí x để biểu diễn hàm trên. Viết càng được nhiều cách thì càng được nhiều điểm.

def HAM(a: List(),b: Int)

comb(x)

return (x,b)

return

Bài làm của tác giả: Mình chỉ có thể viết được hàm này để xử lý nó trên Python3

[(x,b) for x in a]

b) Hãy viết hàm để tính phép tính sau: Tính tích của các số nguyên trong 1 danh sách.

Ví dụ: Ta có danh sách [1.5, 2, “b”, “cd”, 3]. Tích của các số nguyên là 2 x 3 = 6.

You might also like