TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘIKHOA: CÔNG NGHỆ THÔNG TIN Bài Tập Lớn: Chương Trình Dịch Đề Số 8 Giáo Viên Hướng Dẫn: Nhóm Sinh Viên Thực Hiện: Phan Thị Chương Bùi Thành Nam Nguyễn Hồn
Trang 1TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI
KHOA: CÔNG NGHỆ THÔNG TIN
Bài Tập Lớn:
Chương Trình Dịch
Đề Số 8
Giáo Viên Hướng Dẫn:
Nhóm Sinh Viên Thực Hiện: Phan Thị Chương
Bùi Thành Nam Nguyễn Hồng Linh Nguyễn Thị Xuân Mai
Hà Nôi, Tháng 12 năm 2012
Đề Tài 8:
Trang 2Viết trình biên dịch dể dịch 1 doạn chuong trình gồm các phát biểu sau:
- Phát biểu gán, for 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 là các biểu thức số học và logic,
gồm các phép toán +,
-, *-, / vàcác phép so sánh Các toán hạng gồm các danh hiệu-, hằng số thực-,
nguyên, true,
false (kể cả biểu thức) Ðộ uu tiên các phép toán tuong tự Pascal
- Thực hiện chuyển dổi kiểu từ nguyên sang thực khi cần thiết
Thực Hiện
I. Phân Tích Từ Vựng
ID a1,d_e3c,ba2, (letter|’_’)(letter|digit|’_’)* vtrí BDB
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’)
FOR for,For, fOr,… (‘f’|’F’)(‘o’|’O’)(‘r’|’R’)
AND and,And,… (‘a’|’A’) (‘n’|’N’) (‘d’|’D’)
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’)(‘o’|’O’)(‘l’|’L’) (‘e’|’E’)(‘a’|’A’) (‘n’|’N’)
Integer Real Boolean
Trang 3NUM 1,33,10,490,… digit(digit)* vtrí BDB
NUMREA
+ digit + | digit + (.digit + |)(‘e’|’E’) (‘+’|’- ‘|)digit + vtrí BDB
,division
RELOP =, <, >, <=, >=, <> ‘=’, ’<’, ’>’, ’<=’, ’>=’, ’<>’ EQ, LT, GT,LE,GE,NE
LƯỢC ĐỒ DỊCH
Sơ đồ dịch nhận dạng token relop:
Sơ đồ dịch của id và từ khóa:
*
*
Start
1
9
1 8
return(relop, LE)
2 0 9 2 1 9
return(relop, NE)
return(relop, LT)
2 2
2 3
2 4 9 2 5 9
return(relop, EQ)
return(relop, EG)
return(relop, GT)
>
other
=
=
>
other
Start
letter | digit
|‘_’
letter | ‘_’
return(id, lookup(id))
other 2
*
Trang 4 Sơ đồ dịch nhận dạng hằng số:
II Phân Tích Cú Pháp
A Văn phạm gia tố:
S -> program
Program -> kbao body DOT
// var begin lenh end
Kbao -> Var n_kbao
N_kbao -> kbkieu SEMI n_kbao // a:integer; b:real;
Kbkieu -> n_ID COLON TYPE SEMI //a:integer;
N_ID -> ID | ID COMA n_ID // a|a,b (truong hop nhieu bien co cung kieu)
Body -> BEGIN n_lenh END
N_lenh -> lenh SEMI n_lenh | lenh SEMI // nhieu lenh|mot lenh
Lenh -> l_gan
Lenh -> body
Lenh -> l_for_do
L_gan -> ID ASSGN exp SEMI //a:=0;
L_for_do -> for l_gan to ID do r_body
3 1
3 6 7
return(numreal,vtrí bdb)
digit
digit
‘+’|’-‘
3 4
3 5
digit
‘E’
|’e’
3 2
3 3 digit
return(numreal,vtrí bdb)
digit
other
3 8 8
other
*
*
‘E’
|’e’
Sta
rt
digit
3 0
digit
2
9
3 7 8
other
return(num,vtrí
)bdb)
3 9 8
Trang 5R_body -> n_lenh
Exp -> exp OP1 term |exp OP2 term |term Term -> factor
Factor -> ID
Factor -> NUM
Factor -> NUMREAL
Factor -> LPAR exp RPAR //a:=a * (c-d); Factor -> OP1 factor // a:= - b;
B Ký hiệu kết thúc:
1) VAR
2) COLON
3) TYPE
4) SEMI //( ; )
5) ID
6) COMMA //(,)
7) BEGIN
8) END
9) ASSGN //(:=)
10) FOR
11) TO
12) DO
13) AND
14) OR
15) NOT
16) OP1
17) OP2
18) NUM
29) NUMREAL
20) LPAR //(
21) RPAR //)
22) DOT
23) $
C Ký hiệu không kết thúc:
1) Program
2) Kbao
3) Body
4) n_kbao
Trang 65) Kbkieu
6) n_ID
7) n_lenh
8) lenh
9) n_gan
10) l_for_do
11) r_body
13) term
14) factor
D FIRST của những kí hiệu chưa kết thúc:
1) FIRST(program) = FIRST(kbao) = {VAR}
3) FIRST(n_kbao)=FIRST(kbkieu) = FIRST(n_ID)={ ID}
4) FIRST (body) = {BEGIN, DOT}
5) FIRST (n_lenh)=FIRST (lenh) = {ID, BEGIN, FOR}
6) FIRST (l_gan) = {ID}
7) FIRST (l_for_do) = {FOR}
8) FIRST (exp)=FIRST(term)=FIRST(factor)= {D,NUM,
NUMREAL, LPAR, OP1}
E FOLLOW của những kí hiệu chưa kết thúc
1) FOLLOW (program) = FOLLOW (kbao) = FOLLOW (n_kbao) = FOLLOW (r_body) = {$}
2) FOLLOW (body) = {$, END, SEMI}
3) FOLLOW(kbkieu) = {$, SEMI}
4) FOLLOW (n_ID) = {$, COLON}
5) FOLLOW (n_lenh) = {$, END}
6) FOLLOW (lenh) = {$, SEMI}
7) FOLLOW (l_gan) = {$, SEMI, TO}
8) FOLLOW (l_for_do) = {$, SEMI}
9) FOLLOW (exp) = FOLLOW (term) = FOLLOW (factor) = { $, SEMI, OP1, OP2, RPAR}
E Tính Tập Tuyển
I0:
Trang 7S → program program → kbao body DOT kbao → var n_kbao
I1 = goto(I0, program):
S → program
I2 = goto(I0, kbao):
program → kbao body DOT body → BEGIN n_lenh END
I3 = goto(I0, var):
kbao → var n_kbao n_kbao → kbkieu SEMI n_kbao
kbaokieu → n_ID COLON TYPE SEMI n_ ID → ID
n_ID → ID COMA n_ID I4 = goto(I2, body):
program → kbao body DOT I5 = goto(I2, BEGIN) = goto(I5,BEGIN) = goto(I22,BEGIN) = goto(I49, BEGIN):
body → BEGIN n_lenh END n_lenh → lenh SEMI n_lenh n_lenh → lenh SEMI
lenh → l_gan lenh → body lenh → l_for_do l_gan → ID ASSGN exp SEMI body → BEGIN n_lenh END l_for_do → for l_gan to ID do r_body I6 = goto(I3, n_kbao)
Kbao → var n_kbao
I7 = goto(I3, kbkieu) = goto(I18, kbkieu)
N_kbao → kbkieu SEMI n_kbao I8 = goto(I3, n_ID) = goto(I3, n_ID)
Kbkieu → n_ID COLON TYPE SEMI I9 = goto(I3, ID) = goto(I18, ID) = goto(I20, ID)
N_ID → ID
N_ID → ID COMA n_ID I10 = goto(I4, DOT)
program → kbao body DOT
I11 = goto(I5, n_lenh)
body → BEGIN n_lenh END
Trang 8I12 = goto(I5, lenh) = goto(I22, lenh) = goto(I49, lenh)
N_lenh → lenh SEMI n_lenh N_lenh → lenh SEMI
I13 = goto(I5, l_gan) = goto(I22, l_gan) = goto(I49, l_gan)
lenh → l_gan
I14 = goto(I5, body) = goto(I22, body) = goto(I49, body)
lenh → body
I15 = goto(I5, l_for_do) = goto(I22, l_for_do) = goto(I49, l_for_do):
lenh → l_for_do
I16 = goto(I5, ID) = goto(I21, ID) = goto(I17, ID) = goto(I49, ID)
L_gan → ID ASSGN exp SEMI I17 = goto(I5,FOR) = goto(I22,FOR) = goto(I49, FOR):
l_for_do → for l_gan to ID do r_body l_gan → ID ASSGN exp SEMI
I18 = goto(I7,SEMI)
N_kbao → kbkieu SEMI n_kbao n_kbao → kbkieu SEMI n_kbao
kbaokieu → n_ID COLON TYPE SEMI n_ ID → ID
n_ID → ID COMA n_ID I19 = goto(I6, COLON)
Kbkieu → n_ID COLON TYPE SEMI I20 = goto(I9, COMA)
N_ID → ID COMA n_ID n_ ID → ID
n_ID → ID COMA n_ID I21 = goto(I11, END)
body → BEGIN n_lenh END
I22 = goto(I12, SEMI)
N_lenh → lenh SEMI n_lenh N_lenh → lenh SEMI
n_lenh → lenh SEMI n_lenh n_lenh → lenh SEMI
lenh → l_gan lenh → body lenh → l_for_do l_gan → ID ASSGN exp SEMI body → BEGIN n_lenh END l_for_do → for l_gan to ID do r_body I23 = goto(I16, ASSGN)
Trang 9L_gan → ID ASSGN exp SEMI exp → exp OP1 term
exp → term exp → exp OP2 term term → factor
factor → ID factor → NUM factor → NUMREAL factor → LPAR exp RPAR factor → OP1 factor
I24 = goto(I18, n_kbao)
N_kbao → kbkieu SEMI n_kbao
I25 = goto(I19, TYPE)
Kbkieu → n_ID COLON TYPE SEMI I26 = goto(I20, n_ID) :
N_ID → ID COMA n_ID
I27 = goto(I22, n_lenh):
N_lenh → lenh SEMI n_lenh
I28 = goto(I23, exp):
L_gan → ID ASSGN exp SEMI exp → exp OP1 term
exp → exp OP2 term I29 = goto(I23, term) = goto(I34, term)
exp → term
I30 = goto(I23, factor) = goto(I34, factor) = goto(I38, factor) = goto(I39, factor)
term → factor
I31 = goto(I23, ID) = goto(I34, ID) = goto(I35, ID) = goto(I38, ID) = goto(I39, ID)
factor → ID
I32 = goto(I23, NUM) = goto(I34, NUM) = goto(I38, NUM) = goto(I39, NUM) = goto(I35, NUM)
factor → NUM
I33 = goto(I23, NURREAL) = goto(I34, NURREAL) = goto(I35,
NURREAL) = goto(I38, NURREAL) = goto(I39, NURREAL)
factor → NUMREAL
I34 = goto(I23, LPAR) = goto(I34, LPAR) = goto(I35, LPAR) = goto(I38, LPAR) = goto(I39, LPAR):
factor → LPAR exp RPAR
Trang 10exp → exp OP1 term exp → term
exp → exp OP2 term term → factor
factor → ID factor → NUM factor → NUMREAL factor → LPAR exp RPAR factor → OP1 factor
I35 = goto(I23, OP1) = goto(I34, OP1) = goto(I35, OP1) = goto(I38, OP1)
= goto(I39, OP1)
factor → OP1 factor factor → ID
factor → NUM factor → NUMREAL factor → LPAR exp RPAR factor → OP1 factor
I36 = goto(I25, SEMI)
Kbkieu → n_ID COLON TYPE SEMI
I37 = goto(I28, SEMI)
L_gan → ID ASSGN exp SEMI
I38 = goto(I28, OP1) = goto(I45, OP1)
exp → exp OP1 term term → factor
factor → ID factor → NUM factor → NUMREAL factor → LPAR exp RPAR factor → OP1 factor
I39 = goto(I28, OP2) = goto(I45, OP2)
exp → exp OP2 term term → factor
factor → ID factor → NUM factor → NUMREAL factor → LPAR exp RPAR factor → OP1 factor
I40 = goto(I34, exp)
factor → LPAR exp RPAR exp → exp OP1 term
Trang 11exp → exp OP2 term
I41 = goto(I35, factor)
factor → OP1 factor
I42 = goto(I38, term)
exp → exp OP1 term
I43 = goto(I39, term)
factor → OP2 factor
I44 = goto(I40, RPAR)
factor → LPAR exp RPAR
I45 = goto(I40,exp)
exp → exp OP1 term
exp → exp OP2 term
I46 = goto(I17,l_gan)
l_for_do → for l_gan to ID do r_body I47 = goto(I46,to)
l_for_do → for l_gan to ID do r_body I48 = goto(I47,ID)
l_for_do → for l_gan to ID do r_body I49 = goto(I48,do)
l_for_do → for l_gan to ID do r_body R_body -> n_lenh
N_lenh -> lenh SEMI n_lenh
N_lenh -> lenh SEMI
Lenh -> l_gan
Lenh -> body
Lenh -> l_for_do
L_gan -> ID ASSGN exp SEMI
L_for_do -> for l_gan to ID do r_body body → BEGIN n_lenh END
l_for_do → for l_gan to ID do r_body I50 = goto(I49, r_body)
l_for_do → for l_gan to ID do r_body I51 = goto(I49, n_lenh)
R_body -> n_lenh