BÀI TẬP LỚN CHƯƠNG TRÌNH DỊCHCác biểu thức trong các phát biểu gồm các phép toán logic Not, And, Or và các phép so sánh.. Các toán hạng gồm các định danh, hằng số thực, nguyên, true,
Trang 1BÀI TẬP LỚN CHƯƠNG TRÌNH DỊCH
Các biểu thức trong các phát biểu gồm các phép toán logic
Not, And, Or và các phép so sánh Các toán hạng gồm các định danh, hằng số thực, nguyên, true, false (kể cả biểu thức) Độ ưu tiên các phép toán tương tự Pascal
Thực hiện chuyển đổi kiểu từ nguyên sang thực khi cần thiết
Các danh hiệu phải khai báo trước
Trang 2VAR Var, var , (‘v’|’V’)(‘a’|’A’)(‘r’|’R’)
BEGIN beGin,Begin, (‘b’|’B’)(‘e’|’E’)(‘g’|’G’) (‘i’|’I’)
(‘n’|’N’)
END End,end, eNd, (‘e’|’E’)(‘n’|’N’)(‘d’|’D’)
REPEAT Repeat, RePeat… (‘R’|’r’)(‘e’|’E’)(‘P’|’p’)(‘A’|’a’)(‘t’|’T’)
UNTIL until,Until,UnTil… (‘u’|’U’)(‘n’|’N’)(‘t’|’T’)(‘i’|’I’)(‘l’|’L)
NOT not,Not,… (‘n’|’N’) (‘o’|’O’) (‘t’|’T’)
AND and,And,… (‘a’|’A’) (‘n’|’N’) (‘d’|’D’)
OR or,Or,… (‘o’|’O’) (‘r’|’R’)
TYPE Integer, iNteger, …
Real, rEal, … Boolean, BooLean
(‘i’|’I’)(‘n’|’N’)(‘t’|’T’)(‘e’|’E’)(‘g’|’G’) (‘e’|’E’) (‘r’|’R’) |
(‘r’|’R’)(‘e’|’E’)(‘a’|’A’)(‘l’|’L’) | (‘B’|’b’)(‘O’|’o’)(‘L’|’l’)(‘E’|’e’) (‘A’|’a’)(‘N’|’n’)
Integer Real Boolean
Trang 3TRUE True, true, TRUE
FALSE FALSE, False,
Trang 52.3 Sơ đồ nhận dạng OP2:
2.4 Sơ đồ dịch nhận dạng hằng số:
3 1
1
’ 0 0 0 6 7
return(numreal,vtrí bdb)
digit
digit
‘+’|’-‘ 8
4
9 5
digit
‘E’
|’e’
5 2
7 3 digit
return(numreal,vtrí Bbdb)
digit
other
6 8 8
digit
0
2 7 8
Trang 62.5 Sơ đồ dịch nhận dạng token các toán tử quan hệ relop:
6
>
return(relop, GT) return(relop, EG) return(relop, EQ)
*
Trang 72) Ten -> PROGRAM ID // program bai01
3)kbao -> VAR n_kbao
4)n_kbao -> kbk SEMI n_kbao | Ɛ // a:integer; b:real;
5)kbk -> n_ID COLON TYPE SEMI //a:integer;
6)n_ID -> ID | ID COMA n_ID // a|a,b (truong hop nhieu bien co cung kieu)
7)Body -> BEGIN n_lenh END SEMI // BEGIN cac lenh END ;
8)n_lenh -> lenh SEMI n_lenh | Ɛ // Thuc hien 1 hoac nhieu lenh | khong co lenh nao
9)lenh -> l_gan
Trang 810)lenh -> body
11)lenh -> l_repeat_until
12) l_gan -> ID ASSGN exp SEMI //a:=0;| a:= b+1;
13) l_repeat_until -> Repeat r_body UNTIL r_until
14) r_until ->LPAR ID RELOP NUM RPAR | LPAR ID RELOP
NUMREAL RPAR | LPAR ID RELOP NUM AND ID RELOP NUM RPAR | LPAR ID RELOP NUMREAL AND ID RELOP NUMREAL RPAR | LPAR ID RELOP NUM OR ID RELOP NUM RPAR | LPAR ID RELOP NUMREAL OR ID RELOP NUMREAL RPAR
21) factor -> LPARA exp RPARA //a:=a * (c-d);
22) factor -> OP1 factor // a:= - b;
23) factor -> NOT factor //
24) factor -> TRUE // a:=true
25) factor -> FALSE //a:=false
2 Các ký hiệu kết thúc
Trang 91) VAR
2) COLON
3) TYPE
4) SEMI //( ; ) 5) ID
6) COMA //(,) 7) BEGIN
8) END
9) ASSGN //(:=)13) AND
Trang 114) FIRST (body) = BEGIN
5) FIRST (n_lenh) =FIRST(r_body)= (ID, BEGIN,REPEAT, Ɛ)
6) FIRST (l_gan) = (ID)
7) FIRST (l_repeat_until) = (REPEAT)
8) FIRST (exp)=FIRST(term)=FIRST(factor)= (ID,NUM, NUMREAL, LPARA, OP1, NOT, TRUE, FALSE)
9) FIRST(l_until) = (LPAR)
10) FIRST (lenh) = (ID, BEGIN,REPEAT)
11) FIRST (exp1)= (OP1,Ɛ)
12) FIRST (exp2)= (OP2,Ɛ)
5 Tính FOLLOW của những kí hiệu chưa kết thúc
1) FOLLOW (ten) = FOLLOW (kbao)= FOLLOW (n_kbao)= ($)
2) FOLLOW (body) = (SEMI, END, DOT)
3) FOLLOW(kbk) = FOLLOW (lenh) = FOLLOW (l_gan)= FOLLOW (l_repeat_until)= FOLLOW (r_until)=(SEMI)
4) FOLLOW (n_ID) = (COLON)
5) FOLLOW (n_lenh)= ( END, SEMI)
6) FOLLOW (exp)= =(RPARA, SEMI)
Trang 127) FOLLOW(term) = FOLLOW(factor) = (LPAR, SEMI, OP1, OP2)
6 Tính action, goto
/* Các luật:
1)S -> Ten kbao body DOT
2)Ten -> PROGRAM ID
3)kbao -> VAR n_kbao
4) n_kbao -> kbk SEMI n_kbao
5) kbk -> n_ID COLON TYPE SEMI
6) n_ID -> ID
7) n_ID ->ID COMA n_ID
8) Body -> BEGIN n_lenh END
9) n_lenh ->.lenh SEMI n_lenh
10) n_lenh -> Ɛ
11) lenh -> l_gan
12) lenh ->body
13) lenh -> l_repeat_until
14) l_gan -> ID ASSGN exp SEMI
15) l_repeat_until -> Repeat r_body UNTIL r_until
Trang 1316) r_until ->LPAR ID RELOP NUM RPAR
17) r_until ->LPAR ID RELOP NUMREAL RPAR
18) r_until -> LPAR ID RELOP NUM AND ID RELOP NUM RPAR 19) r_until -> LPAR ID RELOP NUMREAL AND ID RELOP NUMREAL RPAR
20) r_until ->LPAR ID RELOP NUM OR ID RELOP NUM RPAR
21) r_until ->LPAR ID RELOP NUMREAL OR ID RELOP NUMREAL RPAR
22) r_body -> n_lenh
23) exp -> exp OP1 term
24) exp -> exp OP2 term
25) term -> factor
26) factor -> ID
27) factor -> NUM
28) factor -> NUMREAL
29) factor -> LPARA exp RPARA
30) factor -> OP1 factor
31) factor -> NOT factor
32) exp ->term
33) factor -> TRUE
34) factor -> FALSE
Trang 14S’ ->.S
S -> Ten kbao body DOT
Ten -> PROGRAM ID
kbao -> VAR n_kbao
n_kbao -> kbk SEMI n_kbao
kbk -> n_ID COLON TYPE SEMI
n_ID -> ID
n_ID -> ID COMA n_ID
Body -> BEGIN n_lenh END
n_lenh -> lenh SEMI n_lenh | Ɛ
lenh -> l_gan
lenh ->.body
lenh -> l_repeat_until
l_gan -> ID ASSGN exp SEMI
l_repeat_until -> Repeat r_body UNTIL r_until
r_until ->.LPAR ID RELOP NUM RPAR
r_until ->.LPAR ID RELOP NUMREAL RPAR
r_until -> LPAR ID RELOP NUM AND ID RELOP NUM RPAR r_until -> LPAR ID RELOP NUMREAL AND ID RELOP NUMREAL RPAR
r_until ->.LPAR ID RELOP NUM OR ID RELOP NUM RPAR
Trang 15r_until ->.LPAR ID RELOP NUMREAL OR ID RELOP NUMREAL RPAR
r_body -> n_lenh
exp -> exp OP1 term
exp -> exp OP2 term
term -> factor
factor -> ID
factor -> NUM
factor -> NUMREAL
factor -> LPARA exp RPARA
factor -> OP1 factor
factor -> NOT factor
S -> ten Kbao body DOT
Kbao -> VAR n_kbao
Trang 16
S -> ten kbao body DOT
body ->.BEGIN n_lenh END
* -I04=goto(I0,VAR)
Kbao ->VAR n_kbao
N_kbao ->.kbk SEMI n_kbao
Kbk -> n_ID COLON TYPE SEMI
N_ID -> ID
N_ID -> ID COMA n_ID
I05 =goto(I0,kbk)
* -N_kbao ->kbk SEMI n_kbao
I06= goto (I0, n_ID)
* -Kbk ->n_ID COMA n_ID
I07 = goto (I0, ID)
* -n_ID ->ID
N_ID -> ID COMA n_ID
L_gan -> ID ASSGN exp SEMI
Trang 17Factor -> ID.
I08= goto (I0, BEGIN)
* -Body -> BEGIN n_lenh END
N_lenh -> lenh SEMI n_lenh
N_lenh -> Ɛ
Lenh -> l_gan
Lenh -> body
Lenh ->.l_repeat_until
L_gan -> ID ASSGN exp SEMI
L_repeat_until -> REPEAT r_body UNTIL r_until
Body ->.BEGIN n_lenh END
* -I09 = goto (I0,lenh)
N_lenh -> lenh SEMI n_lenh
Trang 18* -
-I012 = goto (I0, body)
Lenh -> body
I013 = goto (I0,l_repeat_until)
* -Lenh -> l_repeat_until
I014 = goto (I0, REPEAT)
* -L_repeat_until -> REPEAT r_body UNTIL r_until
L_gan -> ID ASSGN exp SEMI
L_repeat_until -> REPEAT r_body UNTIL r_until
Body ->.BEGIN n_lenh END
I015 = goto (I0, LPAR)
* -R_until -> LPAR
Trang 19Factor -> LPAR exp RPAR
exp -> exp OP1 term
exp -> exp OP2 term
factor -> LPARA exp RPARA
factor -> OP1 factor
I016 = goto (I0, n_lenh)
* -R_body -> n_lenh
I017 = goto (I0, exp)
* -Exp ->exp OP1 term
Exp -> exp OP2 term
I018 =goto (I0, term)
* -Exp ->term
Trang 20I019 = goto (I0, factor)
* -Term -> factor
I020 = goto (I0, NUM)
* -Factor -> NUM
I021 = goto (I0, NUMREAL)
* -Factor -> NUMREAL
I022 = goto (I0, OP1)
* -Factor -> OP1.factor
factor -> ID
factor -> NUM
factor -> NUMREAL
factor -> LPAR exp RPAR
factor -> OP1 factor
I023 =goto (I0, NOT)
* -Factor -> NOT factor
Trang 21factor -> ID
factor -> NUM
factor -> NUMREAL
factor -> LPAR exp RPAR
factor -> OP1 factor
I024 =goto (I0, FALSE)
* -Factor -> FALSE
I025 =goto (I0, TRUE)
* -Factor -> TRUE
I31 = goto (I03, body)
* -Program -> kbao body DOT
I32 = goto (I03, BEGIN)
* -Body -> BEGIN n_lenh END
N_lenh -> lenh SEMI n_lenh
N_lenh -> Ɛ
Lenh -> l_gan
Lenh -> body
Trang 22Lenh ->.l_repeat_until
L_gan -> ID ASSGN exp SEMI
L_repeat_until -> REPEAT r_body UNTIL r_until
Body ->.BEGIN n_lenh END
I41 = goto (I04, n_kbao)
* -Kbao -> VAR n_kbao
I42 =goto (I04, kbk)
* -N_kbao -> kbk SEMI n_kbao
I43 =goto (I04, n_ID)
* -Kbk -> nID CONON TYPE SEMI
I44 =goto (I04, ID)
* -N_ID -> ID
N_ID -> ID COMA n_ID
I81 = goto (I08,n_lenh)
* -Body -> BEGIN n_lenh END
Trang 23
* -I82=goto (I08, lenh) = I09
I83 = goto (I08, Ɛ) =I010
-I84 =goto (I08, l_gan) = I011
I85 = goto (I08, body) = I012
* -I86 = goto (I08, l_repeat_until) =I013
-I87 = goto (I08, ID)
* -L_gan -> ID ASSGN exp SEMI
I89 = goto (I08, REPAET) =I014
-I810 = goto (I08, BEGIN) =I08
I141 =goto (I014, r_body)
* -R_repeat_until -> REPEAT r_body UNTIL r_until
I142 = goto (I014, n_lenh) = I016
Trang 24-I143 = goto (I014, lenh) = I09
-I144 =goto (I014, Ɛ) = I010
* -I145 =goto (I014, l_gan) = I011
* -I146 = goto (I014, body) = I012
* -I147 = goto (I014, l_repeat_until) =I013
-I148 = goto (I014, ID)
* -L_gan -> ID ASSGN exp SEMI
I149 = goto (I014, REPAET) =I014
-I1410 = goto (I014, BEGIN) =I08
-I151 = goto (I015, exp)
* -Factor -> LPAR exp RPAR
Trang 25
* -I152 = goto (I015, term) = I018
I153 = goto (I015, factor) = I010
I154 = goto (I015, ID)
* -Factor -> ID
I155 = goto (I015, NUM) = I020
I156 = goto (I015, NUMREAL) = I020
I157 = goto (I015, factor)
* -Factor -> OP1 factor
I201 = goto (I020, factor) = I157
* -I202 = goto (I020, ID) = I154
I203 = goto (I020, NUM) = I020
I204 = goto (I020, NUMREAL) =I021
Trang 26I205 = goto (I020, LPAR)
* -Factor -> LPAR exp RPAR
exp -> exp OP1 term
exp -> exp OP2 term
factor -> LPARA exp RPARA
factor -> OP1 factor
factor -> NOT factor
factor -> FALSE
factor -> TRUE
I206 = goto (I020, OP1)= I022
* -I221 = goto (I022, factor) = 157
I222 = goto (I022, ID) = 154
Trang 27I223 = goto (I022, NUM) = I020
I224 = goto (I022, NUMREAL) = I021
I225 = goto (I022, LRAR) = I025
I226 = goto (I022, OP1) = I022
I226 = goto (I022, NOT) = I023
I231 = goto (I023, factor)
* -Factor -> NOT factor
I232 = goto (I023, ID) = I154
I233 = goto (I023, OP1) = I022
I234 = goto (I023, NUM) = I020
Trang 28I235= goto (I023, NUMREAL) = I021
I236= goto (I023, NOT) = I023
I311 = goto (I31, DOT)
* -Program -> kbao body DOT
Lenh -> body
* -Lenh ->.l_repeat_until
L_gan -> ID ASSGN exp SEMI
L_repeat_until -> REPEAT r_body UNTIL r_until
Body ->.BEGIN n_lenh END
I321 = goto (I32, n_lenh)
* -Body -> BEGIN n_lenh END
I322 = goto (I32, lenh)
* -N_lenh -> lenh SEMI n_lenh
I323 = goto (I32, Ɛ) = I010
Trang 29-I324 = goto (I32, l_gan) =I011
* -I325 =goto (I32, body ) = I012
I326 =goto (I32, l_repeat_until ) = I013
I326 =goto (I32, ID) = I014
I327 =goto (I32, REPEAT) = I015
I328 =goto (I32, BEGIN) = I016
* -I205 = goto (I020, LPAR)
factor -> LPAR exp RPAR
factor -> OP1 factor
Trang 30factor -> NOT factor
I2051 = goto (I205, exp)
* -Factor -> LPAR exp RPAR
exp -> exp OP1 term
exp -> exp OP2 term
I0252 = goto (I205, term) = I018
-I0253 = goto (I205, factor) = I019
I0255 = goto (I205, ID) = I154
I0256 = goto (I205, NUM) = I020
I0257 = goto (I205, NUMREAL) = I021
I0258 = goto (I205, OP1) = I022
I0259 = goto (I205, NOT) = I023
Trang 31
* -I02510 = goto (I205, LPAR) = I025
I21’1 = goto (I021’, body )
* -S -> ten kbao body DOT