Cho một văn phạm phi ngữ cảnh (CFG) dùng trong bộ phân tích cú pháp LL(1).
Quy ước biểu diễn văn phạm phi ngữ cảnh (CFG) dùng chung cho đề này:
A-Z).(, ), +, *, id, num, ...) là ký hiệu kết thúc (terminal); terminal có thể dài nhiều ký tự nhưng không chứa khoảng trắng.e ở vế phải nghĩa là luật sinh sinh ra chuỗi rỗng ε (ví dụ A -> e).$ khi cần dùng tới FOLLOW.Với mỗi ký hiệu chưa kết thúc A, tập FIRST(A) được định nghĩa như thường lệ (tập các ký hiệu kết thúc có thể xuất hiện đầu tiên trong một chuỗi mà A dẫn xuất ra, cùng với việc đánh dấu riêng liệu A⇒∗ε hay không).
Thay vì liệt kê toàn bộ tập FIRST(A), với mỗi ký hiệu chưa kết thúc A (theo đúng thứ tự nó xuất hiện lần đầu ở vế trái một luật sinh trong dữ liệu vào), hãy in ra:
Với văn phạm biểu thức số học kinh điển:
E -> T X
X -> + T X
X -> e
T -> F Y
Y -> * F Y
Y -> e
F -> ( E )
F -> id
FIRST(E)={(,id} (2 terminal, không có ε) nên dòng đầu ra cho E là E 2 0.
FIRST(X)={+,ε} (1 terminal, có ε) nên dòng cho X là X 1 1.
A -> X1 X2 ... Xk (các ký hiệu vế phải cách nhau đúng một khoảng trắng), hoặc A -> e nếu vế phải rỗng.Quy ước biểu diễn văn phạm phi ngữ cảnh (CFG) dùng chung cho đề này:
A-Z).(, ), +, *, id, num, ...) là ký hiệu kết thúc (terminal); terminal có thể dài nhiều ký tự nhưng không chứa khoảng trắng.e ở vế phải nghĩa là luật sinh sinh ra chuỗi rỗng ε (ví dụ A -> e).$ khi cần dùng tới FOLLOW.In ra đúng m dòng, với m là số ký hiệu chưa kết thúc phân biệt xuất hiện ở vế trái (theo thứ tự xuất hiện lần đầu trong dữ liệu vào). Mỗi dòng có dạng A k b — trong đó A là tên ký hiệu, k là số terminal (không tính ε) thuộc FIRST(A), và b là 1 nếu ε∈FIRST(A) hoặc 0 nếu ngược lại. Các giá trị trên một dòng cách nhau đúng một khoảng trắng.
Ví dụ:
Đầu vào:
S
1
S -> a
Đầu ra:
S 1 0
Đầu vào:
E
8
E -> T X
X -> + T X
X -> e
T -> F Y
Y -> * F Y
Y -> e
F -> ( E )
F -> id
Đầu ra:
E 2 0
X 1 1
T 2 0
Y 1 1
F 2 0
Đang tải editor...