BÀI TẬP LỚN
CHƯƠNG TRÌNH DỊCH
Đề tài 1: 
 Viết trình biên dịch để dịch 1 đoạn chương trình gồm các phát 
biểu sau ra dạng mã 3 địa chỉ 
Phát biểu ghép, gán, repeat until trong pascal 
Các phát biểu kết thúc bằng dấu ; 
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. 
GV:Phan Thị Thu Hồng
Nhóm 5:
 Nguyễn Thị Huyền
Chu Thị Thanh Hương
Vũ Thị Thùy Linh
Nguyễn Thị Xuân
NỘI DUNG
I. PHÂN TÍCH TỪ VỰNG
1. BẢNG TOKEN
Token Lexeme Match Attribute
ID a1,d_e3c,ba2, (letter|’_’)(letter|digit|’_’)* vtrí BDB
ASG := ‘:=’
SEMI ; ‘;’
COLON : ‘:’
COMA , ‘,’
DOTDOT ‘ ’
PROGRA
M
Program,ProGram
…
(‘p’|’P’)(‘r’|’R’)(‘o’|’O’)(‘g’|’G’)
(‘a’|’A’)
VAR 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
NUM 1,33,10,490,… digit(digit)* vtrí BDB
NUMREA
L
1.2, 2E-3 ,0.5e+4
digit
+
.digit
+ 
 | digit
+
 (.digit
+
|∈)(‘e’|’E’)
(‘+’|’- ‘|∈)digit
+
vtrí BDB
OP1 +,- ‘+’, ‘-‘ plus,minus
OP2 *,/ ‘*’,’/’ multiplicati
on,division
RELOP =, <, >, <=, >=, <> ‘=’, ’<’, ’>’, ’<=’, ’>=’, ’<>’
EQ, LT, 
GT,
LE,GE,NE
RPAR ) ‘)’
LPAR ( ‘(’
DOT . ‘.’
TRUE True, true, TRUE
FALSE FALSE, False, 
FaLse
(‘F’|’f’)(‘A’|’a’)(‘L’|’l’)(‘S’|’s’)(‘E’|’e’)
Định nghĩa token
a. ID
letter → A | B | … | Z | a | b | … | z
digit → 0 | 1 | 2 | … | 9
id → letter (letter | digit)
*
b. NUM
digit → 0 | 1 | 2 | … | 9
digits → digit digit
*
optional_fraction → .digits | 
ε
optional_exponent → ( E ( + | - | 
ε
 ) digits) | 
ε
num → digits optional_fraction optional_exponent
• Ghi chú: 
- BDB: bảng danh biểu.
- Các từ khóa(keyword) được insert vào bảng danh biểu trước khi phân tích từ 
vựng.
- Thứ tự ưu tiên của các phép toán trong Pascal (tương ứng với các phép toán đề 
bài đưa ra):
 + Dấu ngoặc ( )
 + Phép toán một ngôi: NOT.
 + Phép toán *, /, AND.
 + Phép toán +, -, OR 
 + Phép toán so sánh =, <, >, <=, >=, <>
2. LƯỢC ĐỒ DỊCH
2.1 Sơ đồ dịch của id và từ khóa:
2.2 Sơ đồ nhận dạng OP1:
Start
letter | digit 
|‘_’
 letter | ‘_’
return(id, lookup(id))
other
0 1
2
*
Start
0 3
4
+
-
return(OP1, minus)
return(OP1, plus)
2.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
 ‘.’
other
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
other
*
*
‘E’ 
|’e’
Sta
rrrt
digit
1
0
digit
0
2
7
8
other
return(num,vtrí )))))
)bdb)
returnnum,vtrí 
bdb)
4
9
8
Start
0 3
4
return(OP2, multiplication)
return(OP2, division)
*
/
2.5 Sơ đồ dịch nhận dạng token các toán tử quan hệ relop:
Start
0
<
1
=
2
return(relop, LE)
3
>
return(relop, NE)
other
4
return(relop, LT)
5
=
7
=
8
other
6
>
return(relop, GT)
return(relop, EG)
return(relop, EQ)
*
II. PHÂN TÍCH CÚ PHÁP
1. Văn phạm gia tố
1.1 Văn phạm gốc
1)S -> ten kbao body DOT 
/* PROGRAM bai1
 VAR 
 BEGIN
 END.
*/ 
2) 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
10)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
// (n<=4) | (n<=4.4) | (n> 2 or n<10) | (n> 2 and m<5)
15) r_body -> n_lenh
16) exp -> exp OP1 term |exp OP2 term |term
17) term -> factor
18)factor -> ID
19) factor -> NUM
20) factor -> NUMREAL
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
 1) VAR
 2) COLON
 3) TYPE
 4) SEMI //( ; )
 5) ID
 6) COMA //(,)
 7) BEGIN
 8) END
 9) ASSGN //(:=)
13) AND
14) OR
15) NOT
16) RELOP
17) OP1
18) OP2
19) NUM
20) NUMREAL
21) LPAR //(
22) RPAR //)
23) PROGRAM
24)TRUE
25)FALSE
26) $
3. Các ký hiệu chưa kết thúc
1) ten
2) Kbao
3) Body
4) n_kbao
5) Kbkieu
6) n_ID
7) n_lenh
8) lenh
9) l_gan
10) l_repeat_until
11) r_until
12) r_body
13) exp
14) term
15) factor
16) exp1
17) exp2
4.FIRST của những kí hiệu chưa kết thúc:
1) FIRST(ten) = (PROGRAM)
2) FIRST(kbao) = (VAR)
3) FIRST(n_kbao)=FIRST(kbkieu) = FIRST(n_ID)= ID
4) 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)
 7) 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
16) 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
I0:
S’ ->.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 
r_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
exp ->.term
factor -> .FALSE
factor -> .TRUE
I01=goto(I0,S)
S’->S.
*- - - - - 
I02=goto(I0,ten)
S -> ten. Kbao body DOT
Kbao -> .VAR n_kbao
* 
I021’=goto(I02,kbao)
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
Factor -> 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
* 
I010 = goto (I0, Ɛ)
N_lenh -> Ɛ.
* 
I011 = goto (I0,l_gan)
Lenh ->l_gan.
* 
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
R_body ->.n_lenh
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
* 
I015 = goto (I0, LPAR)
R_until -> LPAR .
Factor -> LPAR . exp RPAR
exp -> .exp OP1 term 
 exp -> .exp OP2 term 
exp ->.term
 term ->. factor
factor -> .ID
 factor -> .NUM
 factor ->. NUMREAL
 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.
* 
I019 = 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
 factor ->. 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
Lenh ->.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
* 
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
* 
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
* 
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