Trong quá trình xây dựng bảng phân tích LR (đặc biệt là bước tính tập lookahead cho các mục LR(1) khi đóng tập item), người ta thường xuyên cần tính FIRST(α) của một chuỗi ký hiệu văn phạm α=X1X2…Xk, dựa trên các tập FIRST của từng ký hiệu đã được tính sẵn (giả thiết đã đúng, không cần tính lại từ đầu bằng thuật toán điểm bất động).
Quy tắc chuẩn:
Ví dụ: Cho FIRST(A)={a,ε}, FIRST(B)={b}. Với chuỗi α=AB: FIRST(A)∖{ε}={a} được thêm vào; vì ε∈FIRST(A) nên xét tiếp B: thêm {b}; B không có ε nên dừng. Kết quả: FIRST(α)={a,b}, không chứa ε.
Hãy viết chương trình tính FIRST(α) theo đúng quy tắc trên.
TÊN: t1 t2 ... tm, trong đó TÊN là tên ký hiệu phi kết thúc (theo sau là dấu hai chấm dính liền, không có khoảng trắng trước dấu :), và t1 t2 ... tm là các phần tử của FIRST(TÊN) cách nhau bởi khoảng trắng. Token đặc biệt EPS (nếu xuất hiện trong danh sách) biểu diễn ε∈FIRST(TÊN). Các phần tử còn lại là tên ký hiệu kết thúc.In ra đúng 2 dòng:
, (không có khoảng trắng). Nếu tập rỗng, in ra dấu -.EPS: YES nếu ε∈FIRST(α), ngược lại in EPS: NO.Ví dụ:
Đầu vào:
2
A: a
B: b
0
Đầu ra:
-
EPS: YES
Đầu vào:
3
A: a EPS
B: b
C: c EPS
3
A B C
Đầu ra:
a,b
EPS: NO
Đang tải editor...