Báo cáo Chương trình dịchNhóm 11:Đỗ Thị Ngọc Bích Vũ Văn ChíPhạm Văn HưởngTrần Đăng Khoa ưu tiên các phép toán tương tự C.. Thực hiện chuyển đổi kiểu đổi kiểu từ nguyên sang thực khi cần
Trang 1Báo cáo Chương trình dịchNhóm 11:
Đỗ Thị Ngọc Bích
Vũ Văn ChíPhạm Văn HưởngTrần Đăng Khoa
ưu tiên các phép toán tương tự C Thực hiện chuyển đổi kiểu đổ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 các bản đặc tả cú pháp
Trang 2OP2 *, /, % ‘*’, ‘/’, ‘%’ mul, div, mod REPOP ==, <, >, <=, >=, !
Trang 3letter : ‘a’| |’z’|’A’| |’Z’
*Sơ đồ chuyển tiếp nhận dạng chuỗi ký tự, từ khoá:
* Sơ đồ chuyển tiếp nhận dạng số nguyên, số thực:
Trang 4* Sơ đồ chuyển tiếp cho các phép toán:
1 3
Start
1 5
=
1 6
2 2
1 9
2 1
2 0
2 3
1 8
1 7
=other
4
=
return(relop,LE) return(relop,LT) return(relop,GE) return(relop,GT)
!
return(relop,NE)
2 4
other
return(NOT)
2 8
2 6
2 7
2 5
Trang 5* Sơ đồ chuyển cho các token khác
Start
3 0{
3 4
3 3
3 5
3 2
3 1}
)
;
return(BEGIN)
3 6
return(END) return(LPAR) return(RPAR) return(SEMI),
return(COMA)
3 7
return(COMM)
4 0
3 8
3 9
Trang 6 Giải thuật mô phỏng lược đồ dịch để nhận dạng token:
int state; // state: để theo dõi các trạng thái chuyển đổi trên đồ thị chuyển.
int start; // start: trạng thái bắt đầu.
int fail(start)// Hàm fail dùng để trả lại đầu vào của một đồ thị chuyển tiếp theo.
{
switch(start){
case 1: start = 4; break;
case 4: start = 13; break;
case 13: start = 29; break;
case 29: recover(); //gọi hàm xử lý lỗi khi chương trình nguồn có lỗi.
ch = nextchar(); //hàm nextchar(): đọc vào ký tự tiếp theo.
if(ch== '_' || isalpha(ch)) state=2; //hàm isalpha(ch): Kiểm tra ký tự đọc vào có phải là chữ cái hay không.
else state=fail(1);
break;
case 2:
ch = nextchar();
if(!(ch== '_'|| isalpha(ch)||isdigit(ch))) state=3;
//hàm isdigit(ch): Kiểm tra ký tự đọc vào có phải là chữ số hay không.
break;
case 3:
retract(1); //Hàm retract(): xử lý các trạng thái có đánh dấu *
install_id(); //Hàm install_id(): kiểm tra ký tự nhập vào là từ khoá hay là một tên biến.
t.type=gettoken(); //Hàm install_id: trả về từ tố là mã của một từ khoá nào đó hoặc chuỗi ký tự tên.
Trang 7else if(ch=='.') state=6;
else if(ch=='E'||ch=='e') state=8;
Trang 8t.value=install_num();exitflag=1;
Trang 11case',': state=35; break;case'/': state=36; break;case'*': state=37; break;default: state=fail(29);}
Trang 121 main → MAIN LPAR RPAR body
2 body → BEGIN ct END
Trang 1311.n_id → ID COMA n_id
12.n_id → array LCRO NUMINT RCRO SEMI
13 n_id → ID
14.pbghep → BEGIN lenh END
15.if → IF LPAR bieu_thuc RPAR body_ if16.body_if → BEGIN lenh_ if END
36.factor → LPAR exp RPAR
37.factor → OP1 factor
Trang 15D FIRST của các ký hiệu không kết thúc
1 FIRST(main) = {MAIN}
2 FIRST(body) = {BEGIN}
3 FIRST(ct) = {TYPE, ID, BEGIN, IF, ε}
4 FIRST(lenh) = {ID, BEGIN}
10.FIRST(lenh_if) = {TYPE, ID, BEGIN, IF }
11.FIRST(bieu_thuc) = {NOT, LPAR, ID, NUMINT, NUMFLOAT, OP1}
12.FIRST(bt1) = {NOT, LPAR}
13.FIRST(bt2) = { ID, NUMINT, NUMFLOAT, LPAR, OP1}
14.FIRST(bt3) = {LPAR}
15.FIRST(bt4) = { ID, NUMINT, NUMFLOAT, LPAR, OP1}
16.FIRST(exp) = {ID, NUMINT, NUMFLOAT, LPAR, OP1}
17.FIRST(term) = {ID, NUMINT, NUMFLOAT, LPAR, OP1}
18.FIRST(factor) = {ID, NUMINT, NUMFLOAT, LPAR, OP1}
14.FOLLOW(bt3) = {AND, OR, RPAR, $}
15.FOLLOW(bt4) = {RPAR, RELOP, $}
16.FOLLOW(exp) = {OP1, RPAR, RELOP, SEMI, $}
17.FOLLOW(term) = {OP1, OP2, RPAR, RELOP,SEMI, $}
18.FOLLOW(factor) = {OP1, OP2, RPAR, RELOP, SEMI, $}
Trang 16F Tính tuyển
I0:
S → mainmain → MAIN LPAR RPAR body
I7 = goto(I6, ct)
body → BEGIN ct END
Trang 17I8 = goto(I6, var) = goto(I10, var) = goto(I17, var) = goto(I18, var) =
goto(I60, var) = goto(I70, var) = goto(I71, var)
ct → var SEMI ct
ct → var SEMI
I9 = goto(I6, lenh) = goto(I10, lenh) = goto(I17, lenh) = goto(I18, lenh) = goto(I60, lenh) = goto(I70, lenh) = goto(I71, lenh)
ct → lenh SEMI ct
I11 = goto(I6, TYPE) = goto(I10, TYPE) = goto(I17, TYPE) = goto(I18, TYPE) = goto(I60, TYPE) = goto(I70, TYPE) = goto(I71, TYPE)
var → TYPE n_idn_id → ID COMA n_idn_id → ID
I13 = goto(I6, body) = goto(I10, body) = goto(I17, body) = goto(I18, body)
= goto(I60, body) = goto(I70, body) = goto(I71, body)
Trang 18body → BEGIN ct END.
if → IF LPAR bieu_thuc RPAR body_ if
if → IF LPAR bieu_thuc RPAR body_ if
I21 = goto(I11, ID) = goto(I26, ID)
n_id → ID COMA n_idn_id → ID
Trang 19
I22 = goto(I14, ASG)
pbghep → BEGIN lenh END
exp → exp OP1 term
factor → LPAR exp RPAR
factor → OP1 factor
factor → LPAR exp RPAR
factor → OP1 factor
Trang 20I26 = goto(I21, COMA)
n_id → ID COMA n_idn_id → ID COMA n_idn_id → ID
I27 = goto(I22, exp)
pbgan → ID ASG exp
exp → exp OP1 term
I28 = goto(I22, term) = goto(I23, term) = goto(I33, term) = goto(I40, term) = goto(I52, term) = goto(I55, term)
I30 = goto(I22, ID) = goto(I23, ID) = goto(I33, ID) = goto(I34, ID) =
goto(I40, ID) = goto(I44, ID) = goto(I45, ID) = goto(I52, ID) = goto(I55, ID)
factor → ID
I31 = goto(I22, NUMINT) = goto(I23, NUMINT) = goto(I33, NUMINT) = goto(I34, NUMINT) = goto(I40, NUMINT) = goto(I44, NUMINT) = goto(I45, NUMINT) = goto(I52, NUMINT) = goto(I55, NUMINT)
factor → NUMINT
I32 = goto(I22, NUMFLOAT) = goto(I23, NUMFLOAT) = goto(I33,
NUMFLOAT) = goto(I34, NUMFLOAT) = goto(I40, NUMFLOAT) = goto(I44, NUMFLOAT) = goto(I45, NUMFLOAT) = goto(I52, NUMFLOAT) = goto(I55, NUMFLOAT)
factor → NUMFLOAT
I33 = goto(I22, LPAR) = goto(I33, LPAR) = goto(I34, LPAR) = goto(I40, LPAR) = goto(I44, LPAR) = goto(I45, LPAR) = goto(I52, LPAR) = goto(I55, LPAR)
factor → LPAR exp RPARexp → exp OP1 term
exp → termterm → term OP2 factor
Trang 21term → factorfactor → IDfactor → NUMINTfactor → NUMFLOATfactor → LPAR exp RPARfactor → OP1 factor
I34 = goto(I22, OP1) = goto(I23, OP1) = goto(I33, OP1) = goto(I34, OP1) = goto(I40, OP1) = goto(I44, OP1) = goto(I45, OP1) = goto(I52, OP1) = goto(I55, OP1)
factor → OP1 factorfactor → ID
factor → NUMINTfactor → NUMFLOATfactor → LPAR exp RPARfactor → OP1 factor
Trang 22exp → exp OP1 termexp → term
term → term OP2 factorterm → factor
factor → IDfactor → NUMINTfactor → NUMFLOATfactor → LPAR exp RPARfactor → OP1 factor
I41 = goto(I23, bt4)
bt2 → bt4
bt4 → bt4 RELOP exp
I42 = goto(I23, exp) = goto(I52, exp)
factor → IDfactor → NUMINTfactor → NUMFLOATfactor → LPAR exp RPARfactor → OP1 factor
I45 = goto(I28, OP2) = goto(I56, OP2)
term → term OP2 factorfactor → ID
factor → NUMINTfactor → NUMFLOATfactor → LPAR exp RPARfactor → OP1 factor
I46 = goto(I33, exp)
Trang 23factor → LPAR exp RPAR
exp → exp OP1 term
if → IF LPAR bieu_thuc RPAR body_ if
body_ if→ BEGIN lenh_ if END
factor → LPAR exp RPAR
factor → OP1 factor
Trang 24factor → LPAR exp RPAR
factor → OP1 factor
I56 = goto(I44, term)
exp → exp OP1 term
term → term OP2 factor
I57 = goto(I45, factor)
term → term OP2 factor
I58 = goto(I46, RPAR) = goto(I54, RPAR)
factor → LPAR exp RPAR
Trang 25body → BEGIN ct END
if → IF LPAR bieu_thuc RPAR body_ if
exp → exp OP1 term
I65 = goto(I60, lenh_ if)
body_ if → BEGIN lenh_ if END
I66 = goto(I60, ct) = goto(I70, ct) = goto(I71, ct)
if → IF LPAR bieu_thuc RPAR body_ if
I71 = goto(I68, SEMI)
ct → var SEMI ct
ct → var SEMI
Trang 26pbghep → BEGIN lenh END
body → BEGIN ct END
if → IF LPAR bieu_thuc RPAR body_ if
I72 = goto(I70, lenh_ ì)
TÀI LIỆU THAM KHẢO
1 Bài giảng Chương trình dịch – Phan Thị Thu Hồng
2 Tài liệu trực tuyến