Professional Documents
Culture Documents
IT4079 Three
IT4079 Three
2/20/24 2
1. Bài toán phân tích cú pháp
2/20/24 7
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 w
• 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
2/20/24 8
2. Phương pháp phân tích quay lui
2/20/24 10
2. Phương pháp phân tích quay lui
2/20/24 12
2. Phương pháp phân tích quay lui
2/20/24 13
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
2/20/24 14
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
2/20/24 15
2. Phương pháp phân tích quay lui
2/20/24 16
2. Phương pháp phân tích quay lui
2/20/24 18
2. Phương pháp phân tích quay lui
2/20/24 20
2. Phương pháp phân tích quay lui
2/20/24
//trạng thái quay lui21
2. Phương pháp phân tích quay lui
2/20/24 25
2. Phương pháp phân tích quay lui
a a c b c End
Stack
2/20/24 27
2. Phương pháp phân tích quay lui
2/20/24 28
2. Phương pháp phân tích quay lui
2/20/24 29
2. Phương pháp phân tích quay lui
2/20/24 34
2. Phương pháp phân tích quay lui
2/20/24 36
Chương 3: Phân tích cú pháp
1. Giới thiệu
2/20/24 37
3. Phương pháp phân tích tất định
Giới thiệu
2/20/24 38
3. Phương pháp phân tích tất định
2/20/24 39
3. Phương pháp phân tích tất định
2/20/24 40
3. Phương pháp phân tích tất định
• Dn-2 ®Bn-1Bn
2/20/24 41
3. Phương pháp phân tích tất định
• AÎTij Û 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 = w
– Vậy w ÎL(G) Û S ÎT1n i
2/20/24 43
3. Phương pháp phân tích tất định
2/20/24 45
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
w: abaab
2/20/24 47
3. Phương pháp phân tích tất định
2/20/24 49
3. Phương pháp phân tích tất định
2/20/24 50
Chương 3: Phân tích cú pháp
1. Giới thiệu
2/20/24 51
3. Phương pháp phân tích tất định
Nội dung
1. Giới thiệu
2/20/24 52
3. Phương pháp phân tích tất định
Giới thiệu
2/20/24 53
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
2/20/24 56
3. Phương pháp phân tích tất định
2/20/24 57
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
2/20/24
Left: Câu được phân tích từ trái qua phải58
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(a) 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ừ a
– Chấp nhận trường hợp xâu x không có đủ k ký hiệu
nhưng a suy dẫn ra x và không còn ký hiệu nào sau x
2/20/24 59
3. Phương pháp phân tích tất định
FOLLOWk(α)
2/20/24 60
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}
2/20/24 62
3. Phương pháp phân tích tất định
2/20/24 63
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
2/20/24 64
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 A®b, 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 A®b, còn nếu nhìn
2/20/24 trước được ba, phải áp dụng A ® ε 65
3. Phương pháp phân tích tất định
2/20/24 66
3. Phương pháp phân tích tất định
FIRST(α)
2/20/24 68
3. Phương pháp phân tích tất định
FOLLOW(A)
2/20/24 70
3. Phương pháp phân tích tất định
Ví dụ
Cho văn phạm: E®T | E+T
T®F | T*F
F®a | (E)
FIRST(F) = {a, ( }
FIRST(T) = FIRST(F) = {a, ( }
FIRST(E) = FIRST(T) = {a, ( }
FOLLOW(E) = { +, ) , #}
FOLLOW(T) = FOLLOW(T) È { * } = { +, ), * , #}
FOLLOW(F) = FOLLOW(T) = { +, ), *, #}
2/20/24 72
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ử Å
V1 Å 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 ε
2/20/24 73
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(β)
2/20/24 74
3. Phương pháp phân tích tất định
FIRST(α) = FIRST(X1) Å
FIRST(X2) Å…Å FIRST(Xn)
2/20/24 75
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)
2/20/24 77
3. Phương pháp phân tích tất định
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)
2/20/24 78
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 # Æ Æ
E®E+T +, #
2 T ®T*F *
F ®(E) ),+, #
E ®E+T *, ), +, #
3 E®T
T ®T*F *, ), +, #
T®F
2/20/24
FOLLOW (X) ), +, # *, ), +, # *,), +, # 79
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
2/20/24 80
3. Phương pháp phân tích tất định
Ví dụ tính FIRST
2/20/24 81
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 #
S®BA, A ®+BA +
2 B®DC, C ®*DC *
D®(S) )
S®BA #, )
A ®+BA, A ®ε #, )
B®DC #,+,)
3
C ®*DC, C ®ε #,+,)
FOLLOW(X) #, ) #, ) #,+,) #,+,) *, #,+,)
2/20/24 82
3. Phương pháp phân tích tất định
2/20/24 84
3. Phương pháp phân tích tất định
2/20/24 88
3. Phương pháp phân tích tất định
2/20/24 90
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, e
Expression + - ( ident number ; END TO THEN DO ) - ]
< <= > >= = !=
Condition + - ( ident number, ODD THEN DO
2/20/24 91
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
2/20/24 92
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, FOR}
2/20/24 93
3. Phương pháp phân tích tất định
2/20/24 94
3. Phương pháp phân tích tất định
M a b #
S aAS, 1 b, 2 Sai
1. S®aAS
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
2/20/24 96
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
2/20/24 101
3. Phương pháp phân tích tất định
C ®*DC|ε C
* D C
D ® (S)|a
D
( S )
a
2/20/24 108
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();
} }
}
2/20/24 110
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();
} }
2/20/24 111
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)
2/20/24 114
3. Phương pháp phân tích tất định
1. Giới thiệu
2/20/24 116
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
2/20/24 117
3. Phương pháp phân tích tất định
2/20/24 118
3. Phương pháp phân tích tất định
Term
void term()
{
factor();
while(Token == TIMES || Token == SLASH)
{
Token = getToken();
factor();
}
}
2/20/24 119
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();
}
}
2/20/24 120
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");
}
}
2/20/24 121
3. Phương pháp phân tích tất định
Statement
Ident := Expression
[ Expression ]
Expression DO Statement
2/20/24 122
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…..
}
2/20/24 123
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…
2/20/24 124
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…
2/20/24 125
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)
}
2/20/24 126