TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI KHOA: CÔNG NGHỆ THÔNG TIN Bài Tập Lớn: Chương Trình Dịch Đề Số 8 Giáo Viên Hướng Dẫn: Nhóm Sinh Viên Thực Hiện: Phan Thị Chương Bùi Thành Nam Nguyễn Hồng Linh Nguyễn Thị Xuân Mai Hà Nôi, Tháng 12 năm 2012 Đề Tài 8: Viết trình biên dịch dể dịch 1 doạn chuong trình gồm các phát biểu sau: - Phát biểu gán, for 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). Ðộ uu tiên các phép toán tuong tự Pascal. - Thực hiện chuyển dổi kiểu từ nguyên sang thực khi cần thiết. Thực Hiện I. Phân Tích Từ Vựng Token Lexeme Match Attribute ID a1,d_e3c,ba2, (letter|’_’)(letter|digit|’_’)* vtrí BDB ASG := ‘:=’ SEMI ; ‘;’ COLON : ‘:’ COMA , ‘,’ DOTDOT ‘ ’ 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’) FOR for,For, fOr,… (‘f’|’F’)(‘o’|’O’)(‘r’|’R’) DO Do,do, , (‘d’|’D’)(‘o’|’O’) TO to,tO,… (‘t’|’T’) (‘o’|’O’) AND and,And,… (‘a’|’A’) (‘n’|’N’) (‘d’|’D’) OR or,Or,… (‘o’|’O’) (‘r’|’R’) OF of, Of, … (‘o’|’O’) (‘f’|’F’) 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)* vtrí BDB NUMREA L 1.2, 2E-3 ,0.5e+4 digit + .digit + | digit + (.digit + |∈)(‘e’|’E’) (‘+’|’- ‘|∈)digit + vtrí BDB OP1 +,- ‘+’, ‘-‘ plus,minus OP2 *,/ ‘*’,’/’ multiplication ,division RELOP =, <, >, <=, >=, <> ‘=’, ’<’, ’>’, ’<=’, ’>=’, ’<>’ EQ, LT, GT, LE,GE,NE LƯỢC ĐỒ DỊCH LƯỢC ĐỒ DỊCH • • Sơ đồ dịch nhận dạng token relop: Sơ đồ dịch nhận dạng token relop: • • Sơ đồ dịch của id và từ khóa: Sơ đồ dịch của id và từ khóa: * * Start 1 7 1 9 9 1 8 return(relop, LE) 2 0 9 2 1 9 return(relop, NE) return(relop, LT) 2 2 2 3 2 4 9 2 5 9 return(relop, EQ) return(relop, EG) return(relop, GT) < = > other = => other Start letter | digit |‘_’ letter | ‘_’ return(id, lookup(id)) other 2 6 2 7 28 * • • Sơ đồ dịch nhận dạng hằng số: Sơ đồ dịch nhận dạng hằng số: II. Phân Tích Cú Pháp A. Văn phạm gia tố: S -> program Program -> kbao body DOT // var begin lenh end. Kbao -> Var n_kbao N_kbao -> kbkieu SEMI n_kbao // a:integer; b:real; Kbkieu -> n_ID COLON TYPE SEMI //a:integer; N_ID -> ID | ID COMA n_ID // a|a,b (truong hop nhieu bien co cung kieu) Body -> BEGIN n_lenh END N_lenh -> lenh SEMI n_lenh | lenh SEMI // nhieu lenh|mot lenh Lenh -> l_gan Lenh -> body Lenh -> l_for_do L_gan -> ID ASSGN exp SEMI //a:=0; L_for_do -> for l_gan to ID do r_body 3 1 3 6 7 ‘.’ other return(numreal,vtrí bdb) digit digit ‘+’|’- ‘ 3 4 3 5 digit ‘E’ |’e’ 3 2 3 3 digit return(numreal,vtrí bdb) digit other 3 8 8 other * * ‘E’ |’e’ Sta rt digit 3 0 digit 2 9 3 7 8 other return(num,vtrí bdb) return(num,vtrí )bdb) 3 9 8 R_body -> n_lenh Exp -> exp OP1 term |exp OP2 term |term Term -> factor Factor -> ID Factor -> NUM Factor -> NUMREAL Factor -> LPAR exp RPAR //a:=a * (c-d); Factor -> OP1 factor // a:= - b; B. Ký hiệu kết thúc: 1) VAR 2) COLON 3) TYPE 4) SEMI //( ; ) 5) ID 6) COMMA //(,) 7) BEGIN 8) END 9) ASSGN //(:=) 10) FOR 11) TO 12) DO 13) AND 14) OR 15) NOT 16) OP1 17) OP2 18) NUM 29) NUMREAL 20) LPAR //( 21) RPAR //) 22) DOT 23) $ C. Ký hiệu không kết thúc: 1) Program 2) Kbao 3) Body 4) n_kbao 5) Kbkieu 6) n_ID 7) n_lenh 8) lenh 9) n_gan 10) l_for_do 11) r_body 12) exp 13) term 14) factor D. FIRST của những kí hiệu chưa kết thúc: 1) FIRST(program) = FIRST(kbao) = {VAR} 3) FIRST(n_kbao)=FIRST(kbkieu) = FIRST(n_ID)={ ID} 4) FIRST (body) = {BEGIN, DOT} 5) FIRST (n_lenh)=FIRST (lenh) = {ID, BEGIN, FOR} 6) FIRST (l_gan) = {ID} 7) FIRST (l_for_do) = {FOR} 8) FIRST (exp)=FIRST(term)=FIRST(factor)= {D,NUM, NUMREAL, LPAR, OP1} E. FOLLOW của những kí hiệu chưa kết thúc 1) FOLLOW (program) = FOLLOW (kbao) = FOLLOW (n_kbao) = FOLLOW (r_body) = {$} 2) FOLLOW (body) = {$, END, SEMI} 3) FOLLOW(kbkieu) = {$, SEMI} 4) FOLLOW (n_ID) = {$, COLON} 5) FOLLOW (n_lenh) = {$, END} 6) FOLLOW (lenh) = {$, SEMI} 7) FOLLOW (l_gan) = {$, SEMI, TO} 8) FOLLOW (l_for_do) = {$, SEMI} 9) FOLLOW (exp) = FOLLOW (term) = FOLLOW (factor) = { $, SEMI, OP1, OP2, RPAR} E. Tính Tập Tuyển I 0 : S → .program program → .kbao body DOT kbao → .var n_kbao I 1 = goto(I 0 , program): S → program. I 2 = goto(I 0 , kbao): program → kbao .body DOT body → .BEGIN n_lenh END I 3 = goto(I 0 , var): kbao → var .n_kbao n_kbao → .kbkieu SEMI n_kbao kbaokieu → .n_ID COLON TYPE SEMI n_ ID → .ID n_ID → .ID COMA n_ID I 4 = goto(I 2 , body): program → kbao body .DOT I 5 = goto(I 2 , BEGIN) = goto(I 5, BEGIN) = goto(I 22, BEGIN) = goto(I 49 , BEGIN): body → BEGIN .n_lenh END n_lenh → .lenh SEMI n_lenh n_lenh → . lenh SEMI lenh → .l_gan lenh → .body lenh → .l_for_do l_gan → .ID ASSGN exp SEMI body → .BEGIN n_lenh END l_for_do → .for l_gan to ID do r_body I 6 = goto(I 3 , n_kbao) Kbao → var n_kbao. I 7 = goto(I 3 , kbkieu) = goto(I 18 , kbkieu) N_kbao → kbkieu .SEMI n_kbao I 8 = goto(I 3 , n_ID) = goto(I 3 , n_ID) Kbkieu → n_ID .COLON TYPE SEMI I 9 = goto(I 3 , ID) = goto(I 18 , ID) = goto(I 20 , ID) N_ID → ID. N_ID → ID .COMA n_ID I 10 = goto(I 4 , DOT) program → kbao body DOT. I 11 = goto(I 5 , n_lenh) body → BEGIN n_lenh .END I 12 = goto(I 5 , lenh) = goto(I 22 , lenh) = goto(I 49 , lenh) N_lenh → lenh .SEMI n_lenh N_lenh → lenh .SEMI I 13 = goto(I 5 , l_gan) = goto(I 22 , l_gan) = goto(I 49 , l_gan) lenh → l_gan. I 14 = goto(I 5 , body) = goto(I 22 , body) = goto(I 49 , body) lenh → body. I 15 = goto(I 5 , l_for_do) = goto(I 22 , l_for_do) = goto(I 49 , l_for_do): lenh → l_for_do. I 16 = goto(I 5 , ID) = goto(I 21 , ID) = goto(I 17 , ID) = goto(I 49 , ID) L_gan → ID .ASSGN exp SEMI I 17 = goto(I 5, FOR) = goto(I 22, FOR) = goto(I 49 , FOR): l_for_do → for .l_gan to ID do r_body l_gan → .ID ASSGN exp SEMI I 18 = goto(I 7, SEMI) N_kbao → kbkieu SEMI .n_kbao n_kbao → .kbkieu SEMI n_kbao kbaokieu → .n_ID COLON TYPE SEMI n_ ID → .ID n_ID → .ID COMA n_ID I 19 = goto(I 6 , COLON) Kbkieu → n_ID COLON. TYPE SEMI I 20 = goto(I 9 , COMA) N_ID → ID COMA .n_ID n_ ID → .ID n_ID → .ID COMA n_ID I 21 = goto(I 11 , END) body → BEGIN n_lenh END. I 22 = goto(I 12 , SEMI) N_lenh → lenh SEMI .n_lenh N_lenh → lenh SEMI. n_lenh → .lenh SEMI n_lenh n_lenh → . lenh SEMI lenh → .l_gan lenh → .body lenh → .l_for_do l_gan → .ID ASSGN exp SEMI body → .BEGIN n_lenh END l_for_do → .for l_gan to ID do r_body I 23 = goto(I 16 , ASSGN) L_gan → ID ASSGN .exp SEMI exp → .exp OP1 term exp → .term exp → .exp OP2 term term → .factor factor → .ID factor → .NUM factor → .NUMREAL factor → .LPAR exp RPAR factor → .OP1 factor I 24 = goto(I 18 , n_kbao) N_kbao → kbkieu SEMI n_kbao. I 25 = goto(I 19 , TYPE) Kbkieu → n_ID COLON TYPE .SEMI I 26 = goto(I 20 , n_ID) : N_ID → ID COMA n_ID. I 27 = goto(I 22 , n_lenh): N_lenh → lenh SEMI n_lenh. I 28 = goto(I 23 , exp): L_gan → ID ASSGN exp. SEMI exp → exp .OP1 term exp → exp .OP2 term I 29 = goto(I 23 , term) = goto(I 34 , term) exp → term. I 30 = goto(I 23 , factor) = goto(I 34 , factor) = goto(I 38 , factor) = goto(I 39 , factor) term → factor. I 31 = goto(I 23 , ID) = goto(I 34 , ID) = goto(I 35 , ID) = goto(I 38 , ID) = goto(I 39 , ID) factor → ID. I 32 = goto(I 23 , NUM) = goto(I 34 , NUM) = goto(I 38 , NUM) = goto(I 39 , NUM) = goto(I 35 , NUM) factor → NUM. I 33 = goto(I 23 , NURREAL) = goto(I 34 , NURREAL) = goto(I 35 , NURREAL) = goto(I 38 , NURREAL) = goto(I 39 , NURREAL) factor → NUMREAL. I 34 = goto(I 23 , LPAR) = goto(I 34 , LPAR) = goto(I 35 , LPAR) = goto(I 38 , LPAR) = goto(I 39 , LPAR): factor → LPAR .exp RPAR exp → .exp OP1 term exp → .term exp → .exp OP2 term term → .factor factor → .ID factor → .NUM factor → .NUMREAL factor → .LPAR exp RPAR factor → .OP1 factor I 35 = goto(I 23 , OP1) = goto(I 34 , OP1) = goto(I 35 , OP1) = goto(I 38 , OP1) = goto(I 39 , OP1) factor → OP1 .factor factor → .ID factor → .NUM factor → .NUMREAL factor → .LPAR exp RPAR factor → .OP1 factor I 36 = goto(I 25 , SEMI) Kbkieu → n_ID COLON TYPE SEMI. I 37 = goto(I 28 , SEMI) L_gan → ID ASSGN exp SEMI. I 38 = goto(I 28 , OP1) = goto(I 45 , OP1) exp → exp OP1 .term term → .factor factor → .ID factor → .NUM factor → .NUMREAL factor → .LPAR exp RPAR factor → .OP1 factor I 39 = goto(I 28 , OP2) = goto(I 45 , OP2) exp → exp OP2 .term term → .factor factor → .ID factor → .NUM factor → .NUMREAL factor → .LPAR exp RPAR factor → .OP1 factor I 40 = goto(I 34 , exp) factor → LPAR exp .RPAR exp → .exp OP1 term [...]... OP1 factor I42 = goto(I 38, term) exp → exp OP1 term I43 = goto(I39, term) factor → OP2 factor I44 = goto(I40, RPAR) factor → LPAR exp RPAR I45 = goto(I40,exp) exp → exp OP1 term exp → exp OP2 term I46 = goto(I17,l_gan) l_for_do → for l_gan to ID do r_body I47 = goto(I46,to) l_for_do → for l_gan to ID do r_body I 48 = goto(I47,ID) l_for_do → for l_gan to ID do r_body I49 = goto(I 48, do) l_for_do → for l_gan . TIN Bài Tập Lớn: Chương Trình Dịch Đề Số 8 Giáo Viên Hướng Dẫn: Nhóm Sinh Viên Thực Hiện: Phan Thị Chương Bùi Thành Nam Nguyễn Hồng Linh Nguyễn Thị Xuân Mai Hà Nôi, Tháng 12 năm 2012 Đề Tài 8: Viết. GT, LE,GE,NE LƯỢC ĐỒ DỊCH LƯỢC ĐỒ DỊCH • • Sơ đồ dịch nhận dạng token relop: Sơ đồ dịch nhận dạng token relop: • • Sơ đồ dịch của id và từ khóa: Sơ đồ dịch của id và từ khóa: * * Start 1 7 1 9 9 1 8 return(relop,. digit |‘_’ letter | ‘_’ return(id, lookup(id)) other 2 6 2 7 28 * • • Sơ đồ dịch nhận dạng hằng số: Sơ đồ dịch nhận dạng hằng số: II. Phân Tích Cú Pháp A. Văn phạm gia tố: S -> program Program