Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
291,5 KB
Nội dung
Báo cáo Chương trình dịch Nhóm 11: Đỗ Thị Ngọc Bích Vũ Văn Chí Phạm Văn Hưởng Trần Đăng Khoa Lớp: K52THC Đề 14: 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: Phát biểu ghép, if trong C Các phát biểu kết thúc bằng dấu ; Các biểu thức trong các phát biểu là các biểu thức số học và logic , gồm các phép toán +, - , *, /,(?, !, &&, || và các phép toán so sánh. Toán hạng gồm các danh hiệu, hằng số thực và nguyên (kể cả biểu thức), array. Độ ư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. 1 NỘI DUNG I. Phân tích từ vựng Bảng Token Token Lexeme Match Attribute ID a1,d_e3c,ba2, (letter|’_’)(letter| digit|’_’)* NUMINT -2,1,33,10,490,… digit(digit)* NUMFLOAT -1.9, -0.5, 1.2, 2E- 3 ,0.5e+4 digit + .digit + | digit + (.digit + |∈)(‘e’|’E’) (‘+’|’- ‘|∈)digit + MAIN main ‘main’ BEGIN { ‘{’ END } ‘}’ TYPE char, short, int, float, double, ‘char’, ‘short’, ‘int’, ‘float’, ‘double’, Char, short, integer, float, double, IF if ‘if’ THEN Then ‘then’ ELSE Else ‘else’ LPAR ( ‘(‘ RPAR ) ‘)’ SEMI ; ‘;’ COMA , ‘,’ NOT ! ‘!’ AND && ‘&&’ OR || ‘||’ OP1 +, - ‘+’, ‘-’ plus, minus OP2 *, /, % ‘*’, ‘/’, ‘%’ mul, div, mod REPOP ==, <, >, <=, >=, ! = ‘==’, ’<’, ’>’, ’<=’, ’>=’, ’!=’ EQ, LT, GT, LE, GE, NE COMM // ‘//’ OCOMM /* ‘/*’ CCOMM */ ‘*/’ ARRAY Array ‘array’ NEW New ‘new’ RCRO ] ‘]’ LCRO [ ‘[‘ 2 letter : ‘a’| |’z’|’A’| |’Z’ digit : ‘0’| |’9’ delim: blank | tab ws : delim + endline : newline ĐỒ THỊ CHUYỂN *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: 3 * 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 = < > other = return(relop,EQ) 1 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 & | & | return(AND) return(OR) 4 * 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 / * * / return(OCOMM) return(CCOMM) 2 9 7 / ( 5 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. default: //xử lý lỗi chương trình dịch. } return start; } *Giải thuật: int exitflag = 0; do{ switch(state){ case 0: //trạng thái lỗi t.type=ERROR; return(t); case 1: 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. 6 exitflag=1; return t; break; case 4: ch=nextchar(); if(isdigit(ch)) state=5; else state=fail(4); break; case 5: ch=nextchar(); if(isdigit(ch)) state=5; else if(ch=='.') state=6; else if(ch=='E'||ch=='e') state=8; else state=10; break; case 6: ch=nextchar(); if(isdigit(ch)) state=7; else state=fail(4); break; case 7: ch=nextchar(); if(isdigit(ch)) state=7; else if(ch=='E'||ch=='e') state=8; else state=11; break; case 8: ch=nextchar(); if(ch=='+'||ch=='-') state=9; else if(isdigit(ch)) state=12; else state=fail(4); break; case 9: ch=nextchar(); if(isdigit(ch)) state=12; else state=fail(4); break; case 10: retract(1); t.type=NUMINT; 7 t.value=install_num(); exitflag=1; return t; break; case 11: retract(1); t.type=NUMFLOAT; t.value=install_num(); exitflag=1; return t; break; case 12: ch=nextchar(); if(!(isdigit(ch))) state=11; else state=fail(4); break; case 13: ch=nextchar(); switch(ch){ case'=': state=14; break; case'<': state=16; break; case'>': state=19; break; case'!': state=22; break; case'&': state=25; break; case'|': state=27; break; default: state=fail(13); } break; case 14: ch=nextchar(); if(ch=='=') state=15; else state=fail(13); break; case 14: retract(2); t.type=RELOP; t.value=EQ; 8 exitflag=1; return t; case16: ch=nextchar(); if(ch=='=') state=17; else state=18; break; case 17: retract(2); t.type=RELOP; t.value=LE; exitflag=1; return t; case 18: retract(1); t.type=RELOP; t.value=LT; exitflag=1; return t; case 19: ch=nextchar(); if(ch=='=') state=20; else state=21; break; case 20: retract(2); t.type=RELOP; t.value=GE; exitflag=1; return t; case 21: retract(1); t.type=RELOP; t.value=GT; exitflag=1; return t; case 22: ch=nextchar(); if(ch=='=') state=23; else state=24; 9 break; case 23: retract(2); t.type=RELOP; t.value=NE; exitflag=1; return t; case 24: retract(1); t.type=NOT; exitflag=1; return t; case 25: ch=nextchar(); if(ch=='&') state=26; else state=fail(13); break; case 26: retract(2); t.type=AND; exitflag=1; return t; case 27: ch=nextchar(); if(ch=='|') state=28; else state=fail(13); break; case 28: retract(2); t.type=OR; exitflag=1; return t; case 29: ch=nextchar(); switch(ch){ case'{': state=30; break; case'}': state=31; break; case'(': state=32; break; case')': state=33; break; case';': state=34; break; 10 [...]... var → TYPE n_id lenh → pbghep lenh → body pbghep → 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 26 . Báo cáo Chương trình dịch Nhóm 11: Đỗ Thị Ngọc Bích Vũ Văn Chí Phạm Văn Hưởng Trần Đăng Khoa Lớp: K52THC Đề 14: Viết trình biên dịch để dịch 1 đoạn chương trình gồm các phát. start = 29; break; case 29: recover(); //gọi hàm xử lý lỗi khi chương trình nguồn có lỗi. default: //xử lý lỗi chương trình dịch. } return start; } *Giải thuật: int exitflag = 0; do{ switch(state){ case. 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ử