Professional Documents
Culture Documents
IT4079 Three
IT4079 Three
2
05/12/23
1. Bài toán phân tích cú pháp
7
05/12/23
2. Phương pháp phân tích quay lui
Giới thiệu
• Tư tưởng chủ yếu của giải thuật
– Xây dựng cây phân tích cú pháp (cây suy dẫn)
cho xâu
• Thuật toán Top-down
– Đi từ nút gốc tới nút lá
• Thuật toán Bottom –up
– Quá trình phân tích gạt thu gọn
8
05/12/23
2. Phương pháp phân tích quay lui
– Tạo k con trực tiếp của A với nhãn X1, X2, ...Xk
12
05/12/23
2. Phương pháp phân tích quay lui
13
05/12/23
2. Phương pháp phân tích quay lui
a S b S
1
a S b S
213 213
a b aS
aS c aS Sc S
b S
14
05/12/23
2. Phương pháp phân tích quay lui
a S b S
Đánh số sản xuất 2 3
1. S c a S c
2. S aS 2
13
3. S aSbS a aS c S
b S 15
05/12/23
2. Phương pháp phân tích quay lui
16
05/12/23
2. Phương pháp phân tích quay lui
18
05/12/23
2. Phương pháp phân tích quay lui
20
05/12/23
2. Phương pháp phân tích quay lui
25
05/12/23
2. Phương pháp phân tích quay lui
a a c b c End
Stack
27
05/12/23
2. Phương pháp phân tích quay lui
28
05/12/23
2. Phương pháp phân tích quay lui
29
05/12/23
2. Phương pháp phân tích quay lui
36
05/12/23
Chương 3: Phân tích cú pháp
1. Giới thiệu
37
05/12/23
3. Phương pháp phân tích tất định
Giới thiệu
38
05/12/23
3. Phương pháp phân tích tất định
39
05/12/23
3. Phương pháp phân tích tất định
40
05/12/23
3. Phương pháp phân tích tất định
• Dn-2 Bn-1Bn
41
05/12/23
3. Phương pháp phân tích tất định
• ATij A+aiai+1..ai+j-1 j
– j ký hiệu kể từ vị trí i
• Nếu S T1n
– S +a1a2..a1+n-1 =
i
– Vậy L(G) S T1n
43
05/12/23
3. Phương pháp phân tích tất định
45
05/12/23
3. Phương pháp phân tích tất định
1. S AA
2. S AS Gen (1, 5, S)
3. S b
164356263
4. A SA
5. A AS 262436263
6. A a
: abaab
47
05/12/23
3. Phương pháp phân tích tất định
49
05/12/23
3. Phương pháp phân tích tất định
50
05/12/23
Chương 3: Phân tích cú pháp
1. Giới thiệu
51
05/12/23
3. Phương pháp phân tích tất định
Nội dung
1. Giới thiệu
52
05/12/23
3. Phương pháp phân tích tất định
Giới thiệu
53
05/12/23
3. Phương pháp phân tích tất định
Ví dụ 1
Văn phạm: S aA , A c|bA
Xâu cần phân tích: abbc
Ví dụ 2
Văn phạm: S A|B , A aA|c, B aB|b
Xâu phân tích: aab
K/hiệu Xâu phân tích Sản xuất
quay lui
aA aab So sánh
A ab A aA
aA ab So sánh
A b ?
Để tránh quay lui, thuật toán phân tích tất định giới
hạn trong một số lớp ngôn ngữ: LL(k), LR(k),… 55
05/12/23
3. Phương pháp phân tích tất định
56
05/12/23
3. Phương pháp phân tích tất định
57
05/12/23
3. Phương pháp phân tích tất định
LL(k)
k: Số ký hiệu cần nhìn trước
Left: Thực hiện các suy dẫn trái nhất
05/12/23
Left: Câu được phân tích từ trái qua phải 58
3. Phương pháp phân tích tất định
FIRSTk(α)
• Cho văn phạm phi ngữ cảnh G=(VT,VN,P,S)
• k là một số nguyên dương, α V*
• Định nghĩa
FIRSTk(α) = {x |x VT*, l(x) = k, α L* xβ }
= {x |x VT*, l(x) < k, α L* x}
FIRSTk() là tập các xâu x gồm k ký hiệu kết thúc trái nhất
của các xâu được suy dẫn ra từ
– Chấp nhận trường hợp xâu x không có đủ k ký hiệu
nhưng suy dẫn ra x và không còn ký hiệu nào sau x
59
05/12/23
3. Phương pháp phân tích tất định
FOLLOWk(α)
60
05/12/23
3. Phương pháp phân tích tất định
Ví dụ
Cho văn phạm
S aAb | c
A hS | g
• First1(S) = {a, c} First1(A) = {h, g}
• Follow1(S) = {b} Follow1(A) ={b}
63
05/12/23
3. Phương pháp phân tích tất định
Ví dụ
Văn phạm S aAS | b, A bSa | a
là văn phạm LL(1)
• Xét các sản xuất từ S: S aAS | b
– Xét các cặp suy dẫn trái
S L* xSα L xβ1α L* xZ1
S L* xSα L xβ2α L* xZ2
– Nếu FIRST1(Z1)=FIRST1(Z2)={a} thì từ S phải
dùng sản xuất có ký hiệu a ở đầu: S aAS
– Nếu FIRST1(Z1)=FIRST1(Z2)={b} dùng: S b
• Tương tự với các sản xuất từ A: A bSa | a
64
05/12/23
3. Phương pháp phân tích tất định
Ví dụ
Văn phạm S aAa | bAba, A b | ε
Không phải văn phạm LL(1)
Xét sản xuất S bAba, nếu đang ở ký hiệu không
kết thúc A và nhìn trước b, sẽ không biết cần sử
dụng sản xuất A b hay A ε
Là văn phạm LL(2)
– Nếu đang ở ngữ cảnh aAa, và nhìn trước được
ba, phải áp dụng Ab, còn nếu nhìn trước được
a#, phải áp dụng A ε
– Nếu đang ở ngữ cảnh bAba, và nhìn trước được
bb, phải áp dụng Ab, còn nếu nhìn trước được
05/12/23
ba, phải áp dụng A ε 65
3. Phương pháp phân tích tất định
66
05/12/23
3. Phương pháp phân tích tất định
FIRST(α)
= { ε | α L* ε}
Tập tất cả các ký hiệu kết thúc, đứng đầu một
chuỗi được suy dẫn ra từ α
68
05/12/23
3. Phương pháp phân tích tất định
FOLLOW(A)
Ví dụ
Cho văn phạm: ET | E+T
TF | T*F
Fa | (E)
FIRST(F) = {a, ( }
FIRST(T) = FIRST(F) = {a, ( }
FIRST(E) = FIRST(T) = {a, ( }
FOLLOW(E) = { +, ) , #}
FOLLOW(T) = FOLLOW(T) { * } = { +, ), * , #}
FOLLOW(F) = FOLLOW(T) = { +, ), *, #}
72
05/12/23
3. Phương pháp phân tích tất định
Toán tử
Cho V1 và V2 là 2 tập ký hiệu.
Định nghĩa toán tử
V 1 V2 = V1 nếu εV1
= (V1-{ε}) V2 nếu ε V1
Ví dụ
{a, b} {c, d} = {a, b}
{ε, a, b} {c, d} = {a, b, c, d}
{ } {a, b} = { } //Do tập rỗng không chứa ε
73
05/12/23
3. Phương pháp phân tích tất định
Bổ đề
FIRST(αβ) = FIRST(α) FIRST(β)
a ε và a FIRST(α)
– Định nghĩa : FIRST(α) FIRST(β) a
– Định nghĩa FIRST: α L*aγ
Vậy FIRST(αβ) = FIRST(aγβ) a
ε FIRST(α)
– Định nghĩa :
FIRST(α) FIRST(β) = (FIRST(α) –{ε}) FIRST(β)
– Định nghĩa FIRST, α L* ε.
• Dựa trên tính chất FIRST (A Bγ và B * ε)
FIRST(αβ) = (FIRST(α) –{ε}) FIRST(β) 74
05/12/23
3. Phương pháp phân tích tất định
FIRST(α) = FIRST(X1)
FIRST(X2) … FIRST(Xn)
75
05/12/23
3. Phương pháp phân tích tất định
Ví dụ tính FIRST
E T | E+T
T F |T*F
F a |(E)
Thực hiện các quy tắc sau cho tới khi không
xuất hiện các thay đổi trong tập FOLLOW
1. Đặt # vào tập FOLLOW(S)
• S là ký hiệu khởi đầu
• # V, dùng đánh dấu kết thúc chuỗi cần phân tích
2. Với mọi sản xuất có dạng AαBβ, thêm
FIRST(β) - {ε} vào FOLLOW(B)
3. Nếu tồn tại sản xuất A αB hoặc có AαBβ
mà {ε} FIRST(β) thì thêm FOLLOW(A) vào
FOLLOW(B)
78
05/12/23
3. Phương pháp phân tích tất định
Ví dụ tính FOLLOW
VP: E T | E+T, T F |T*F, F a |(E)
Quy Sản xuât áp FOLLOW
tắc dụng E T F
1 Khởi tạo #
EE+T +, #
2 T T*F *
F (E) ),+, #
E E+T *, ), +, #
3 ET
T T*F *, ), +, #
TF 79
05/12/23
3. Phương pháp phân tích tất định
Ví dụ
S BA
A + BA | ε
B DC
C * DC | ε
D (S) | a
Tính FIRST(X) và FOLLOW(X) với X VN
80
05/12/23
3. Phương pháp phân tích tất định
Ví dụ tính FIRST
81
05/12/23
3. Phương pháp phân tích tất định
Ví dụ tính FOLLOW
Quy Sản xuât áp FOLLOW
tắc dụng S A B C D
1 Khởi tạo #
SBA, A +BA +
2 BDC, C *DC *
D(S) )
SBA #, )
A +BA, A ε #, )
BDC #,+,)
3
C *DC, C ε #,+,)
05/12/23
FOLLOW(X) #, ) #, ) #,+,) #,+,) *, #,+,) 82
3. Phương pháp phân tích tất định
Trong đó ai VT và ai aj với i j
84
05/12/23
3. Phương pháp phân tích tất định
• Ví dụ:
– Văn phạm A Aa |b đệ quy trái trực tiếp
– Tương đương với văn phạm không đệ quy trái
A bB; B | aB
– Ngôn ngữ được sinh ra bởi 2 VP: ba*
• Ghi chú
– Loại bỏ đệ quy trái cây phân tích bị thay đổi
– Cần phải cấu trúc lại cây phân tích để có được
cấu trúc gốc
88
05/12/23
3. Phương pháp phân tích tất định
90
05/12/23
3. Phương pháp phân tích tất định
A FIRST(A) FOLLOW(A)
Block CONST VAR PROCEDURE . ;
BEGIN
Statement Ident CALL BEGIN IF ; END
WHILE FOR,
Expression + - ( ident number ; END TO THEN DO ) - ]
< <= > >= = !=
Condition + - ( ident number, ODD THEN DO
91
05/12/23
3. Phương pháp phân tích tất định
Các nhánh của sơ đồ bắt đầu bởi một từ khóa (từ tố) khác
nhau (CONST, VAR, PROCEDURE, BEGIN). Vậy <Block> là
một sản xuât LL(1) đơn giản 92
05/12/23
3. Phương pháp phân tích tất định
Điều kiện 1: Các nhánh bắt đầu bởi các từ tố khác nhau
Điều kiện 2: (Thỏa mãn)
FOLLOW(<Statement>) = {END, ., ; }
FIRST(<Statement>)={Ident, CALL, BEGIN, IF, WHILE, 93
05/12/23
3. Phương pháp phân tích tất định
94
05/12/23
3. Phương pháp phân tích tất định
M a b #
S aAS, 1 b, 2 Sai
1. SaAS
A a, 3 bSA,4 Sai
2. S b
a Đẩy Sai Sai
3. A a
b Sai Đẩy Sai
4. A bSA
# Sai Sai Nhận
96
05/12/23
3. Phương pháp phân tích tất định
M a b #
S aAS,1 b, 2 Sai
A
S
b
a
# A a, 3 bSA,4 Sai
A
S
# a Đẩy Sai Sai
A
S
# b Sai Đẩy Sai
S
# # Sai Sai Nhận
101
05/12/23
3. Phương pháp phân tích tất định
4. B DC
FOLLOW(S) = FOLLOW(A)={ #, ) }
5. C *DC FOLLOW(B) = FOLLOW(C)={+, #, ) }
6. C ε FOLLOW(D) = { *, +, #, ) }
7. D (S) Văn phạm đã cho là LL(1)
8. D a
102
05/12/23
3. Phương pháp phân tích tất định
C *DC|ε C
* D C
D (S)|a
D
( S )
a
108
05/12/23
3. Phương pháp phân tích tất định
S void A(){
B A
if( Ch==‘+’) {
void S(){ nextCh();
B(); B();
A(); A();
} }
}
110
05/12/23
3. Phương pháp phân tích tất định
C
* D C
void C(){ B
if( Ch==‘*’) { D C
nextCh();
D(); void B(){
C(); D();
} C();
} }
111
05/12/23
3. Phương pháp phân tích tất định
void D(){ D
( S )
if(Ch==‘(‘){
a
nextCh();
S();
if(Ch==‘)‘) nextCh();
else Error(“Thieu đong ngoac”);
} else if(Ch==‘a‘) nextCh();
else Error(“Thieu toan hang”);
}
05/12/23 112
3. Phương pháp phân tích tất định
void main(){
gets(Str); //nhập xâu cần phân tích
nextCh(); //đọc trước một ký hiệu
S(); //bắt đầu phân tích
printf("Bieu thuc hop le...\n");
} (a+a)*a Bieu thuc hơp le
a*a+ Thieu toan hang
a+*a Thieu toan hang
a*(a+a Thieu dong ngoac
a+aa Bieu thuc hơp le 113
05/12/23
3. Phương pháp phân tích tất định
If Ch in FIRST(α1) Then
Sơ 1
α1
đồ Print(“1”); T(α1)
Else If…
n αn Else If Ch in FIRST(αn) Then
Print(“n”); T(αn)
114
05/12/23
3. Phương pháp phân tích tất định
1. Giới thiệu
116
05/12/23
3. Phương pháp phân tích tất định
Nguyên tắc
• Văn phạm của PL/0 là LL(1)
– Sử dụng phương pháp phân tích xem trước
• Bảng phân tích lớn
– Dùng phương pháp đệ quy trên xuống
• Bộ phân tích cú pháp
– Gồm tập thủ tục, mỗi thủ tục ứng với một sơ đồ
– Luôn đọc trước một ký hiệu/từ tố
• Xem trước một từ tố sẽ cho phép chọn đúng đường
đi khi gặp điểm rẽ nhánh trên sơ đồ cú pháp
– Khi thoát khỏi thủ tục triển khai một đích, luôn
có một từ tố đã được đọc dôi ra
117
05/12/23
3. Phương pháp phân tích tất định
118
05/12/23
3. Phương pháp phân tích tất định
Term
void term()
{
factor();
while(Token == TIMES || Token == SLASH)
{
Token = getToken();
factor();
}
}
119
05/12/23
3. Phương pháp phân tích tất định
Expression
void expression() {
if(Token== plus || Token == minus)
Token = getToken();
term();
while(Token == plus || Token == minus){
Token = getToken();
term();
}
}
120
05/12/23
3. Phương pháp phân tích tất định
Condition
void condition() {
expression();
if(Token == eql || Token == neq || Token == lss ||
Token == leq || Token == grt || Token == geq){
Token = getToken();
expression();
}else {
error("condition: syntax error");
}
}
121
05/12/23
3. Phương pháp phân tích tất định
Statement
Ident := Expression
[ ]
Expression
( )
CALL Ident Expression
,
ELSE Statement
IF Condition THEN Statement
WHILE Condition DO Statement
:=
FOR Ident Expression TO
Expression DO Statement
122
05/12/23
3. Phương pháp phân tích tất định
Statement
void statement() {
if(Token==Ident){//variable := <expression>
Token =getToken(); //array variable ?
if(Token==assign){
getToken();
Expresion();
}else Error(“Thieu toan tu gan”)
}
else…..
}
123
05/12/23
3. Phương pháp phân tích tất định
Statement
if (Token == CALL){
Token= getToken();
if(Token == IDENT){
if(Token == LPAREN){
Token = getToken();
Expression();
while(Token==COMMA){
Token = getToken();
Expression();
}
if(Token = RPAREN) getToken()
else Error(“Thiếu dấu đóng ngoặc);
}
}else Error(“Thiếu tên thủ tục/hàm”);
}else…
124
05/12/23
3. Phương pháp phân tích tất định
Statement
if (Token == BEGIN){
Token = getToken()
Statement();
while (Token == SEMICOLON) {
Token = getToken();
Statement();
}
if(Token==END) Token = getToken()
else Error(“Thiếu từ khóa End”);
}else…
125
05/12/23
3. Phương pháp phân tích tất định
Program
void Program(){
if(Token=PROGRAM){
Token = getToken();
if (Token==IDENT){
getToken();
if(Token==SEMICOLON){
getToken();
Block();
if(Token==PERIOD)
printf(“Thành công”);
else Error(“Thiếu dấu .”);
}else Error(“Thiếu dấu chấm phẩy”);
}else Error(“Thiếu tên chương trình”);
}else Error(Thiếu từ khóa Program)
} 126
05/12/23