Phân tích cú pháp thứ tự yếu

Download Report

Transcript Phân tích cú pháp thứ tự yếu

CHƯƠNG 4
PHÂN TÍCH CÚ PHÁP
1
Vai trò của bộ phân tích cú pháp
2
Vai trò của bộ phân tích cú pháp
Bộ phân tích cú pháp nhận chuổi các token từ bộ
phân tích từ vựng để tạo ra cấu trúc cú pháp của
chương trình nguồn.
 Tồn tại ba loại bộ phân tích cú pháp:
 Phương pháp tổng quát:

•
•
Cocke-Younger-Kasami.
Earley.
 Phương pháp thông dụng: Phân tích từ trên xuống
hay phân tích từ dưới lên.
3
Xây dựng văn phạm cho ngôn
ngữ lập trình
Loại bỏ sự không tường minh
Ví dụ: Cho văn phạm sau
stmt -> if exp then stmt
| if exp then stmt else stmt
| other
Ta thấy văn phạm này không tường minh khi phân
tích phát biểu:
if E1then if E2 then S1 else S2
vì tồn tại hai cây cú pháp cho phát biểu.

4
Xây dựng văn phạm cho ngôn
ngữ lập trình
5
Xây dựng văn phạm cho ngôn
ngữ lập trình
6
Xây dựng văn phạm cho ngôn
ngữ lập trình
Loại bỏ sự không tường minh bằng cách sửa lại
văn phạm bằng cách: Khớp mỗi else với một then
chưa khớp gần nhất trước đó.
stmt -> matched-stmt | unmatched-stmt
matched-stmt-> if exp then matched-stmt else
matched-stmt | other
unmatched-stmt -> if exp then stmt
|if exp then matched-stmt else
unmatched-stmt

7
Xây dựng văn phạm cho ngôn
ngữ lập trình



Loại bỏ đệ quy trái:
Một văn phạm là đệ qui trái (left recursive) nếu nó
có một ký hiệu chưa kết thúc A sao cho có một dẫn
xuất ,
với α là một chuỗi nào đó.
Các phương pháp phân tích từ trên xuống không
thể nào xử lý văn phạm đệ qui trái, do đó cần phải
dùng một cơ chế biến đổi tương đương để loại bỏ
các đệ qui trái.
8
Xây dựng văn phạm cho ngôn
ngữ lập trình
9
Xây dựng văn phạm cho ngôn
ngữ lập trình
10
Xây dựng văn phạm cho ngôn
ngữ lập trình

Thí dụ 4.1: Loại bỏ đệ quy trái cho văn phạm:
E -> E + T | T
T -> T * F | F
F -> (E) | id
11
Xây dựng văn phạm cho ngôn
ngữ lập trình

Giải thuật 4.1: Loại bỏ đệ quy trái
Nhập: Văn phạm G không có vòng lặp hoặc luật
sinh rỗng.
Xuất: Văn phạm tương đương G’ không có đệ quy
trái.
Phương pháp: G’ không còn đệ quy trái nhưng có
thể có luật sinh rỗng.
12
Xây dựng văn phạm cho ngôn
ngữ lập trình
13
Xây dựng văn phạm cho ngôn
ngữ lập trình

Thí dụ: Chúng ta có áp dụng giải thuật 4.1 vào văn
phạm sau để loại bỏ đệ quy trái.
S ->Aa | b
A -> Ac | Sd | €
14
Thừa số trái


Thí dụ: Ta có hai luật sinh:
stmt -> if exp then stmt else stmt
| if exp then stmt
Cả hai luật sinh đều có if dẫn đầu nên ta sẽ không
biết chọn luật sinh nào để triển khai. Vì thế để làm
chậm lại quyết định lựa chọn chúng ta sẽ tạo ra
thừa số trái.
15
Tạo văn phạm có thừa số trái
Nhập: Cho văn phạm G.
Xuất: Văn phạm G’ có thừa số trái tương đương.
Phương pháp: Tìm chuỗi dẫn đầu chung của các vế
phải luật sinh, thí dụ:
 là chuỗi không bắt đầu bởi . Ta thay các luật
trên bằng các luật
A -> A’ | 
A’-> 1 | 2 | 3 … | n
16
Thừa số trái


Thí dụ: Cho văn phạm như sau
S -> iEtS | iEtSeS | a
E -> b
Áp dụng giải thuật trên cho văn phạm phát biểu if,
ta có văn phạm yếu tố trái như sau.
S -> iEtSS’ | a
S’-> eS | €
E -> b
17
Phân tích cú pháp từ trên xuống


Phân tích cú pháp đệ quy.
Phân tích cú pháp không đệ quy.
18
Phân tích cú pháp đệ quy đi xuống


Thí dụ: Cho văn phạm G:
S -> cAd
A -> ab | a
Các bước phân tích cú pháp từ trên xuống:
19
Phân tích cú pháp đệ quy đi xuống
20
Phân tích cú pháp đoán
nhận trước đệ quy







Hãy loại bỏ đệ quy trái cho văn phạm mà chúng ta thiết kế.
Hãy tạo văn phạm có thừa số trái nếu cần thiết.
Sơ đồ dịch cho bộ phân tích đoán nhận trước.
Sơ đồ này có đặc điểm như sau:
Mỗi ký hiệu không kết thúc có một sơ đồ.
Tên các cạnh là token và các ký hiệu không kết thúc.
Sự truyền trên token sẽ được thực hiện nếu ký hiệu nhập
trùng với token đó.
Nếu có sự truyền trên ký hiệu không kết thúcA thì ta thực
hiện một lệnh gọi thủ tục A.
21
Phân tích cú pháp đoán
nhận trước đệ quy



Để xây dựng sơ đồ chúng ta sẽ tiến hành các bước
sau đây:
Tạo trạng thái bắt đầu và kết thúc.
Với mỗi luật sinh có dạng:
A -> X1X2…Xn ta xây dựng đường đi từ trạng
thái bắt đầu đến trạng thái kết thúc sao cho các
cạnh có tên X1, X2, X3…Xn.
22
Phân tích cú pháp đoán
nhận trước đệ quy
Thí dụ 4.3: Chúng ta hãy tạo sơ đồ dịch cho văn phạm G
E→E+T|T
T→T*F|F
F → (E) | id


Loại bỏ đệ quy trái trong văn phạm, ta được văn phạm
tương đương sau :
E -> TE’
E’-> + TE’| €
T -> FT’
T’-> *FT’| €
F -> (E) | id
Sơ đồ dịch của các ký hiệu không kết thúc của G
23
Sơ đồ dịch của các ký hiệu
không kết thúc của G
24
Sơ đồ dịch của các ký hiệu
không kết thúc của G
25
Sơ đồ dịch của các ký hiệu không kết
thúc của G, đã được thu giảm
26
Giải thuật
27
Giải thuật
28
Phân tích cú pháp đoán nhận
trước không đệ quy

Cấu tạo của bộ phân tích cú pháp:
29
Hoạt động của bộ phân tích




Ở trạng thái bắt đầu, stack chỉ chứa các ký hiệu
mục tiêu của văn phạm nằm trên $, trên đỉnh stack.
Bảng phân tích M là ma trận. Hai ký hiệu X và a sẽ
xác định hành vi của bộ phân tích. Bộ phân tích có
ba hành vi như sau:
Nếu X = a = $ bộ phân tích dừng và báo thành
công.
Nếu X = a <> $ bộ phân tích sẽ đẫy X ra khỏi
Stack dịch đầu đọc đến ký hiệu nhập kế tiếp.
Nếu X là ký hiệu không kết thúc bộ phân tích sẽ
xét bảng ma trận để tìm luật sinh hoặt lỗi.
30
Giải thuật



Nhập: Chuỗi nhập w và bảng phân tích M cho văn
phạm G.
Xuất: Nếu w thuộc L(G), sẽ tạo ra dẫn xuất trái của
w, ngược lại sẽ báo lỗi.
Phương pháp: Lúc đầu cấu hình của bộ phân tích là
($S, w$) với S là ký hiệu mục tiêu của G. Đặt ip (là
con trỏ hoặc còn gọi là đầu đọc của bộ phân tích)
vào ký hiệu nhập đầu tiên của w$.
31
Giải thuật
32
Phân tích cú pháp đoán nhận
trước không đệ quy
Thí dụ 4.4: Giả sử chúng ta có văn phạm G.
E -> E + T | T
T -> T *F | F
F -> (E) | id
Chúng ta sẽ thực hiện loại bỏ đệ quy trái, nhận được G’:
E -> TE’
E’-> +TE’ | €
T -> FT’
T ->*FT’| €
F -> (E) | id

33
Phân tích cú pháp đoán nhận
trước không đệ quy
Bây giờ chúng ta sẽ phân tích cú pháp cho câu nhập w
= id + id * id bằng bảng phân tích M cho trước.
34
Các bước phân tích cú pháp câu
id + id *id
35
Xây dựng bảng phân tích M






first() là tập c ký hiệu kết thúc a, dẫn đầu các chuỗi được
dẫn xuất từ ,  ->a. Nếu  -> € thì € thuộc first ().
follow(A) là tập các ký hiệu kết thúc a, xuất hiện ngay bên
phải A trong dạng câu.
Các quy tắc tính first(X) với X là ký hiệu văn phạm:
Nếu X là ký hiệu kết thúc thì first(X) = {X}
Nếu X->€ là luật sinh thì ta thêm € vào first(X)
Nếu X là ký hiệu không kết thúc và X ->X1X2X3..Xn là
luật sinh thì cho a vào first(X) nếu với i thì a thuộc first(Xi)
và ký hiệu € ở trong tất cả first(X1) …first(Xi-1)
36
Xây dựng bảng phân tích M




Các quy tắc tính follow(A) cho tất cả các ký hiệu
không kết thúc A.
Cho ký hiệu $ vào follow(S), S là ký hiệu mục
tiêu, $ là ký hiệu kết thúc chuổi nhập.
Tồn tại luật A-> B, tất cả các ký hiệu thuộc
first() sẽ cho vào follow(B) trừ €.
Tồn tại luật A-> B hoặc A-> B mà first() =
{€} thì tất cả các ký hiệu follow(A) sẽ cho vào
follow(B).
37
Xây dựng bảng phân tích M


Thí dụ 4.5: Cho văn phạm G.
E -> TE’
E’-> +TE’ | €
T -> FT’
T’ ->*FT’| €
F -> (E) | id
Toàn bộ các hàm first và follow của các ký hiệu văn phạm
của G:
first(E) = first(T) = first(F) = {(, id}
first(E’) = {+, €}; first(T’) = {*, €}
follow(E) = follow(E’) = {$, )}
follow(T) = follow(T’) = {+, $, )}
follow(F) = {*, +, $, )}
38
Xây dựng bảng phân tích M







Nhập: Văn phạm G.
Xuất: Bảng phân tích M.
Phương pháp:
Với mỗi luật sinh A ->  hãy thực thi bước 2 và 3.
Với mỗi ký hiệu kết thúc a thuộc first(), thêm
A ->  vào M[A, a].
Nếu ký hiệu € thuộc first(), thêm A -> € vào
M[A, b] sao cho b thuộc follow(A). Nếu $ thuộc
follow(A) thì thêm A -> € vào M [A, $].
Những phần tử của bảng M trống, hãy đánh dấu
lỗi.
39
Văn phạm LL(1)

Thí dụ 4.7: Cho văn phạm G.
S -> iEtSS’ | a
S’-> eS’ | €
E -> b
first(S) = {i,a}, first(S’) = {e,€}, first(E) = {b}
follow(S) = {e,$}, follow(S’) = {e,$}, follow(E) =
{t}
40
Bảng phân tích M cho thí dụ
41
Bảng phân tích M cho thí dụ


Nguyên nhân vì e vừa thuộc first(S’) = {e,€} vừa
thuộc follow(S’) = {e,$}.
Văn phạm không có phần tử nào của bảng phân
tích M có nhiều hơn một trị thì được gọi là văn
phạm LL(1).
42
Khắc phục lỗi trong phân tích cú
pháp đoán nhận trước


Lỗi xuất hiện trong các trường hợp sau: Một là ký
hiệu kết thúc trên stack không trùng với ký hiệu
nhập đang được đọc. Hai là A là ký hiệu không kết
thúc trên đỉnh stack, a trên chuỗi nhập, được đọc,
mà M[A, a] là trống.
Một số heuristics được áp dụng cho việc khắc phục
lỗi.
43
Khắc phục lỗi trong phân tích cú
pháp đoán nhận trước


Ta cho tất cả các ký hiệu trong follow(A) vào tập
token đồng bộ của A. Chúng ta làm như vậy cho
mỗi ký hiệu không kết thúc A.
Khi phân tích cú pháp có xuất hiện lỗi, chúng ta sẽ
bỏ qua các ký hiệu kết thúc trên chuổi nhập cho
đến khi xuất hiện token trên chuổi nhập, thuộc
follow(A) thì ta loại A ra khỏi stack.
Khi phân tích cú pháp có xuất hiện lỗi, và A ở trên
stack thì bộ phân tích sẽ loại bỏ các ký hiệu nhập
cho đến khi xuất hiện token trên chuổi nhập, thuộc
first(A)
44
Khắc phục lỗi trong phân tích cú
pháp đoán nhận trước

Thí dụ 4.8: Cho văn phạm
45
Phân tích M có ký hiệu khắc phục lỗi
46
Phân tích M có ký hiệu khắc phục lỗi
47
Thí dụ
48
Thí dụ

Phân tích và khắc phục lỗi cho chuỗi nhập:
W = )id*+id
49
Phân tích cú pháp từ dưới lên


Phân tích cú pháp từ dưới lên được hiểu là phân
tích đẩy và thu giảm (Shift-Reduce parsing) là
phương pháp phân tích LR (L có nghĩa là bộ phân
tích sẽ đọc ký hiệu nhập từ trái sang, R có nghĩa là
bộ phân tích sẽ tạo ra dẫn xuất phải ngược) .
Thí dụ 4.9. Cho văn phạm G.
S ->aABe
A ->Abc|b
B ->d
Phân tích câu w = abbcde.
50
Phân tích cú pháp từ dưới lên


Tóm tắt các bước thu giảm như sau:
Quá trình thu giảm nếu theo chiều ngược lại thì đó
chính là quá trình dẫn xuất phải.
Quá trình này đã sinh cây cú pháp của câu phân
tích từ dưới lên.
51
Thí dụ
52
Thí dụ
53
Handle

Handle của chuỗi ký tự là một chuổi con, mà nó so
trùng với vế phải luật sinh sao cho việc thu giảm
chuổi con này về ký hiệu không kết thúc là một
trong các bước của quá trình dẫn xuất.
Tìm kiếm handle:
Bắt đầu từ chuỗi cần phân tích w, ta đặt w = n. n
là dạng câu được dẫn xuất ở lần thứ n.
54
Handle
Xây dựng dẫn xuất phải ngược từ w = n.
Ta tìm ßn trong n sao cho ßn là vế phải luật sinh
An -> ßn.
Thay ßn trong n bằng An, ta nhận được dạng câu
thứ (n –1) là (n –1).
Quá trình thu giảm cứ tiếp tục như vậy cho đến khi
đạt được 0 chỉ còn là một ký hiệu không kết thúc
và là ký hiệu mục tiêu.
55
Phân tích cú pháp thứ tự yếu

Văn phạm có tính chất: không có luật sinh nào có
vế phải là chuỗi rỗng (A -> €) hoặc ở vế phải
không có hai ký hiệu không kết thúc đứng kề nhau
gọi là văn phạm thứ tự yếu.
56
Phân tích cú pháp thứ tự yếu
57
Phân tích cú pháp thứ tự yếu
2. Hoạt động
Thí dụ 4.10. Cho văn phạm của phát biểu gán
< assign stmt > -> id = < exp >
< exp > -> < exp > + < term > | <term>
< term > -> < term > * < factor > | < factor >
< factor > -> id | (< exp >)
Ký hiệu <assign stmt> là ký hiệu mục tiêu.
58
Bảng phân tích S-R cho văn phạm ở thí
dụ
59
Giải thuật phân tích cú pháp thứ tự
yếu
Lúc đầu stack trạng thái chỉ có ký hiệu $. Stack nhập chứa
chuỗi nhập, được kết thúc bởi dấu $ ; c: = false ;
repeat
if Ký hiệu mục tiêu ở trên đỉnh stack và ký hiệu $ ở đáy
stack trạng thái, đồng thời stack nhập chỉ chứa $ then
c:=true /*phântíchthànhcông, câycúphápxâydựngxong*/
else begin
-X ở trên đỉnh stack trạng thái, Y ở trên đỉnh stack nhập.
-Giả sửT là trị của phần tử S-R [X, Y];
if T là rỗng then error ()
60
Giải thuật phân tích cú pháp thứ tự
yếu
else if T = R then
If trên đỉnh stack có chứa vế phải của luật sinh nào
đó then begin
Gọi A ->X1X2…Xn là luật sinh nào có vế phải
dài nhất so trùng với chuỗi trên stack trạng thái:
(a) Giải tỏa X1 X2…Xn ra khỏi stack;
(b) ThayA lên stack.
(c) Tạo nút mới A trên cây cú pháp, có các con là
X1X2…Xn
end
61
Giải thuật phân tích cú pháp thứ tự
yếu
else error () //Không tìm ra luật sinh
else begin
(a) Giải tỏa Y ra khỏi stack nhập;
(b) Đẩy Y lên đỉnh stack trạng thái;
(c) Tao nút mới tên Y trên cây cú pháp;
end;
end;
until c;
62
Xây dựng bảng phân tích S-R


Định nghĩa các quan hệ <•, =, •>:
Chúng ta nói X <•Y nếu và chỉ nếu tồn tại một luật
sinh mà vế phải có dạng …XA với A là ký hiệu
không kết thúc và sinh ra một chuỗi bắt đầu bằng
Y (A ->Y…) như vậy X là biên trái của handle.
X •>Y nếu và chỉ nếu tồn tại một luật sinh mà vế
phải có dạng …AB. A sinh ra một chuỗi ký hiệu
được kết thúc bằng X (A-> …X). B sinh ra một
chuỗi được bắt đầu bằngY (B ->Y…), hoặc B = Y.
Ở đây có hai trường hợp xảy ra trong quá trình tìm
các mối quan hệ cho cặp (X, Y).
63
Xây dựng bảng phân tích S-R



X = Y nếu và chỉ nếu tồn tại một luật sinh mà vế
phải có dạng …XY...
Nhận xét: (Nếu khi phân tích cú pháp X trên đỉnh
stack trạng thái, Y trên stack nhập)
X •>Y thì bộ phân tích sẽ thực hiện một hành vi
thu giảm.
X <=•Y thì bộ phân tích sẽ thực hiện một hành vi
đẩy.
64
Nguyên tắc tính quan hệ <=•



Tồn tại $ <=• A với A là ký hiệu mục tiêu của văn
phạm cho trước.
Nếu vế phải luật sinh có X nằm kề ngay Y về phía
trái (…XY…) thì X <=•Y
Nếu X <=•Y mà tồn tại một luật sinh Y -> Z1 …Zn
thì X <=•Z1
65
Nguyên tắc tính quan hệ •>




Tồn tại A •> $ với A là ký hiệu mục tiêu.
Nếu X <=•Y và tồn tại một luật sinh X -> Z1…Zn
thì Zn •> Y
Nếu X •>Y và tồn tại một luật sinh X -> Z1…Zn
thì Zn •> Y
Nếu X •>Y và tồn tại một luật sinh Y -> Z1…Zn
thì X •> Z1
66
Ví dụ

Với chuỗi nhập id + id * id, hãy cho biết quá trình
phân tích.
67
Bộ phân tích cú pháp LR


Các tính chất của phương pháp phân tích LR:
Bộ phân tích LR có thể nhận dạng được cấu trúc cú
pháp của các ngôn ngữ lập trình do văn phạm phi
ngữ cảnh tạo ra.
Phương pháp LR là phương pháp tổng quát nhất
của phương pháp phân tích đẩy và thu giảm, không
bị quay lui từ trước đến giờ.
68
Bộ phân tích cú pháp LR


Lớp văn phạm được phân tích bằng phương pháp
LR là lớp văn phạm cha, bao trùm lớp văn phạm
được phân tích bởi phương pháp đoán nhận trước.
Bộ phân tích có khả năng phát hiện lỗi sớm nhất
khi nó rà đến ký hiệu nhập từ trái sang phải.
69
Cấu tạo bộ phân tích cú pháp LR
70
Hoạt động



Stack được dùng để chứa chuỗi ký hiệu có dạng
s0X1s1X2…Xmsm, với sm nằm trên đỉnh stack,
Xi được gọi là ký hiệu văn phạm, si là trạng thái.
Cặp(si, Xi) sẽ xác định một trị được lưu chứa trong
bảng phân tích. Bảng phân tích gồm hai phần biểu
thị bởi hàm action và goto.
Cấu hình (configuration) của bộ phân tích LR là
một cặp (nội dung stack nội dung còn lại của chuỗi
nhập)
Ví dụ: (s0X1s1…Xisi…Xmsm, aiai+1…an$).
71
Phân tích cú pháp LR



Nhập: chuỗi nhập w, bảng phân tích action goto
của văn phạm G.
Xuất: nếu w thuộc L (G), nó tạo ra sự phân tích từ
dưới lên. Ngược lại, bộ phân tích sẽ báo lỗi.
Phương pháp:
Thời điểm ban đầu stack có trạng thái s0.
Chuỗi w$ nằm trên bộ đệm nhập.
Bộ phân tích đặt đầu đọc (con trỏ ip) vào ký hiệu
nhập đầu tiên của w.
72
Phân tích cú pháp LR
73
Ví dụ
Cho văn phạmG
(1) E -> E + T
(2) E -> T
(3) T -> T * F
(4) T -> F
(5) F -> (E)
(6) F -> id
Phân tích câu w = id *id + id
74
Bảng phân tích cho văn phạm G
75
Ví dụ
76
Xây dựng bảng phân tích SLR
Định nghĩa: thực thể LR (0) gọi tắt là thực thể của
văn phạm G là luật sinh của G với các điểm chấm
ở các vị trí nào đó của vế phải.
Thí dụ: G có luật sinh A -> XYZ, sẽ cho bốn thực
thể:
A->•XYZ
A->X•YZ
A->XY•Z
A->XYZ•
Nếu A ->  sẽ cho ta thực thể A ->•
77
Giải thuật tính bao đóng–Closure.
Function closure (I : item) : item;
begin J := I;
repeat
for với mỗi thực thể A -> a.Bß trong J và với mỗi luật
sinh
B ->  trong G sao cho
thực thể B -> • chưa có trong J do
thêm B -> • vào J;
until không thể thêm thực thể mới vào J;
closure := J;
end;
78
Ví dụ

Xét văn phạm gia tố của biểu thức:
E' → E
E→E+T|T
T→T*F|F
F → (E) | id
79
Ví dụ
Nếu I là tập hợp chỉ gồm văn phạm { E'→ • E } thì
closure(I) bao gồm:
E' → • E
E→•E+T
E→•T
T→•T*F
T→•F
F → • (E)
F → • id
80
Giải thuật tính goto
Goto(I, X), trong đó I là một tập các mục và X là
một ký hiệu văn phạm là bao đóng của tập hợp các
mục A → αX•β sao cho A → α•Xβ € I.
 Cách tính goto(I, X):
1. Tạo một tập I' = ∅.
2. Nếu A → α•Xβ € I thì đưa A→ αX•β vào I', tiếp tục
quá trình này cho đến khi xét hết tập I.
3. Goto(I, X) = closure(I')

81
Ví dụ


Giả sử I = { E' → E•, E → E • + T }.
Tính goto (I, +) ?
Ta có I' = { E→ E + • T }
( goto (I, +) = closure(I') bao gồm các mục :
E → E + • T (Luật 1)
T → • T * F (Luật 2)
T → • F (Luật 2)
F → • (E) (Luật 2)
F → • id (Luật 2)
82
Giải thuật tính tập tuyển
các tập thực thể
Procedure items (G’);
begin
C := {closure ({S’->•S}}}
repeat
for với mỗi tập thực thể I trong C và với mỗi ký
hiệu văn phạm X sao cho phép goto(I, X) không
rỗng và không có trong C do
thêm goto(I, X) vào C;
until không thể thêm tập thực thể mới vào C;
end;
83
Xây dựng bảng phân tích
Nhập: văn phạm gia tố G’

Xuất: bảng phân tích SLR với hàm action và goto cho văn
phạm G’

Phương pháp:
1. Xây dựng C = {Io, I1, …In}.
2. i là trạng thái đại diện cho tập thực thể Ii.
a. Nếu A -> •aß là thực thể ở trong Ii và goto(Ii, a) = Ij thì
phần tử action[i, a] = shift(j), với a phải là ký hiệu kết thúc.
b. Nếu A -> • ở trong Ii thì action[i, a] = reduce(A -> )
với a là tất cả các ký hiệu nằm trong follow(A). A không
phải là S’(ký hiệu mục tiêu mới).

84
Xây dựng bảng phân tích
c. Nếu S’->S• ở trong Ii thì action [i, $] = accept.
3. Cho tất cả các ký hiệu không kết thúc A. Nếu
goto[Ii, A] = Ij thì hàm goto[i, A] = j.
4. Tất cả các phần tử của bảng phân tích không được
xác định bằng quy tắc 2 và 3, chúng ta coi là lỗi.
5 Trạng thái bắt đầu của bộ phân tích là tập thực thể có
chứa thực thể S’-> •S.
85
Ví dụ
Cho văn phạm gia tố G’
E’-> E
E -> E + T
E -> T
T -> T* F
T -> F
F -> (E)
F -> id
Hãy tìm tập C và sơ đồ DFA.
Xây dựng bảng phân tích SLR
86
Ví dụ

Văn phạm gia tố G’:
(0) E'→ E
(1) E → E + T
(2) E → T
(3) T → T * F
(4) T → F
(5) F → (E)
(6) F → id
87
Xây dựng tập C
I0 : E'→ • E
E→•E+T
E→•T
T→•T*F
T→•F
F → • (E)
F → • id
88
Xây dựng tập C
89
Xây dựng tập C
90
Xây dựng tập C
91
Tính Follow



FOLLOW(E) = {+, ), $}
FOLLOW(T) = {*, +, ), $}
FOLLOW(F) = {*, +, ), $}
92
Xây dựng bảng phân tích


Trước tiên xét tập mục I0 : Mục F → • (E) cho ra
action[0, (] = "shift 4", và mục F → • id cho
action[0, id] = "shift 5". Các mục khác trong I0
không sinh được hành động nào.
Bây giờ xét I1 : Mục E'→ E • cho action[1, $] =
"accept", mục E → E • + T cho action[1, +] =
"shift 6".
93
Xây dựng bảng phân tích



Kế đến xét I2 : E → T •
T→T•*F
Vì FOLLOW(E) = {+, ), $}, làm cho action[2, $] =
action[2,+] = action[2,)] = "reduce 2". Mục thứ hai
làm cho action[2,*] = "shift 7".
Tiếp tục theo cách này, ta thu được bảng phân tích
cú pháp SLR đã trình bày.
94