Trong xây dựng automat LR(0), một mục (item) LR(0) của sản xuất A→β được viết dưới dạng A→α⋅γ trong đó αγ=β và dấu chấm . đánh dấu vị trí đã đọc tới đâu. Phép đóng (closure) của một tập mục I được tính bằng quy tắc điểm bất động:
Nếu [A→α⋅Bγ]∈I với B là ký hiệu phi kết thúc, thì với mọi sản xuất B→δ của văn phạm, thêm mục [B→⋅δ] vào I (nếu chưa có). Lặp lại đến khi không còn mục nào được thêm mới.
Lưu ý: quy tắc trên chỉ xét ký hiệu ngay sau dấu chấm của từng mục hiện có; nó không "nhìn xuyên qua" các ký hiệu phi kết thúc có khả năng sinh ra chuỗi rỗng ở các mục khác.
Cho văn phạm và một tập mục hạt nhân (kernel) ban đầu, hãy tính tập đóng đầy đủ của nó.
Ví dụ: văn phạm gồm S→A và A→a; hạt nhân {S→⋅A}. Đóng: vì mục S→⋅A có ký hiệu ngay sau dấu chấm là A (phi kết thúc), ta thêm A→⋅a. Kết quả đóng gồm 2 mục: {S→⋅A, A→⋅a}.
A -> X1 X2 ... Xk (vế phải cách nhau khoảng trắng), hoặc A -> # nếu vế phải rỗng. Tập ký hiệu phi kết thúc là tập hợp các vế trái xuất hiện trong n sản xuất này; mọi ký hiệu khác là ký hiệu kết thúc.A -> β . γ — vế phải được viết đầy đủ với dấu chấm . là một token riêng biệt đặt đúng vị trí (nếu β rỗng, dòng bắt đầu ngay bằng .; nếu γ rỗng, dòng kết thúc bằng .; nếu vế phải sản xuất rỗng, mục được viết là A -> .).A -> β . γ như mô tả ở phần input, liệt kê theo thứ tự tăng dần khi so sánh chuỗi (thứ tự từ điển theo mã ASCII), không lặp lại mục trùng nhau.Ví dụ:
Đầu vào:
2
S -> A
A -> a
1
S -> . A
Đầu ra:
2
A -> . a
S -> . A
Đầu vào:
7
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
E' -> E
1
E' -> . E
Đầu ra:
7
E -> . E + T
E -> . T
E' -> . E
F -> . ( E )
F -> . id
T -> . F
T -> . T * F
Đang tải editor...