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 1BÁ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 3phé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 4Var 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 5Relop =, <, >, <=, >=,<> ‘=’, ’<’, ’>’, ’<=’, ’>=’, ’<>’ 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 7Sơ đồ 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 835) factor → LPARA exp RPARA
36) factor → OP1 factor
Trang 1011.first(While_body)={not,Lpara,ID,Num,Numreal,OP1,True,False} 12.first(dieukien1)={not,Lpara}
Trang 11kbkieu→ 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 12n_lenh →lenh SEMI n_lenh
n_lenh → lenh SEMI
dieukien1 → dieukien1 AND dieukien3
dieukien1 → dieukien1 OR dieukien3
dieukien1 → NOT dieukien3
Trang 13factor → 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 14n_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 17factor → 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 18dieukien4→ 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 20I60=goto(I46,exp)
factor → LPARA exp RPARA
exp → exp OP1 term
Trang 21exp → exp OP1 term.
term → term OP2 factor
Trang 22III 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 23dieukien1 → 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 24x := 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 26term.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