Trong xây dựng bộ phân tích LR, mỗi trạng thái của automaton LR(0) là một tập mục (item set). Một mục của luật sinh A→X1X2…Xm được ký hiệu bằng cặp (i,p) với i là số hiệu luật sinh và 0≤p≤m là vị trí dấu chấm — nghĩa là mục [A→X1…Xp.Xp+1…Xm].
Phép toán CLOSURE trên một tập mục I được định nghĩa như sau: lặp lại cho tới khi không còn thay đổi — với mỗi mục [A→α.Bβ]∈I mà B là một ký hiệu không kết thúc (non-terminal), với mỗi luật sinh B→γ trong văn phạm, nếu mục [B→.γ] (tức (j,0) với j là số hiệu luật B→γ) chưa có trong I thì thêm vào I.
Một ký hiệu được coi là non-terminal nếu nó xuất hiện ở vế trái (LHS) của ít nhất một luật sinh trong văn phạm cho trước; các ký hiệu khác là terminal.
Cho văn phạm và một tập mục lõi (kernel) I ban đầu, hãy tính CLOSURE(I).
Ví dụ: văn phạm gồm 2 luật E -> E + T(1), E -> T(2); kernel I={(1,0)} (tức [E→.E+T]). Vì sau dấu chấm là E (non-terminal), ta thêm mục (2,0) (E→.T). Với T không phải LHS của luật nào trong văn phạm này nên không mở rộng thêm. Kết quả: CLOSURE(I)={(1,0),(2,0)}.
A -> X1 X2 ... Xm (nếu rỗng: A -> ε). Ký hiệu không chứa khoảng trắng.i p — số hiệu luật sinh và vị trí dấu chấm (0≤p≤ độ dài vế phải luật i).In dòng đầu tiên là số lượng mục trong CLOSURE(I). Sau đó, mỗi dòng in một mục dưới dạng i p, các mục được sắp xếp tăng dần theo i trước, nếu bằng nhau thì theo p.
Ví dụ:
Đầu vào:
6
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
1
1 0
Đầu ra:
6
1 0
2 0
3 0
4 0
5 0
6 0
Đầu vào:
6
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
1
5 1
Đầu ra:
7
1 0
2 0
3 0
4 0
5 0
5 1
6 0
Đang tải editor...