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

BÁO CÁO BÀI TẬP LỚN CHƯƠNG TRÌNH DỊCH

27 1,3K 6

Đ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 27
Dung lượng 267 KB

Nội dung

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ể coinhư là một

Trang 1

BÁO CÁO BÀI TẬP LỚ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ể coinhư 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 Lệnh WHILE DO

Trong khi mà điều kiện còn đúng thì cứ thực hiện Công việc, rồi quay trở về kiểm tra điều kiện lại Vòng lặp được tiếp tục, đến khi điều kiện đặt ra không còn đúng nữa thì đi tới thực hiện lệnh tiếp theo

* Cú pháp

WHILE <điều kiện> DO

Ghi chú:· Ðiều kiện trong cấu trúc lặp WHILE DO là một biểu thức logic kiểu Booleanchỉ có 2 giá trị là Ðúng (True) hoặc Sai (False)· Nếu điều kiện Ðúng thì chương trình sẽ chạy trong cấu trúc WHILE DO.· Sau mỗi lần lặp, chương trình trở lại kiểm tra điều kiện Tùy theo biểu thức logiccủa điềukiện là Ðúng hay Sai thì chương trình sẽ thực hiện Công việc tương ứng.· Nếu Sai thì chuyển xuống dưới cấu trúc WHILE DO

d Biểu thức lôgic

Các biểu thức lôgic đơn giản, các biểu thức quan hệ liên kết với nhau bởi

Trang 3

phép toán lôgic tạo thành biểu thức lôgic

- Biểu thức lôgic đơn giản là biến lôgic hoặc hằng lôgic

- Các biểu thức quan hệ phải được đặt trong cặp dấu ( )

- Giá trị biểu thức lôgic là TRUE hoặc FALSE

Được tạo bởi:

Một biến hoặc một hằng kiểu nguyên hay thực;

- Các biến hay hằng liên kết với nhau bởi các phép toán số học, các dấu ngoặc tròn

Lần lượt từ trái sang phải

- Thực hiện các phép toán trong ngoặc tròn trước

- Dãy các phép toán không chứa ngoặc thực hiện từ trái sang phải

theo thứ tự:

+ Các phép toán * /

+ Các phép toán + - thực hiện sau

Biểu thức chứa một hằng hay biến kiểu thực là biểu thức số học thực, giá trị biểu thức có kiểu thực

Trang 4

Var Var, var , (‘v’|’V’)(‘a’|’A’)(‘r’|’R’)

(‘i’|’I’)(‘n’|’N’)

End End,end, eNd, (‘e’|’E’)(‘n’|’N’)(‘d’|’D’)

(‘l’|’L’)(‘e’|’E’)

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

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

program

(‘p’|’P’)(‘o’|’O’)(‘r’|’R’) (‘g’|’G’)(‘a’|’A’)

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 5

Relop =, <, >, <=, >=,<> ‘=’, ’<’, ’>’, ’<=’, ’>=’, ’<>’ EQ, LT, GT,LE,GE,NE

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 6

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

+ lặp lại một hoặc nhiều lần

? lặp lại không hoặc 1 lần

digit

digit

1

2

20 other

return(num,vtr bdb)

return(num,vtr bdb) 22

Trang 7

Sơ đồ dịch nhận dạng khoảng trắng:

II PHÂN TÍCH CÚ PHÁP

1.Các luật sinh

s → program

1) program → khaibao body Dot

2) program → body

3) khaibao → VAR n_khaibao

4) n_khaibao → kbkieu SEMI n_khaibao // x:integer ; y:real 5) n_khaibao → kbkieu

6) kbkieu→ n_id COLON TYPE SEMI // x:integer 7) n_id → ID COMMA n_id

8) n_id → ID

9) body → BEGIN n_lenh END SEMI 10) n_lenh → lenh SEMI n_lenh

11) n_lenh → lenh SEMI

12) lenh → pgan

13) lenh → body

14) lenh → lenh_While_do

15) pgan → ID ASSGN exp SEMI

16) lenh_While_do → While while_body do body

17) while_body → dieukien1

18) while_body → dieukien2

19) dieukien1 → dieukien1 AND dieukien3

20) dieukien1 → dieukien1 OR dieukien3

21) dieukien1 → NOT dieukien3

22) dieukien1 → dieukien3

23) dieukien3 → LPARA dieukien4 RPARA

Start

delim

delim

other 2

*

Trang 8

35) factor → LPARA exp RPARA

36) factor → OP1 factor

Trang 10

11.first(While_body)={not,Lpara,ID,Num,Numreal,OP1,True,False} 12.first(dieukien1)={not,Lpara}

Trang 11

kbkieu→ n_id COLON TYPE SEMI

n_id → ID COMMA n_id

n_id → ID

I5=goto(I0,Begin)

body→Begin n_lenh End SEMI

n_lenh → lenh SEMI n_lenh

n_lenh → lenh SEMI

lenh → pgan

lenh → body

body→.Begin n_lenh End SEMI lenh → lenh_While_do

pgan → ID ASSGN exp SEMI

lenh_While_do → While while_body do body

Trang 12

n_lenh →lenh SEMI n_lenh

n_lenh → lenh SEMI

dieukien1 → dieukien1 AND dieukien3

dieukien1 → dieukien1 OR dieukien3

dieukien1 → NOT dieukien3

Trang 13

factor → LPARA exp RPARA

factor → OP1 factor

n_khaibao → kbkieu SEMI n_khaibao

n_khaibao → kbkieu SEMI n_khaibao

n_khaibao → kbkieu

kbkieu→ n_id COLON TYPE SEMI

n_id → ID COMMA n_id

n_id →ID COMMA n_id

n_id → ID COMMA n_id

n_id → ID

I22=goto(I11,End)

body→Begin n_lenh End SEMI

I23=goto(I12,SEMI)

n_lenh →lenh SEMI n_lenh

n_lenh → lenh SEMI

n_lenh → lenh SEMI n_lenh

Trang 14

n_lenh → lenh SEMI

I24=goto(I16,ASSGN)

pgan → ID ASSGN exp SEMI

exp → exp OP1 term

factor → LPARA exp RPARA

factor → OP1 factor

I27=goto(I17,NOT)

dieukien1 →NOT dieukien3

dieukien3 → LPARA dieukien4 RPARA

Trang 17

factor → LPARA exp RPARA

exp → exp OP1 term

factor → LPARA exp RPARA

factor → OP1 factor

dieukien1 → dieukien1 OR dieukien3

dieukien3 → LPARA dieukien4 RPARAI50=goto(I27,dieukien3)

dieukien1 →NOT dieukien3

Trang 18

dieukien4→ dieukien4 RELOP exp

exp → exp OP1 term

factor → LPARA exp RPARA

factor → OP1 factor

factor -> TRUE

factor -> FALSE

I54=goto(I31,OP1)

exp → exp OP1 term

term → term OP2 factor

Trang 20

I60=goto(I46,exp)

factor → LPARA exp RPARA

exp → exp OP1 term

Trang 21

exp → exp OP1 term.

term → term OP2 factor

Trang 22

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ểucho giai đ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 ểu của biểu thức ủa biểu thức ểu của biểu thức ức

dieukien1→ dieukien1 AND dieukien3

dieukien1 → dieukien1 OR dieukien3

{ dieukien1.type := if(dieukien3.type = boolean and

dieukien1= boolean) then boolean else error}

Trang 23

dieukien1 → NOT dieukien3

,

{dieukien1.type := if (dieukien3=

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}

entry,type)}

sym_lookup(): Hàm tra cứu kiểu trong bảng ký hiệu

b Ki u c a các l nh ểu của biểu thức ủa biểu thức ệnh

lenh_While_do → While while_body do body {lenh_While_do.type:=if

(lenh_While_do.type = boolean) then

body.type else error}

pgan → ID ASSGN exp SEMI {pgan.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

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

Trang 24

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

pgan → ID ASSGN exp SEMI

pgan.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.code := exp.code || term.code || gen (exp.place ‘:=’ exp.place ‘-’ term.place)

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

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 := ‘’

Trang 25

*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

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

Trang 26

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

3 Sinh mã 3 a ch cho l nh i u khi n địa chỉ cho lệnh điều khiển ỉ cho lệnh điều khiển ệnh đ ều khiển ểu của biểu thức

- lenh_While_do.next: Nhãn mà lệnh 3 địa chỉ đầu tiên sẽ thực hiện

sau mã lệnh của lenh_While_do

Ngày đăng: 14/04/2015, 08:59

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w