BÀI TẬP LỚN CHƯƠNG TRÌNH DỊCHĐề số 4 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: Phát biểu ghép, while do trong Pascal Các phát biểu kết thúc bằng dấu ;
Trang 1BÀI TẬP LỚN CHƯƠNG TRÌNH DỊCH
Đề số 4
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:
Phát biểu ghép, while do 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) Độ ư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
Yêu cầu:
Viết chương trình bằng tay
Quá trình phân tích cú pháp được thực hiện theo phương pháp từ dưới lên
Giai đoạn xử lý ngữ nghĩa sinh viên phải thực hiện bằng cách đặt các hành vi ngữ nghĩa vào bản đặc tả cú pháp
GV:Phan Thị Thu Hồng
Nhóm 4:
Phạm Ngọc Thắng
Nguyễn Đức Việt
Nguyễn Quý Kiên
Hoàng Huy Luân
Trang 21 Cấu Trúc Của Một Chương Trình Pascal
Một chương trình Pascal gồm 2 phần chính: Phần khai báo và phần thân chương trình Khi thực thi, chương trình Pascal sẽ thực thi tuần tự từng lệnh một theo như thứ tự đã được viết , trừ khi gặp các cấu trúc điều khiển rẻ nhánh hoặc lặp , bắt đầu từ thân chương trình chính.
a Ph n khai báo ầ
Phần khai báo có thể có các mục sau:
· Tên chương trình PROGRAM <Tên chương trình>;
· Khai báo sử dụng unit USES <Tên Unit>[,<Tên Unit>];
· Khai báo nhãn LABEL <Tên nhãn>[,<Tên nhãn>];
· Khai báo chương trình con
b Ph n thân ch ầ ươ ng trình Bắt đầu bằng từ khoá BEGIN và kết thúc bằng từ khoá END (end và dấu chấm).
Giữa BEGIN và END là các câu lệnh.
2 Cấu trúc của vòng lặp why do
Ý nghĩa: Vào lệnh sẽ kiểm tra điều kiện, nếu điều kiện
đúng thì thực thi công việc, sau đó quay lại kiểm tra điều kiện.
Cứ tiếp tục như thế cho tới khi nào điều kiện sai thì kết thúc.
Cú pháp: WHILE <điều kiện> DO
<Công việc>
ĐK
CV
Sai Đúng
Trang 3M 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’)
(‘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
NUMREA
L 1.2, 2E-3 ,0.5e+4 digit
+ digit + | digit + (.digit + |)(‘e’|’E’) (‘+’|’- ‘|)digit + vtrí BDB
Trang 4LPAR ( ‘(’
FALSE FALSE, False,
Trang 62.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
Start
4
return(OP2, multiplication) return(OP2, division )
*
/
Trang 72.5 Sơ đồ dịch nhận dạng token các toán tử quan hệ relop:
=
7
=
8 other
6
>
return(relop, GT) return(relop, EG) return(relop, EQ)
*
Trang 82) Ten -> PROGRAM ID // program bai01
3)kbao -> VAR n_kbao
4)n_kbao -> kbk SEMI n_kbao | Ɛ // a:integer; b:real;
Trang 95)kbk -> n_ID CONON 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_while_do
12) l_gan -> ID ASSGN exp SEMI //a:=0;| a:= b+1;
13) l_while_do -> While r_while DO r_body
14) r_while ->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
Trang 1021) 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
1.2 Văn phạm sau khi loại bỏ đệ quy trái:
1)S -> ten kbao body DOT
2)ten -> PROGRAM ID
3)kbao -> Var n_kbao
4)n_kbao -> kbk SEMI n_kbao // a:integer; b:real;
5)kbk -> n_ID CONON 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
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_why_do
12) l_gan -> ID ASSGN exp SEMI //a:=0;
13) l_why_do-> While r_while DO r_body
Trang 1114) r_while ->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 -> term exp1
17) exp1 -> OP1 term exp1 |Ɛ
18) Exp -> term exp2
19) exp2 -> OP2 term exp2 |Ɛ
20) term -> factor
21)factor -> ID
22) factor -> NUM
23) factor -> NUMREAL
24) factor -> LPAR exp RPAR //a:=a * (c-d);
25) factor -> OP1 factor // a:= - b;
26) exp ->term
27) factor -> NOT factor //
28) factor -> TRUE
29)factor -> FALSE
Trang 126) COMA //(,) 7) BEGIN
8) END
9) ASSGN //(:=)10) NOT
17) RPAR //)
18) PROGRAM19)TRUE
Trang 144) FIRST (body) = BEGIN
5) FIRST (n_lenh) =FIRST(r_body)= (ID, BEGIN,WHILE, Ɛ)
6) FIRST (l_gan) = (ID)
7) FIRST (l_while) = (WHILE)
8) FIRST (exp)=FIRST(term)=FIRST(factor)= (ID,NUM, NUMREAL, LPARA, OP1, NOT, TRUE, FALSE)
9) FIRST(l_while) = (LPAR)
10) FIRST (lenh) = (ID, BEGIN,WHILE)
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_while_do)= FOLLOW (r_body)=(SEMI)
4) FOLLOW (n_ID) = (COMAN)
5) FOLLOW (n_lenh)= ( END, SEMI)
6) FOLLOW (exp)= =(RPARA, SEMI)
Trang 157) 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 CONON 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_while_do
14) l_gan -> ID ASSGN exp SEMI
15) l_while_do -> While r_while DO r_body
Trang 1616) r_while ->LPAR ID RELOP NUM RPAR
17) r_while ->LPAR ID RELOP NUMREAL RPAR
18) r_while -> LPAR ID RELOP NUM AND ID RELOP NUM RPAR 19) r_while -> LPAR ID RELOP NUMREAL AND ID RELOP NUMREALRPAR
20) r_while ->LPAR ID RELOP NUM OR ID RELOP NUM RPAR
21) r_while ->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 17S’ ->.S
S -> Ten kbao body DOT
Ten -> PROGRAM ID
kbao -> VAR n_kbao
n_kbao -> kbk SEMI n_kbao
kbk -> n_ID CONON 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_while_do
l_gan -> ID ASSGN exp SEMI
l_while_do -> While r_while DO r_body
r_while ->.LPAR ID RELOP NUM RPAR
r_while ->.LPAR ID RELOP NUMREAL RPAR
r_while -> LPAR ID RELOP NUM AND ID RELOP NUM RPAR r_while -> LPAR ID RELOP NUMREAL AND ID RELOP NUMREAL RPAR
r_while ->.LPAR ID RELOP NUM OR ID RELOP NUM RPAR
Trang 18r_while ->.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 19
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 CONON 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 20Factor -> 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_while_do
L_gan -> ID ASSGN exp SEMI
L_while_do -> WHILE r_while DO r_body
Body ->.BEGIN n_lenh END
* -I09 = goto (I0,lenh)
N_lenh -> lenh SEMI n_lenh
Trang 21* -
-I012 = goto (I0, body)
Lenh -> body
I013 = goto (I0,l_while_do)
* -Lenh -> l_while_do
I014 = goto (I0, WHILE)
* -L_while_do -> WHILE r_while DO r_body
L_gan -> ID ASSGN exp SEMI
L_while_do -> WHILE r_while DO r_body
Body ->.BEGIN n_lenh END
I015 = goto (I0, LPAR)
* -R_while -> LPAR
Trang 22Factor -> 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 23I019 = 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 24factor -> ID
factor -> NUM
factor -> NUMREAL
factor -> LPAR exp RPAR
factor -> OP1 factor
I024 =goto (I0, FALSE)
* -Factor -> FALSE
I024 =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 25Lenh ->.l_while_do
L_gan -> ID ASSGN exp SEMI
L_while_do -> WHILE r_while DO r_body
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 26
* -I82=goto (I08, lenh) = I09
I83 = goto (I08, Ɛ) =I010
-I84 =goto (I08, l_gan) = I011
I85 = goto (I08, body) = I012
* -I86 = goto (I08, l_while_do) =I013
-I87 = goto (I08, ID)
* -L_gan -> ID ASSGN exp SEMI
I89 = goto (I08, WHILE) =I014
-I810 = goto (I08, BEGIN) =I08
I141 =goto (I014, r_body)
* -R_while_do -> WHILE r_while DO r_body
I142 = goto (I014, n_lenh) = I016
Trang 27-I143 = goto (I014, lenh) = I09
-I144 =goto (I014, Ɛ) = I010
* -I145 =goto (I014, l_gan) = I011
* -I146 = goto (I014, body) = I012
* -I147 = goto (I014, l_while_do) =I013
-I148 = goto (I014, ID)
* -L_gan -> ID ASSGN exp SEMI
I149 = goto (I014, WHILE) =I014
-I1410 = goto (I014, BEGIN) =I08
-I151 = goto (I015, exp)
* -Factor -> LPAR exp RPAR
Trang 28
* -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 29I205 = 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 30I223 = 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 31I235= goto (I023, NUMREAL) = I021
I236= goto (I023, NOT) = I023
I311 = goto (I31, DOT)
* -Program -> kbao body DOT
Lenh -> body
* -Lenh ->.l_while_do
L_gan -> ID ASSGN exp SEMI
L_while_do -> WHILE r_while DO r_body
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 32-I324 = goto (I32, l_gan) =I011
* -I325 =goto (I32, body ) = I012
I326 =goto (I32, l_while_do ) = I013
I326 =goto (I32, ID) = I014
I327 =goto (I32, WHILE) = I015
I328 =goto (I32, BEGIN) = I016
* -I205 = goto (I020, LPAR)
factor -> LPAR exp RPAR
factor -> OP1 factor
Trang 33factor -> 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 34
* -I02510 = goto (I205, LPAR) = I025
I21’1 = goto (I021’, body )
* -S -> ten kbao body DOT