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

Bài tập lớn chương trình dịch 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

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 (222.6 KB, 36 trang )

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 ;
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
1. 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 hằng CONST
· Khai báo kiểu TYPE
· Khai báo biến VAR
· 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.
Ví dụ:
PROGRAM MyFirstProg;
VAR i: Integer;
BEGIN
{Các câu lệnh viết ở đây}
END.
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
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 ; ‘;’

CONON : ‘:’
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’)
WHILE While,
while,WhIle,…
(‘W’|’w’)(‘H’|’h’)(‘I’|’i’)(‘l|L’)(‘e|E’)
DO do,Do,DO… (‘d’|’D’)(‘o’|’O’)
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 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

// (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

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
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
// (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
2. Các ký hiệu kết thúc
1) VAR
2) CONON
3) TYPE
4) SEMI //( ; )
5) ID
6) COMA //(,)
7) BEGIN
8) END
9) ASSGN //(:=)
10) NOT

11) RELOP
12) OP1
13) OP2
14) NUM
15) NUMREAL
16) LPAR //(
17) RPAR //)
18) PROGRAM
19)TRUE
20)FALSE
21) $
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_while_do
11) r_while
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,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)
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 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
16) 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 NUMREAL
RPAR
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
I0:
S’ ->.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
r_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
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 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
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_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
*
I010 = goto (I0, Ɛ)
N_lenh -> Ɛ.
*
I011 = goto (I0,l_gan)
Lenh ->l_gan.
*
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
R_body ->.n_lenh
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
*
I015 = goto (I0, LPAR)
R_while -> 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.
*
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
Lenh ->.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
*

×