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
Trang 2I.PHÂN TÍCH TỪ VỰNG1 Bảng Token
VAR Var, var , (‘v’|’V’)(‘a’|’A’)(‘r’|’R’)
END End,end, eNd, (‘e’|’E’)(‘n’|’N’)(‘d’|’D’)
Trang 3TYPE 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’)
letter → A | B | … | Z | a | b | … | zdigit → 0 | 1 | 2 | … | 9
id → letter (letter | digit)*
b NUM
digit → 0 | 1 | 2 | … | 9digits → 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
+ 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 =, <, >, <=, >=, <>
Trang 4letter | ‘_’
return(id, lookup(id))other
-return(OP1, minus)return(OP1, plus)
return(OP2, multiplication)return(OP2, division)*
/
Trang 52.5 Sơ đồ dịch nhận dạng token các toán tử quan hệ relop:
0 < 1 = 2 return(relop, LE)3
return(relop, NE)other
4 return(relop, LT)5
return(relop, GT)return(relop, EG)return(relop, EQ)
*
Trang 6II PHÂN TÍCH CÚ PHÁP1 Văn phạm gia tố
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 IDRELOP 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 |term17) term -> factor
18) factor -> ID19) factor -> NUM
20) factor -> NUMREAL
21) factor -> LPARA exp RPARA //a:=a * (c-d);22) factor -> OP1 factor // a:= - b;
Trang 72.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) Program2) Kbao3) Body4) n_kbao5) Kbk6) n_ID7) n_lenh8) lenh9) l_gan
Trang 810) l_if_then_else11) r_IF
12) r_body13) exp14) term15) factor16) exp117) 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)= ID4) 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)
Trang 9n_kbao -> kbk SEMI n_kbao
kbk -> n_ID CONON TYPE SEMI n_ID -> ID
n_ID -> ID COMA n_ID Body -> BEGIN n_lenh ENDn_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_bodyr_IF -> LPAR ID RELOP NUM RPAR
r_IF -> LPAR ID RELOP NUMREAL RPAR
r_IF -> LPAR ID OP1 ID RELOP NUM RPARr_IF -> LPAR ID OP2 ID RELOP NUM RPARr_IF ->.LPAR ID OP1 ID RELOP NUMREAL RPAR
r_IF -> LPAR ID OP2 ID RELOP NUMREAL RPAR RPAR
r_body -> n_lenhexp -> exp OP1 term exp -> exp OP2 term term -> factor
factor -> IDfactor -> NUM
factor -> NUMREAL
factor -> LPARA exp RPARA factor -> OP1 factor
exp ->.term
Trang 10I1 = goto(I0,S): S’->S.
I2 = goto(I0,program): S -> program.
I3 = goto(I0,kbao):
Program -> kbao body DOT body ->.BEGIN n_lenh END
I4 = goto(I0,VAR):
Kbao ->VAR n_kbao
n_kbao ->.kbk SEMI n_kbao
Kbk -> n_ID CONON TYPE SEMIn_ID -> ID
n_ID -> ID COMA n_ID
n_ID -> ID COMA n_ID
l_gan -> ID ASSGN exp SEMIFactor -> ID.
I8= goto (I0, BEGIN)
body -> BEGIN n_lenh ENDn_lenh -> lenh SEMI n_lenhn_lenh -> Ɛ
lenh -> l_ganlenh -> body
Trang 11lenh ->.l_if_then_else
l_gan -> ID ASSGN exp SEMI
l_if_then_else -> IF r_IF THEN r_body ELSE r_bodybody ->.BEGIN n_lenh END
I9 = goto (I0,lenh)
n_lenh -> lenh SEMI n_lenh
I10 = goto (I0, Ɛ)n_lenh -> Ɛ.
I11 = goto (I0,l_gan)lenh ->l_gan.I12 = goto (I0, body)
lenh -> body.
I13 = goto (I0,l_if_then_else)lenh -> l_if_then_else.
I14 = goto (I0, IF)
l_if_then_else -> IF r_IF THEN r_body ELSE r_bodyr_IF -> LPAR ID RELOP NUM RPAR
r_IF -> LPAR ID RELOP NUMREAL RPAR
r_IF -> LPAR ID OP1 ID RELOP NUM RPARr_IF -> LPAR ID OP2 ID RELOP NUM RPARr_IF ->.LPAR ID OP1 ID RELOP NUMREAL RPAR
r_IF -> LPAR ID OP2 ID RELOP NUMREAL RPAR RPAR
I15 = goto (I0, LPAR)
r_IF -> LPAR ID RELOP NUM RPAR
r_IF -> LPAR ID RELOP NUMREAL RPAR
r_IF -> LPAR ID OP1 ID RELOP NUM RPARr_IF -> LPAR ID OP2 ID RELOP NUM RPARr_IF ->.LPAR ID OP1 ID RELOP NUMREAL RPAR
r_IF -> LPAR ID OP2 ID RELOP NUMREAL RPAR RPAR
Trang 12factor -> LPAR exp RPARexp -> exp OP1 term
exp -> exp OP2 term exp ->.term
term -> factor
factor -> IDfactor -> NUM
factor -> NUMREAL
factor -> LPARA exp RPARA factor -> OP1 factor
I16 = goto (I0, n_lenh)r_body -> n_lenh.
I17 = goto (I0, exp)
exp ->exp OP1 termexp -> exp OP2 term
I18 =goto (I0, term)exp ->term.
I19 = goto (I0, factor)term -> factor.
I20 = goto (I0, NUM)factor -> NUM.
I21 = goto (I0, NUMREAL)factor -> NUMREAL.
I22 = goto (I0, OP1)
factor -> OP1.factor factor -> ID
factor -> NUM
Trang 13lenh -> l_ganlenh -> body
lenh ->.l_if_then_else
l_gan -> ID ASSGN exp SEMI
l_if_then_else -> IF r_IF THEN r_body ELSE r_bodyBody ->.BEGIN n_lenh END
n_ID -> ID COMA n_ID
I29 = goto (I5, SEMI)
n_kbao -> kbk SEMI n_kbao
Trang 15factor -> LPAR exp RPAR
exp -> exp OP1 term exp -> exp OP2 term exp ->.term
term -> factor
factor -> IDfactor -> NUM