Bài tập lớn Chương trình dịch – Đề số 6

16 382 0
Bài tập lớn Chương trình dịch – Đề số 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

BÀI TẬP LỚN MÔN CHƯƠNG TRÌNH DỊCH Sinh viên thực hiện : 1. Đỗ Thanh Mai 2. Đỗ Mỹ Hồng Nhung 3. Nguyễn Thị Thu Thủy 4. Bùi Thị Thu Ngân Nhóm : 2 Lớp : Tin học 52C GV hướng dẫn : Phan Thị Thu Hồng Đề tài 6: 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 gán, if then else trong Pascal • 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 so sánh. Các toán hạng gồm các danh hiệu, hằng số thực, nguyên, true, false (kể cả biểu thức). Độ ưu tiên các phép toán tương tự Pascal. • Thực hiện chuyển đổ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 bản đặc tả cú pháp I. I. PHÂN TÍCH TỪ VỰNG PHÂN TÍCH TỪ VỰNG 1. Bảng Token 1. Bảng Token Token Lexeme Match Attribute ID a1,d_e3c,ba2, (letter|’_’)(letter|digit|’_’)* ASG := ‘:=’ SEMI ; ‘;’ COLON : ‘:’ COMA , ‘,’ DOT . ‘.’ PROGRAM PROGRAM, Program… (‘p’|’P’)(‘r’|’R’)(‘o’|’O’) (‘g’|’G’) (‘r’|’R’)(‘ (‘a’|’A’) (‘m’|’M’) USES USES, uses VAR 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’) IF if, If, IF (‘i’|’I’)(‘f’|’F’) THEN then,Then, tHen,… (‘t’|’T’)(‘h’|’H’)(‘e’|’E’)(‘n’|’N’) ELSE else,Else, eLse, (‘e’|’E’)(‘l’|’L’)(‘s’|’S’)(‘e’|’E’) OP1 +,- ‘+’, ‘-‘ plus,minus OP2 *, / ‘*’,’/’ multiplicatio n,division RELOP =, <, >, <=, >=, <> ‘=’, ’<’, ’>’, ’<=’, ’>=’, ’<>’ EQ, LT, GT, LE,GE,NE LPAR ( ‘(‘ RPAR ) ‘)’ 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 NUM 1,33,10,490,… digit(digit)* NUMREAL 1.2, 2E-3 , 0.5e+4 digit + .digit + | digit + (.digit + |∈) (‘e’|’E’)(‘+’|’- ‘|∈)digit + Định nghĩa token a. ID letter → A | B | … | Z | a | b | … | z digit → 0 | 1 | 2 | … | 9 id → letter (letter | digit) * b. NUM digit → 0 | 1 | 2 | … | 9 digits → digit digit * optional_fraction → .digits | ε optional_exponent → ( E ( + | - | ε ) digits) | ε num → digits optional_fraction optional_exponent • Ghi chú: - 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): + Dấu ngoặc ( ) + Phép toán một ngôi: NOT. + Phép toán *, /, AND. + Phép toán +, -, OR + Phép toán so sánh =, <, >, <=, >=, <> 2. Lược đồ dịch 2.1 Sơ đồ dịch của id và từ khóa: 2.2 Sơ đồ nhận dạng OP1: 2.3 Sơ đồ nhận dạng OP2: 2.4 Sơ đồ dịch nhận dạng hằng số: Start letter | digit |‘_’ letter | ‘_’ return(id, lookup(id)) other 0 1 2 * Start 0 3 4 + - return(OP1, minus) return(OP1, plus) Start 0 3 4 return(OP2, multiplication) return(OP2, division) * / 2.5 Sơ đồ dịch nhận dạng token các toán tử quan hệ relop: Start 0 < 1 = 2 return(relop, LE) 3 > return(relop, NE) other 4 return(relop, LT) 5 = 7 = 8 other 6 > return(relop, GT) return(relop, EG) return(relop, EQ) * II. PHÂN TÍCH CÚ PHÁP 1. Văn phạm gia tố 1.1 Văn phạm gốc 1) S ->PROGRAM 2) PROGRAM -> kbao body DOT // var begin lenh end. 3) kbao -> Var n_kbao 4) n_kbao -> kbk SEMI n_kbao // a:integer; b:real; 5) kbk -> n_ID COLON TYPE SEMI //a:integer; 6) n_ID -> ID | ID COMA n_ID // a|a,b(truong hop nhieu bien co cung kieu) 7) Body -> BEGIN n_lenh END SEMI 8) n_lenh -> lenh SEMI n_lenh | Ɛ // Thuc hien 1 hoac nhieu lenh |khong co lenh nao 9) lenh -> l_gan 10) lenh -> body 11) lenh -> l_if_then_else 12) l_gan -> ID ASSGN exp SEMI //a:=0; 13) l_if_then_else -> IF r_IF THEN r_body ELSE r_body 14) r_IF ->LPAR ID RELOP NUM RPAR | LPAR ID RELOP NUMREAL RPAR | LPAR ID OP1 ID RELOP NUM RPAR | LPAR ID OP2 ID RELOP NUM RPAR | LPAR ID OP1 ID RELOP NUMREAL RPAR | LPAR ID OP2 ID RELOP NUMREAL RPAR RPAR // (a<=1) | (a<=0.1) | (a+b> 2) | (a*b> 2) | (a+b>=2.2) | (a*b> =2.2) 15) r_body -> n_lenh SEMI 16) exp -> exp OP1 term |exp OP2 term |term 17) term -> factor 18) factor -> ID 19) factor -> NUM 20) factor -> NUMREAL 21) factor -> LPARA exp RPARA //a:=a * (c-d); 22) factor -> OP1 factor // a:= - b; 2.Các ký hiệu kết thúc 1) VAR 2) COLON 3) TYPE 4) SEMI //( ; ) 5) ID 6) COMA //(,) 7) BEGIN 8) END 9) ASSGN //(:=) 10) IF 11)THEN 12)ELSE 13) AND 14) OR 15) NOT 16) RELOP 17) OP1 18) OP2 19) NUM 20) NUMREAL 21) LPAR //( 22) RPAR //) 28) $ 3.Các ký hiệu chưa kết thúc 1) Program 2) Kbao 3) Body 4) n_kbao 5) Kbk 6) n_ID 7) n_lenh 8) lenh 9) l_gan 10) l_if_then_else 11) r_IF 12) r_body 13) exp 14) term 15) factor 16) exp1 17) exp2 4.FIRST của những kí hiệu chưa kết thúc: 1) FIRST(program) = (VAR) 2) FIRST(kbao) = (VAR) 3) FIRST(n_kbao)=FIRST(kbkieu) = FIRST(n_ID)= ID 4) FIRST (body) = BEGIN 5) FIRST (n_lenh) =FIRST(l_if_then_else)= (ID, BEGIN,IF, Ɛ) 6) FIRST (l_gan) = (ID) 7) FIRST (l_if_then_else) = (IF) 8) FIRST (exp)=FIRST(term)=FIRST(factor)= (ID,NUM, NUMREAL, LPARA, OP1) 9) FIRST(r_IF) = (LPAR) 10) FIRST (lenh) = (ID, BEGIN,REPEAT) 11) FIRST (exp1)= (OP1,Ɛ) 12) FIRST (exp2)= (OP2,Ɛ) 5. Tính FOLLOW của những kí hiệu chưa kết thúc 1) FOLLOW (program) = FOLLOW (kbao)= FOLLOW (n_kbao)= ($) 2) FOLLOW (body) = (SEMI, END, DOT) 3) FOLLOW(kbk) = FOLLOW (lenh) = FOLLOW (l_gan)= FOLLOW (l_if_then_else)= FOLLOW (r_IF)=(SEMI) 4) FOLLOW (n_ID) = (COMAN) 5) FOLLOW (n_lenh)= ( END, SEMI) 6) FOLLOW (exp)= =(RPARA, SEMI) 7) FOLLOW(term) = FOLLOW(factor) = (LPAR, SEMI, OP1, OP2) 6. Tính action, goto I 0 : S’ ->.S S ->. program Program -> .kbao body DOT kbao -> .Var n_kbao n_kbao -> .kbk SEMI n_kbao kbk ->. n_ID CONON TYPE SEMI n_ID ->. ID n_ID ->. ID COMA n_ID Body ->. BEGIN n_lenh END n_lenh ->. lenh SEMI n_lenh | Ɛ lenh ->. l_gan lenh ->.body lenh ->. l_if_then_else l_gan ->. ID ASSGN exp SEMI l_if_then_else ->. IF r_IF THEN r_body ELSE r_body r_IF ->. LPAR ID RELOP NUM RPAR r_IF ->. LPAR ID RELOP NUMREAL RPAR r_IF ->. LPAR ID OP1 ID RELOP NUM RPAR r_IF ->. LPAR ID OP2 ID RELOP NUM RPAR r_IF ->.LPAR ID OP1 ID RELOP NUMREAL RPAR r_IF ->. LPAR ID OP2 ID RELOP NUMREAL RPAR RPAR r_body ->. n_lenh exp -> .exp OP1 term exp -> .exp OP2 term term ->. factor factor -> .ID factor -> .NUM factor ->. NUMREAL factor -> .LPARA exp RPARA factor -> .OP1 factor exp ->.term I 1 = goto(I 0 ,S): S’->S. I 2 = goto(I 0 ,program): S -> program. I 3 = goto(I 0 ,kbao): Program -> kbao. body DOT body ->.BEGIN n_lenh END I 4 = goto(I 0 ,VAR): Kbao ->VAR .n_kbao n_kbao ->.kbk SEMI n_kbao Kbk -> .n_ID CONON TYPE SEMI n_ID -> .ID n_ID ->. ID COMA n_ID I 5 =goto(I 0 , kbk) n_kbao ->kbk. SEMI n_kbao I 6 = goto (I 0 , n_ID) Kbk ->n_ID .COLON TYPE SEMI I 7 = goto (I 0 , ID) n_ID ->ID. n_ID -> ID. COMA n_ID l_gan -> ID. ASSGN exp SEMI Factor -> ID. I 8 = goto (I 0 , BEGIN) body -> BEGIN .n_lenh END n_lenh -> .lenh SEMI n_lenh n_lenh -> .Ɛ lenh -> .l_gan lenh -> .body [...]... factor factor -> ID factor -> NUM factor -> NUMREAL factor -> LPARA exp RPARA factor -> OP1 factor I62 = goto (I20, OP1)= I22 I63 = goto (I20, factor) =I 57 I64 = goto (I20, ID) = I54 I65 = goto (I20, NUM) = I20 I 66 = goto (I20, NUMREAL) = I21 I67 = goto (I20, LRAR) = I25 I68 = goto (I20, OP1) = I22 ... I 56= goto (I15, NUMREAL) = I21 I57 = goto (I15, factor) factor -> OP1 factor I58 = goto (I20, factor) = I57 I58 = goto (I20, ID) = I54 I59 = goto ( I20, NUM) = I20 I60 = goto (I20, NUMREAL) =I21 I61 = goto (I20, LPAR) factor -> LPAR exp RPAR exp -> exp OP1 term exp -> exp OP2 term exp ->.term term -> factor factor -> ID factor -> NUM factor -> NUMREAL factor -> LPARA exp RPARA factor -> OP1 factor I62... =goto (I8, l_gan) = I11 I 36 = goto (I8, body) = I12 I37 = goto (I8, l_if_then_else) =I13 I38 = goto (I8, ID) l_gan -> ID ASSGN exp SEMI I39 = goto (I8,IF) =I14 I40 = goto (I8, BEGIN) =I8 I41 =goto (I14, r_body) r_if_then_else -> IF r_IF THEN r_body ELSE r_body I42 = goto (I14, n_lenh) = I 16 I43 = goto (I14, lenh) = I17 I44 =goto (I14, Ɛ) = I10 I45 =goto (I14, l_gan) = I11 I 46 = goto (I14, body) = I12... r_IF THEN r_body ELSE r_body Body ->.BEGIN n_lenh END I25 = goto (I4, n_kbao) Kbao -> VAR n_kbao I 26 =goto (I4, kbk) n_kbao -> kbk SEMI n_kbao I27 =goto (I4, n_ID) Kbk -> n_ID COLON TYPE SEMI I28 =goto (I4, ID) n_ID -> ID n_ID -> ID COMA n_ID I29 = goto (I5, SEMI) n_kbao -> kbk SEMI n_kbao I30=goto (I6, COLON) Kbk ->n_ID COLON TYPE SEMI I31 = goto (I7, COMA) n_ID -> ID COMA n_ID I32 =goto (I8, n_lenh)... NUMREAL RPAR RPAR factor -> LPAR exp RPAR exp -> exp OP1 term exp -> exp OP2 term exp ->.term term -> factor factor -> ID factor -> NUM factor -> NUMREAL factor -> LPARA exp RPARA factor -> OP1 factor I 16 = goto (I0, n_lenh) r_body -> n_lenh I17 = goto (I0, exp) exp ->exp OP1 term exp -> exp OP2 term I18 =goto (I0, term) exp ->term I19 = goto (I0, factor) term -> factor I20 = goto (I0, NUM) factor -> . Thu Ngân Nhóm : 2 Lớp : Tin học 52C GV hướng dẫn : Phan Thị Thu Hồng Đề tài 6: 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 gán, if then else trong Pascal. factor I 62 = goto (I 20 , OP1)= I 22 I 63 = goto (I 20 , factor) =I 57 I 64 = goto (I 20 , ID) = I 54 I 65 = goto (I 20 , NUM) = I 20 I 66 = goto (I 20 , NUMREAL) = I 21 I 67 = goto. BÀI TẬP LỚN MÔN CHƯƠNG TRÌNH DỊCH Sinh viên thực hiện : 1. Đỗ Thanh Mai 2. Đỗ Mỹ Hồng Nhung 3. Nguyễn Thị

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

Từ khóa liên quan

Mục lục

  • I. PHÂN TÍCH TỪ VỰNG

  • 1. Bảng Token

    • Token

    • Asg

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan