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

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 sang mã 3 địa chỉ

29 653 1

Đ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 29
Dung lượng 233 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ÁO CÁO CHƯƠNG TRÌNH DỊCHSinh viên thực hiện : Đào Thị Thanh DungPhương Ngọc HoaNguyễn Thị Hoài ThuPhạm Thị Tuyến  Thực hiện chuyển đổi kiểu từ nguyên sang thực khi cần thiết..  Quá tr

Trang 1

BÁO CÁO CHƯƠNG TRÌNH DỊCH

Sinh viên thực hiện :

Đào Thị Thanh DungPhương Ngọc HoaNguyễn Thị Hoài ThuPhạm Thị Tuyến

 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

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

Trang 2

* Ý nghĩa:

Biến và các phát biểu gán là các khái niệm quan trọng của một họ các ngôn ngữ lập trình mà Pascal là một đại diện tiêu biểu Chúng phản ánh cách thức hoạt động của máy tínhhiện nay, đó là:- Lưu trữ các giá trị khác nhau vào một

ô nhớ tại những thời điểm khác nhau.- Một quá trình tính toán có thể coi như

là một quá trình làm thay đổi giá trị của một (haymột số) ô nhớ nào đó, cho đến khi đạt được giá trị cần tìm

b Lệnh ghép (Compound statement)

Một nhóm câu lệnh đơn được đặt giữa 2 chữ BEGIN và END sẽ tạo thành một câu lệnhghép.Trong Pascal ta có thể đặt các lệnh ghép con trong các lệnh ghép lớn hơn bao ngoài của nó và có thể hiểu tương tự như cấu trúc ngoặc đơn( ) trong các biểu thức toán học

Một khối lệnh bắt đầu bằng BEGIN và chấm dứt ở END; Trong một khối lệnh cũng có thể có các khối lệnh con nằm trong nó Một khối chương trình thường được dùng để nhóm từ 2 lệnh trở lên để tạo thành một của các lệnh có cấu trúc

c Phát biểu If <…> then <…> else <…>

Trang 3

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

THEN then,Then, tHen,… (‘t’|’T’)(‘h’|’H’)(‘e’|’E’)

(‘n’|’N’)

ELSE else,Else, eLse, (‘e’|’E’)(‘l’|’L’)(‘s’|’S’)(‘e’|’E’)

NOT not,Not,… (‘n’|’N’) (‘o’|’O’) (‘t’|’T’)

AND and,And,… (‘a’|’A’) (‘n’|’N’) (‘d’|’D’)

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

True TRUE,TrUE,true… (‘T’|’t’)(‘R’|’r’)(‘U’|’u’)(‘e’|’E’)

Trang 4

letter → ‘a’| |’z’|’A’| |’Z’

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

Trang 5

 Sơ đồ dịch của id và từ khóa:

digit

digit

digit

other

1 0 8 8

return(num,vtrí

bdb)

return(num,vtrí bdb)

9 8

Trang 6

3) decl → VAR n_decl

4) n_decl → one_decl n_decl

5) n_decl → one_decl

6) one_decl → n_id COLON TYPE SEMI

7) n_id → ID COMMA n_id

15) pbgan → ID ASSGN exp

16) if_else_stmt → IF if_body THEN body

17) if_else_stmt → IF if_body THEN body ELSE body

18 if_body → cond1

19) if_body → cond2

20) cond1 → cond1 AND cond3

21) cond1 → cond1 OR cond3

22) cond1 → NOT cond3

Trang 9

16) first(one_if)=(ID, NUM, NUMREAL, LPARA, OP1)

17) first(exp)=(ID, NUM, NUMREAL, LPARA, OP1)

18) first(term)=( ID, NUM, NUMREAL, LPARA, OP1)

19) first(factor)=( ID, NUM, NUMREAL, LPARA, OP1)

5 Follow của những ký hiệu không kết thúc:

Trang 10

13) Follow(cond2)=( $, THEN)

14) Follow(cond3)=( $, THEN, AND, OR)

15) Follow(one_if)=( $, THEN , RPARA, RELOP)

16) Follow(exp)=( $, OP1, THEN , RPARA, RELOP, COMMA, SEMI, CLOSE)

17) Follow(term)=( $, OP1, OP2, THEN, RPARA, RELOP, COMMA, SEMI, CLOSE)

18) Follow(factor)=( $, OP1, OP2, THEN, RELOP, RPARA, COMMA, SEMI, CLOSE)

Trang 11

n_decl→.one_decl

one_decl→.n_id COLON TYPE SEMI

one_decl→.n_id COLON array_decl SEMI

n_id→.ID COMMA n_id

pbgan→.ID ASSGN exp

pbgan→.array_id ASSGN exp

body→.BEGIN n_stmt END

if_else_stmt → IF if_body THEN body

if_else_stmt → IF if_body THEN body ELSE body -

Trang 12

one_decl→.n_id COLON TYPE SEMI n_id→.ID COMMA n_id

Trang 13

if_else_stmt → IF if_body1 THEN body

if_else_stmt → IF if_body1 THEN body ELSE body if_body → cond1

if_body → cond2

cond1 → cond1 AND cond3

cond1 → cond1 OR cond3

cond1 → NOT cond3

factor → LPARA exp RPARA

factor → OP1 factor

Trang 14

-I21=goto[I10,COMMA]:

n_id→ID COMMA n_id

n_id→.ID COMMA n_id

n_id→.ID

-I22=goto[I11,END]:

body→BEGIN n_stmt END -

pbgan→ID ASSGN exp

exp→.exp OP1 term

Trang 15

factor → true

array_id → false

-I25=goto[I17, if_body]:

if_else_stmt → IF if_body THEN body END

if_else_stmt → IF if_body THEN body ELSE body END -

I26=goto[I17,cond1]

if_body → cond1

cond1 → cond1 AND cond3

cond1 → cond1 OR cond3

-I27=goto(I17,NOT)

cond1 →NOT cond3

cond3 → LPARA cond4 RPARA

cond3 → LPARA cond4 RPARA

factor → LPARA exp RPARA

cond4→ cond4 RELOP exp

Trang 16

factor→.NUM DOT NUM

Trang 17

factor → LPARA exp RPARA

factor → OP1 factor

Trang 19

factor → NUMREAL

factor → LPARA exp RPARA

factor → OP1 factor

if_else_stmt → IF if_body THEN body END

if_else_stmt → IF if_body THEN body ELSE body END body → BEGIN n_lenh END SEMI

-I48=goto(I26,And)

cond1 → cond1 AND cond3

cond3 → LPARA cond4 RPARA

-I49=goto(I26,OR)

cond1 → cond1 OR cond3

cond3 → LPARA cond4 RPARA

Trang 20

cond4→ cond4 RELOP exp -

cond4→ cond4 RELOP exp

exp → exp OP1 term

Trang 21

factor -> FALSE

-I54=goto(I31,OP1)

exp → exp OP1 term

term → term OP2 factor

Trang 22

factor → OP1 factor.

Trang 23

-I61=goto(I47,body)

if_else_stmt → IF if_body THEN body END

if_else_stmt → IF if_body THEN body ELSE body END

cond4→ cond4 RELOP exp

exp → exp OP1 term

Trang 24

goto(I53,True)=I38

goto(I53,False)=I39

I67=goto(I54,term)

exp → exp OP1 term term → term OP2 factor

goto(I54,factor)=I33

goto(I54,ID)=I34

goto(I54,NUM)=I35

goto(I54,NUMREAL)=I36goto(I54,Lpara)=I46

goto(I54,OP1)=I37

goto(I54,True)=I38

goto(I54,False)=I39

I68=goto(I55,factor)

term → term OP2 factor

goto(I55,ID)=I34

goto(I55,NUM)=I35

goto(I55,NUMREAL)=I36

Trang 26

III PHÂN TÍCH NGỮ NGHĨA

- Giai đoạn phân tích ngữ nghĩa sẽ thực hiện việc kiểm tra xem chương trình

nguồn có chứa lỗi về ngữ nghĩa hay không và tập hợp thông tin về kiểu chogiai đoạn sinh mã về sau

- Phân tích ngữ nghĩa gồm 2 nội dung cơ bản:

 Kiểm tra kiểu

 Chuyển đổi kiểu

1 Kiểm tra kiểu

a Kiểu của biểu thức

cond1→ cond1 AND cond3

cond1 → cond1 OR cond3

cond1 → NOT cond3

{ cond1.type := if (cond3.type =boolean and cond1= boolean) then

boolean else error}

{cond1.type := if (cond3= boolean)

then boolean else error

exp → exp OP1 term

exp → term

{ exp.type := if (term.type  {int,real} | |exp.type {int,real})

then error

else if (term.type = exp.type = int

then int else real

term → term OP2 factor

term → factor

{term.type := if (term.type

{int,real} | | factor.type 

{int,real}) then error

else if (term.type = factor.type = int

then int else real}

Trang 27

factor → id {factor.type := sym_lookup(id

then body.type else error}

pbgan → ID ASSGN exp SEMI {pbgan.type := if (id.type = exp.type)

then void else error}

*Chú ý: error – lỗi, void – “không có giá trị” (dùng trong kiểm tra kiểu đối với

lệnh

2 Chuyến đổi kiểu

Factor→ num

Factor→ num.num

Factor→ id

Factor.type:=intFactor.type:= realFactor.type:=lookup(id.entry)

IV Sinh mã 3 địa chỉ

- Mã 3 địa chỉ là một dạng biểu diễn của mã trung gian

- Mã lệnh 3 địa chỉ là một chuỗi các lệnh có dạng tổng quát là:

x := y op z

Trong đó: - x, y, z là tên, hằng hoặc dữ liệu tạm sinh ra trong khi dịch

- op là một toán tử số học hoặc login

1 Sinh mã 3 địa chỉ cho lệnh gán và các biểu thức toán học

pbgan → ID ASSGN exp SEMI

pbgan.code := exp.code ||

gen (id.place ‘:=’ exp.place)

exp → exp + term

exp.place := newtemp();

exp.code := exp.code || term.code || gen (exp.place ‘:=’ exp.place ‘+’ term.place)exp → exp - term exp.place := newtemp();

Trang 28

exp.code := exp.code || term.code || gen (exp.place ‘:=’ exp.place ‘-’ term.place)term → term * factor term.place := newtemp();

term.code := factor.code || term.code || gen (term.place ‘:=’ factor.place ‘*’ term.place)

term → term / factor term.place := newtemp();

term.code := factor.code || term.code || gen (term.place ‘:=’ factor.place ‘/’ term.place)

factor → - factor factor.place := newtemp();

factor.code := factor.code ||

gen (factor.place ‘:=’ ‘uminus’

factor.place)factor → LPARA exp RPARA factor.place := newtemp();

factor.code := exp.code

factor.code := ‘’

*Chú ý:

- E.place: nơi giữ giá trị của E

- E.code: Chuỗi lệnh 3 địa chỉ để đánh giá E

- Hàm newtemp(): Sinh ra tên tạm: t1, t2…

- Hàm gen(): Biểu diễn mã 3 địa chỉ

2 Sinh mã 3 địa chỉ cho biểu thức logic

exp → factor and term factor.true := newlabel();

factor.false := exp.false;

term.true := exp.true;

term.false := exp.false;

Trang 29

exp.code := factor.code

|| gen (exp.true ‘:’)

|| term.codeexp → factor or term factor true:= exp true;

factor false:= exp true;

exp code := factor.code

factor false:= exp false;

exp code := factor.codeexp → factor relop term exp code := gen (‘if’ factor.place rhop.op

term.place ‘goto’ exp true)

|| gen (‘goto’ exp false)

*Chú ý:

- factor.true: Nhãn của dòng điều khiển nếu factor là true

-factor.false: Nhãn của dòng điều khiển nếurfactor là false

- Hàm newlabel(): Hàm trả về nhãn mới tại mỗi lần được gọi

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

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