1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

36 837 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 36
Dung lượng 192,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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

Trang 2

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 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 3

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’)

(‘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 4

LPAR ( ‘(’

FALSE FALSE, False,

Trang 6

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

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 7

2.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 8

2) Ten -> PROGRAM ID // program bai01

3)kbao -> VAR n_kbao

4)n_kbao -> kbk SEMI n_kbao | Ɛ // a:integer; b:real;

Trang 9

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

Trang 10

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

Trang 11

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

Trang 12

6) COMA //(,) 7) BEGIN

8) END

9) ASSGN //(:=)10) NOT

17) RPAR //)

18) PROGRAM19)TRUE

Trang 14

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)

Trang 15

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

Trang 16

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 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 17

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

Trang 18

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

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 20

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

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 22

Factor -> 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 23

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

Trang 24

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

Trang 25

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

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 29

I205 = 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 30

I223 = 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 31

I235= 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 33

factor -> 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

Ngày đăng: 20/03/2015, 23:29

HÌNH ẢNH LIÊN QUAN

1. BẢNG TOKEN - 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
1. BẢNG TOKEN (Trang 3)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w