Quy ước biểu diễn văn phạm phi ngữ cảnh (dùng chung cho các câu hỏi cùng chủ đề):
A -> X1 X2 ... Xk, trong đó các ký hiệu cách nhau đúng 1 khoảng trắng:
A là ký hiệu chưa kết thúc (nonterminal): đúng 1 chữ cái in HOA (A-Z).Xi là một token — hoặc là 1 ký hiệu chưa kết thúc (chữ in hoa đã/ sẽ xuất hiện ở vế trái sản xuất nào đó), hoặc là 1 ký hiệu kết thúc (terminal): đúng 1 ký tự bất kỳ không phải chữ in hoa (chữ thường, chữ số, hoặc ký hiệu như + * ( ) , ; ...). Đảm bảo không ký hiệu kết thúc nào là $, #, hay trùng chuỗi eps.A -> eps (đúng 1 token eps, không kèm ký hiệu nào khác).Xây dựng toàn bộ bảng phân tích cú pháp LL(1) M theo đúng quy tắc chuẩn (xem hai bài trước cùng chủ đề về cách điền bảng LL(1)): hàng là mọi ký hiệu chưa kết thúc của văn phạm, cột là mọi ký hiệu kết thúc xuất hiện ở vế phải ít nhất một sản xuất nào đó trong văn phạm, cộng thêm cột $.
Với mỗi ô M[A,a] không rỗng: nếu chỉ có đúng 1 sản xuất được đặt vào đó, ô đó là bình thường; nếu có từ 2 sản xuất trở lên, đó là ô xung đột (conflict) và văn phạm không phải LL(1).
Ví dụ: Với văn phạm
2
S -> a
S -> a b
cột terminal của văn phạm là a, b (cộng $); ô M[S,a] chứa cả sản xuất 1 và 2 ⇒ xung đột.
In ra mỗi ô không rỗng của bảng M trên một dòng, duyệt theo thứ tự: hàng A tăng dần theo alphabet (A-Z); trong mỗi hàng, cột a theo thứ tự: các terminal xuất hiện trong văn phạm sắp xếp tăng dần theo mã ASCII, rồi đến cột $ (cuối cùng). Bỏ qua các ô rỗng (không sản xuất nào được đặt vào). Định dạng mỗi dòng:
A a: i (với i là chỉ số 1-based sản xuất đó).A a: i1,i2,... CONFLICT (các chỉ số sản xuất, tăng dần, cách nhau dấu phẩy, rồi khoảng trắng và chữ CONFLICT).Sau khi liệt kê hết các ô không rỗng, in thêm 1 dòng cuối cùng: LL(1) nếu không có ô xung đột nào trong toàn bảng, ngược lại NOT LL(1).
Ví dụ:
Đầu vào:
5
Start -> X Y
X -> a
X -> a b
Y -> c
Y -> c d
Đầu ra:
Start a: 1
X a: 2,3 CONFLICT
Y c: 4,5 CONFLICT
NOT LL(1)
Đầu vào:
8
E -> T X
X -> + T X
X -> eps
T -> F Y
Y -> * F Y
Y -> eps
F -> ( E )
F -> i
Đầu ra:
E (: 1
E i: 1
F (: 7
F i: 8
T (: 4
T i: 4
X ): 3
X +: 2
X $: 3
Y ): 6
Y *: 5
Y +: 6
Y $: 6
LL(1)
Đang tải editor...