Cho một văn phạm phi ngữ cảnh (CFG).
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ột chuỗi ký hiệu α=X1X2…Xk (mỗi Xi là terminal hoặc non-terminal của văn phạm, k≥0), tập FIRST(α) được tính theo quy tắc chuẩn: duyệt lần lượt X1,X2,…, cộng dồn FIRST(Xi)∖{ε} cho đến khi gặp Xi không thể dẫn xuất ε thì dừng; nếu tất cả X1,…,Xk đều dẫn xuất được ε (kể cả khi k=0, tức α=ε) thì ε∈FIRST(α).
Cho q truy vấn, mỗi truy vấn là một chuỗi ký hiệu αi (dòng chỉ chứa token e nghĩa là αi=ε, chuỗi rỗng). Hãy tính giao (intersection) của tất cả q tập FIRST(α1),FIRST(α2),…,FIRST(αq).
Với văn phạm biểu thức số học kinh điển (như bài trước) và 3 truy vấn E, T, F: vì FIRST(E)=FIRST(T)=FIRST(F)={(,id} nên giao của chúng là {(,id}, in ra ( id (terminal ( xếp trước id theo thứ tự từ điển ASCII).
A -> X1 X2 ... Xk hoặc A -> e.e nếu chuỗi đó là ε.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 một dòng duy nhất: các ký hiệu kết thúc thuộc giao của q tập FIRST, sắp xếp theo thứ tự từ điển (so sánh chuỗi ASCII thông thường), cách nhau đúng một khoảng trắng. Nếu ε thuộc giao (tức mọi αi đều dẫn xuất được chuỗi rỗng), in thêm token eps ở cuối cùng của dòng (sau các terminal). Nếu giao là tập rỗng, in ra dấu -.
Ví dụ:
Đầu vào:
S
1
S -> a
2
S
S
Đầu ra:
a
Đầ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
3
E
T
F
Đầu ra:
( id
Đang tải editor...