Cho một văn phạm phi ngữ cảnh (CFG) với ký hiệu bắt đầu S (không đảm bảo là 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 có các luật sinh A→α1,…,A→αm (m≥2), xét mọi cặp chỉ số i<j. Gọi SELECT(A→αi)=FIRST(αi)∖{ε}, cộng thêm FOLLOW(A) nếu ε∈FIRST(αi). Nếu SELECT(A→αi)∩SELECT(A→αj)=∅ thì cặp luật sinh này xung đột. Phân loại xung đột đó thành 2 nhóm:
Hãy đếm tổng số cặp luật sinh xung đột trên toàn bộ văn phạm, tách riêng theo 2 loại trên (mỗi cặp (i,j) chỉ thuộc đúng một trong hai loại).
Với văn phạm S -> F, F -> id, F -> id, F -> num: cặp (luật sinh 1, luật sinh 2) của F (hai lần id) xung đột kiểu FIRST/FIRST; cặp còn lại với num không xung đột. Kết quả: 1 0.
A -> X1 X2 ... Xk hoặc A -> e.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ột dòng gồm 2 số nguyên cách nhau bởi một khoảng trắng: số cặp luật sinh xung đột loại FIRST/FIRST, và số cặp luật sinh xung đột loại FIRST/FOLLOW (theo định nghĩa nêu trên).
Ví dụ:
Đầu vào:
S
3
S -> A a
A -> a
A -> e
Đầu ra:
0 1
Đầ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:
0 0
Đang tải editor...