Một mục LR(1) là một cặp ([A→α⋅γ], L) gồm một mục LR(0) và một tập lookahead L (tập ký hiệu kết thúc). Phép đóng (closure) LR(1) của một tập mục I được tính theo quy tắc điểm bất động:
Nếu ([A→α⋅Bβ], L)∈I với B là phi kết thúc, thì với mọi sản xuất B→δ, thêm mục ([B→⋅δ], L′) vào I, trong đó L′=FIRST(βa) hợp trên mọi a∈L; cụ thể L′=FIRST(β)∖{ε}, và nếu ε∈FIRST(β) (hoặc β rỗng) thì L′=L′∪L. Nếu mục [B→⋅δ] đã có trong I (với lookahead khác), hợp thêm L′ vào tập lookahead hiện có của nó thay vì tạo mục mới. Lặp lại đến khi không còn thay đổi.
FIRST(β) được tính từ các tập FIRST của từng ký hiệu phi kết thúc cho sẵn (ký hiệu kết thúc có FIRST là chính nó); nếu β rỗng thì FIRST(β)={ε}.
Cho văn phạm, tập FIRST của các phi kết thúc, và tập mục hạt nhân LR(1) (mỗi mục kèm một tập lookahead), hãy tính tập đóng LR(1) đầy đủ.
Ví dụ: văn phạm S→AB, A→a∣ε, B→b; hạt nhân (S \to \cdot\,A\,B,\ \{\}).VıˋsauAcoˋnBvớiFIRST(B) = {b}(kho^ngnullable),lookaheadtruye^ˋnchocaˊcsảnxua^ˊtcủaAlaˋ{b}(kho^nghợpthe^m{$}).Đoˊng:the^m(A \to \cdot,a,\ {b})vaˋ(A \to \cdot,\ {b})$.
A -> X1 ... Xk hoặc A -> # như các bài trước.A: t1 t2 ... [EPS] — các phần tử của FIRST(A) (token EPS nếu ε∈FIRST(A)), giống định dạng bài FIRST đã mô tả trước đó.A -> β . γ | a1 a2 ... — phần trước dấu | là mục LR(0) (định dạng dấu chấm như các bài trước), phần sau dấu | là các ký hiệu lookahead cách nhau khoảng trắng (có đúng một khoảng trắng trước và sau dấu |). Nếu cùng một mục lõi xuất hiện ở nhiều dòng hạt nhân, lookahead của chúng được hợp lại.A -> β . γ | a1 a2 ..., trong đó các lookahead được sắp xếp tăng dần theo thứ tự từ điển (mã ASCII) và cách nhau đúng một khoảng trắng; các mục được liệt kê theo thứ tự tăng dần khi so sánh chuỗi phần trước dấu | (thứ tự từ điển theo mã ASCII).Ví dụ:
Đầu vào:
4
S -> A B
A -> a
A -> #
B -> b
2
A: a EPS
B: b
1
S -> . A B | $
Đầu ra:
3
A -> . | b
A -> . a | b
S -> . A B | $
Đầu vào:
7
S -> A B C
A -> a
A -> #
B -> b
B -> #
C -> c
S -> x
3
A: a EPS
B: b EPS
C: c
1
S -> . A B C | $
Đầu ra:
3
A -> . | b c
A -> . a | b c
S -> . A B C | $
Đang tải editor...