Tải bản đầy đủ (.doc) (33 trang)

BÀI TẬP LỚN CHƯƠNG TRÌNH DỊCH Đề tài 1

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (167.54 KB, 33 trang )

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

×