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 1BÁ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 3Var 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 4letter → ‘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 63) 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 916) 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 1013) 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 11n_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 12one_decl→.n_id COLON TYPE SEMI n_id→.ID COMMA n_id
Trang 13if_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 15factor → 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 16factor→.NUM DOT NUM
Trang 17factor → LPARA exp RPARA
factor → OP1 factor
Trang 19factor → 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 20cond4→ cond4 RELOP exp -
cond4→ cond4 RELOP exp
exp → exp OP1 term
Trang 21factor -> FALSE
-I54=goto(I31,OP1)
exp → exp OP1 term
term → term OP2 factor
Trang 22factor → 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 24goto(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 26III 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 27factor → 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 28exp.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 29exp.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