Tải bản đầy đủ (.doc) (32 trang)

Báo cáo chương trình dịch 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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (178.64 KB, 32 trang )

Báo cáo Chương trình dịch
Nhóm 3:
Nguyễn Thị Ngọc Huyên
Hoàng Thị Hương
Nguyễn Thị Nga
Nguyễn Thị Phương Thảo
Lớp: K52THC
Đề 12:
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, while 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 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 định danh, hằng số thực và
nguyên (kể cả biểu thức). Độ ưu tiên các phép toán tương tự C. Các
phép toán kết hợp trái.
 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,
WHILE while ‘while’
BREAK break ‘break’
CONTINUE continue ‘continue’
LPAR ( ‘(‘
RPAR ) ‘)’
ASG =, +=, -=, *=, /=,
%=
‘=’, ‘+=’, ‘-=’, ‘*=’,
‘/=’, ‘%=’

asg, pasg, masg,
mulasg, divasg,
modasg
SEMI ; ‘;’
COMA , ‘,’
NOT ! ‘!’
AND && ‘&&’
OR || ‘||’
INCRE ++ ‘++’ PP
REDUCT ‘ ’ MM
OP1 +, - ‘+’, ‘-’ plus, minus
OP2 *, /, % ‘*’, ‘/’, ‘%’ mul, div, mod
REPOP ==, <, >, <=, >=, !
=
‘==’, ’<’, ’>’, ’<=’,
’>=’, ’!=’
EQ, LT, GT, LE, GE,
NE
COMM
// ‘//’
OCOMM
/* ‘/*’
CCOMM
*/ ‘*/’
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 nhận dạng phép gán:
1
3
Start
1
4
=
1
5
2
9
2
3
2
6
1
9
2
0
1
8
2
1
1
7

1
6
=
+
other
=
_
+
_
2
2
0
3
0
2
4
3
1
2
8
2
5
2
7
other
*
=
=
=
/

%
other
other
other
return(ASG,asg)
return(ASG,pasg)
return(ASG,masg)
return(ASG,mulasg)
return(ASG,divasg)
return(ASG,modasg)
return(INCRE,PP)
return(REDUCT,MM)
return(OP1,plus)
return(OP1,minus)
return(OP2,mul)
return(OP2,div)
return(OP2,mod)
*
*
*
*
*
4
* Sơ đồ chuyển tiếp cho các phép toán
3
2
Start
3
4
3

=
3
5
4
1
3
8
4
0
3
9
4
2
3
7
3
6
=
other
=
<
>
other
=
return(RELOP,EQ)
3
3
7
=
return(RELOP,LE)

return(RELOP,LT)
return(RELOP,GE)
return(RELOP,GT)
!
return(RELOP,NE)
4
3
other
return(NOT)
4
7
4
5
4
6
4
4
&
|
&
|
return(AND)
return(OR)
*
*
*
5
* Sơ đồ chuyển cho các token khác
 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 = 32; break;
case 32: start = 48; break;
case 48: 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;
}
Start
4
9
3
{
5
3
5
2
5
4
5
1
5
0
}

)
;
return(BEGIN)
5
5
7
return(END)
return(LPAR)
return(RPAR)
return(SEMI)
,
return(COMA)
5
6
return(COMM)
5
9
5
7
5
8
/
*
*
/
return(OCOMM)
return(CCOMM)
4
8
7

/
(
6
*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.
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:
7
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;
t.value=install_num();
exitflag=1;
return t;
break;
case 12:
ch=nextchar();
if(!(isdigit(ch))) state=11;
else state=fail(4);
break;
case 11:
retract(1);
t.type=NUMFLOAT;
t.value=install_num();
exitflag=1;
return t;
break;
8
case 13:
ch=nextchar();
switch(ch){
case'=': state=14; break;
case'+': state=15; break;

case'-': state=19; break;
case'*': state=23; break;
case'/': state=26; break;
case'%': state=29; break;
default: state=fail(13);
}
break;
case 14:
retract(2);
t.type=ASG;
t.value=asg;
exitflag=1;
return t;
case 15:
ch=nextchar();
if(ch=='=') state=16;
else if(ch=='+') state=17;
else state=18;
break;
case 16:
retract(2);
t.type=ASG;
t.value=pasg;
exitflag=1;
return t;
case 17:
retract(2);
t.type=INCRE;
t.value=PP;
exitflag=1;

return t;
case 18:
retract(1);
t.type=OP1;
t.value=plus;
9
exitflag=1;
return t;
case 19:
ch=nextchar();
if(ch=='=') state=20;
else if(ch=='-') state=21;
else state=22;
break;
case 20:
retract(2);
t.type=ASG;
t.value=masg;
exitflag=1;
return t;
case 21:
retract(2);
t.type=REDUCT;
t.value=MM;
exitflag=1;
return t;
case 22:
retract(1);
t.type=OP1;
t.value=minus;

exitflag=1;
return t;
case 23:
ch=nextchar();
if(ch=='=') state=24;
else state=25;
break;
case 24:
retract(2);
t.type=ASG;
t.value=mulasg;
exitflag=1;
return t;
case 25:
retract(1);
t.type=OP2;
10
t.value=mul;
exitflag=1;
return t;
case 26:
ch=nextchar();
if(ch=='=') state=27;
else state=28;
break;
case 27:
retract(2);
t.type=ASG;
t.value=divasg;
exitflag=1;

return t;
case 28:
retract(1);
t.type=OP2;
t.value=div;
exitflag=1;
return t;
case 29:
ch=nextchar();
if(ch=='=') state=30;
else state=31;
break;
case 30:
retract(2);
t.type=ASG;
t.value=modasg;
exitflag=1;
return t;
case 31:
retract(1);
t.type=OP2;
t.value=mod;
exitflag=1;
return t;
case 32:
ch=nextchar();
switch(ch){
11
case'=': state=33; break;
case'<': state=35; break;

case'>': state=38; break;
case'!': state=41; break;
case'&': state=44; break;
case'|': state=46; break;
default: state=fail(32);
}
break;
case 33:
ch=nextchar();
if(ch=='=') state=34;
else state=fail(32);
break;
case 34:
retract(2);
t.type=RELOP;
t.value=EQ;
exitflag=1;
return t;
case 35:
ch=nextchar();
if(ch=='=') state=36;
else state=37;
break;
case 36:
retract(2);
t.type=RELOP;
t.value=LE;
exitflag=1;
return t;
case 37:

retract(1);
t.type=RELOP;
t.value=LT;
exitflag=1;
return t;
case 38:
ch=nextchar();
if(ch=='=') state=39;
12
else state=40;
break;
case 39:
retract(2);
t.type=RELOP;
t.value=GE;
exitflag=1;
return t;
case 40:
retract(1);
t.type=RELOP;
t.value=GT;
exitflag=1;
return t;
case 41:
ch=nextchar();
if(ch=='=') state=42;
else state=43;
break;
case 42:
retract(2);

t.type=RELOP;
t.value=NE;
exitflag=1;
return t;
case 43:
retract(1);
t.type=NOT;
exitflag=1;
return t;
case 44:
ch=nextchar();
if(ch=='&') state=45;
else state=fail(32);
break;
case 45:
retract(2);
t.type=AND;
exitflag=1;
return t;
13
case 46:
ch=nextchar();
if(ch=='|') state=47;
else state=fail(32);
break;
case 47:
retract(2);
t.type=OR;
exitflag=1;
return t;

case 48:
ch=nextchar();
switch(ch){
case'{': state=49; break;
case'}': state=50; break;
case'(': state=51; break;
case')': state=52; break;
case';': state=53; break;
case',': state=54; break;
case'/': state=55; break;
case'*': state=58; break;
default: state=fail(48);
}
break;
case 49:
retract(2);
t.type=BEGIN;
exitflag=1;
return t;
case 50:
retract(2);
t.type=END;
exitflag=1;
return t;
case 51:
retract(2);
t.type=LPAR;
exitflag=1;
return t;
case 52:

14
retract(2);
t.type=RPAR;
exitflag=1;
return t;
case 53:
retract(2);
t.type=SEMI;
exitflag=1;
return t;
case 54:
retract(2);
t.type=COMA;
exitflag=1;
return t;
case 55:
ch=nextchar();
if(ch=='/') state=56;
else if(ch=='*') state=57;
else state=fail(48);
break;
case 56:
retract(2);
t.type=COMM;
exitflag=1;
return t;
case 57:
retract(2);
t.type=OCOMM;
exitflag=1;

return t;
case 58:
ch=nextchar();
if(ch=='/') state=59;
else state=fail(48);
break;
case 59:
retract(2);
t.type=CCOMM;
exitflag=1;
return t;
15
}
} while(exitflag==0);
16
II. Phân tích cú pháp
A. Văn phạm gia tố
S → main
1. main → MAIN LPAR RPAR body
2. body → BEGIN ct END
3. ct → var SEMI ct
4. ct → var SEMI
5. ct → lenh SEMI ct
6. ct → while ct
7. ct → ε
8. lenh → pbgan
9. lenh → body
10.var → TYPE n_id
11.n_id → ID COMA n_id
12. n_id → ID

13.pbgan → ID ASG exp
14.while → WHILE LPAR bieu_thuc RPAR body_ while
15.body_ while → BEGIN lenh_ while END
16.lenh_ while → ct
17.lenh_ while → BREAK SEMI lenh_ while
18.lenh_ while → CONTINUE SEMI lenh_ while
19.bieu_thuc → bt1
20.bieu_thuc → bt2
21.bt1 → NOT bt3
22.bt1 → bt1 AND bt3
23.bt1 → bt1 OR bt3
24.bt1 → bt3
25.bt3 → LPAR bt4 RPAR
26.bt2 → bt4
27.bt4 → bt4 RELOP exp
28.bt4 → exp
29.exp → exp OP1 term
30.exp → term
31.term → term OP2 factor
32.term → factor
33.factor → ID
34.factor → NUMINT
35.factor → NUMFLOAT
36.factor → LPAR exp RPAR
37.factor → OP1 factor
17
B. Ký hiệu kết thúc
1. ID
2. NUMINT
3. NUMFLOAT

4. MAIN
5. BEGIN
6. END
7. TYPE
8. WHILE
9. BREAK
10.CONTINUE
11.LPAR
12.RPAR
13.ASG
14.SEMI
15.COMA
16.NOT
17.AND
18.OR
19.INCRE
20.REDUCT
21.OP1
22.OP2
23.RELOP
24.COMM
25.OCOMM
26.CCOMM
27.$
C. Ký hiệu không kết thúc
1. main
2. body
3. ct
4. lenh
5. var

6. pbgan
7. n_id
8. while
9. body_ while
18
10.lenh_ while
11.bieu_thuc
12.bt1
13.bt2
14.bt3
15.bt4
16.exp
17.term
18.factor
D. 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, WHILE, ε}
4. FIRST(lenh) = {ID, BEGIN}
5. FIRST(var) = {TYPE}
6. FIRST(pbgan) = {ID}
7. FIRST(n_id) = {ID}
8. FIRST(while) = {WHILE}
9. FIRST(body_while) = {BEGIN}
10.FIRST(lenh_while) = {TYPE, ID, BEGIN, WHILE, BREAK,
CONTINUE}
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}
E. FOLLOW
1. FOLLOW(main) = {$}
2. FOLLOW(body) = {SEMI, $}
3. FOLLOW(ct) = {END, $}
4. FOLLOW(lenh) = {SEMI, $}
5. FOLLOW(var) = {SEMI, $}
19
6. FOLLOW(pbgan) = {SEMI, $}
7. FOLLOW(n_id) = {SEMI, $}
8. FOLLOW(while) ={END, $}
9. FOLLOW(body_while) = {END, $}
10.FOLLOW(lenh_while) = {END, $}
11.FOLLOW(bieu_thuc) = {RPAR, $}
12.FOLLOW(bt1) = {AND, OR, RPAR, $}
13.FOLLOW(bt2) = {RPAR, $}
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, $}
F. Tính tuyển
I
0
:
S → .main

main → .MAIN LPAR RPAR body
I
1
= goto(I
0
, main):
S → main.
I
2
= goto(I
0
, MAIN):
main → MAIN .LPAR RPAR body
I
3
= goto(I
2
, LPAR):
main → MAIN LPAR .RPAR body
I
4
= goto(I
3
, RPAR):
main → MAIN LPAR RPAR .body
body → .BEGIN ct END
I
5
= goto(I
4

, body):
main → MAIN LPAR RPAR body.
I
6
= goto(I
4
, BEGIN) = goto(I
6
, BEGIN) = goto(I
10
, BEGIN) = goto(I
17
,
BEGIN) = goto(I
18
, BEGIN) = goto(I
60
, BEGIN) = goto(I
70
, BEGIN) =
goto(I
71
, BEGIN)
body → BEGIN .ct END
ct → .var SEMI ct
ct → .var SEMI
ct → .lenh SEMI ct
ct → .while ct
ct → .
var → .TYPE n_id

lenh → .pbgan
20
lenh → .body
pbgan → .ID ASG exp
body → .BEGIN ct END
while → .WHILE LPAR bieu_thuc RPAR body_while
I
7
= goto(I
6
, ct)
body → BEGIN ct .END
I
8
= goto(I
6
, var) = goto(I
10
, var) = goto(I
17
, var) = goto(I
18
, var) =
goto(I
60
, var) = goto(I
70
, var) = goto(I
71
, var)

ct → var .SEMI ct
ct → var .SEMI
I
9
= goto(I
6
, lenh) = goto(I
10
, lenh) = goto(I
17
, lenh) = goto(I
18
, lenh) =
goto(I
60
, lenh) = goto(I
70
, lenh) = goto(I
71
, lenh)
ct → lenh .SEMI ct
I
10
= goto(I
6
, while) = goto(I
10
, while) = goto(I
17
, while) = goto(I

18
,
while) = goto(I
60
, while) = goto(I
70
, while) = goto(I
71
, while)
ct → while .ct
ct → .var SEMI ct
ct → .var SEMI
ct → .lenh SEMI ct
ct → .while ct
ct → .
var → .TYPE n_id
lenh → .pbgan
lenh → .body
pbgan → .ID ASG exp
body → .BEGIN ct END
while → .WHILE LPAR bieu_thuc RPAR body_while
I
11
= goto(I
6
, TYPE) = goto(I
10
, TYPE) = goto(I
17
, TYPE) = goto(I

18
,
TYPE) = goto(I
60
, TYPE) = goto(I
70
, TYPE) = goto(I
71
, TYPE)
var → TYPE .n_id
n_id → .ID COMA n_id
n_id → .ID
I
12
= goto(I
6
, pbgan) = goto(I
10
, pbgan) = goto(I
17
, pbgan) = goto(I
18
,
pbgan) = goto(I
60
, pbgan) = goto(I
70
, pbgan) = goto(I
71
, pbgan)

lenh → pbgan.
I
13
= goto(I
6
, body) = goto(I
10
, body) = goto(I
17
, body) = goto(I
18
, body)
= goto(I
60
, body) = goto(I
70
, body) = goto(I
71
, body)
lenh → body.
I
14
= goto(I
6
, ID) = goto(I
10
, ID) = goto(I
17
, ID) = goto(I
18

, ID) = goto(I
60
,
ID) = goto(I
70
, ID) = goto(I
71
, ID)
21
pbgan → ID .ASG exp
I
15
= goto(I
6
, WHILE) = goto(I
10
, WHILE) = goto(I
17
, WHILE) =
goto(I
18
, WHILE) = goto(I
60
, WHILE) = goto(I
70
, WHILE) = goto(I
71
, WHILE)
while → WHILE .LPAR bieu_thuc RPAR body_while
I

16
= goto(I
7
, END)
body → BEGIN ct END.
I
17
= goto(I
8
, SEMI)
ct → var SEMI .ct
ct → var SEMI.
ct → .var SEMI ct
ct → .var SEMI
ct → .lenh SEMI ct
ct → .while ct
ct → .
var → .TYPE n_id
lenh → .pbgan
lenh → .body
pbgan → .ID ASG exp
body → .BEGIN ct END
while → .WHILE LPAR bieu_thuc RPAR body_while
I
18
= goto(I
9
, SEMI)
ct → lenh SEMI .ct
ct → .var SEMI ct

ct → .var SEMI
ct → .lenh SEMI ct
ct → .while ct
ct → .
var → .TYPE n_id
lenh → .pbgan
lenh → .body
pbgan → .ID ASG exp
body → .BEGIN ct END
while → .WHILE LPAR bieu_thuc RPAR body_while
I
19
= goto(I
10
, ct)
ct → while ct.
I
20
= goto(I
11
, n_id)
var → TYPE n_id.
I
21
= goto(I
11
, ID) = goto(I
26
, ID)
n_id → ID. COMA n_id

n_id → ID.
22
I
22
= goto(I
14
, ASG)
pbgan → ID ASG .exp
exp → .exp OP1 term
exp → .term
term → .term OP2 factor
term → .factor
factor → .ID
factor → .NUMINT
factor → .NUMFLOAT
factor → .LPAR exp RPAR
factor → .OP1 factor
I
23
= goto(I
15
, LPAR)
while → WHILE LPAR .bieu_thuc RPAR body_while
bieu_thuc → .bt1
bieu_thuc → .bt2
bt1 → .NOT bt3
bt1 → .bt1 AND bt3
bt1 → .bt1 OR bt3
bt1 → .bt3
bt3 → .LPAR bt4 RPAR

bt2 → .bt4
bt4 → .bt4 RELOP exp
bt4 → .exp
exp → .exp OP1 term
exp → .term
term → .term OP2 factor
term → .factor
factor → .ID
factor → .NUMINT
factor → .NUMFLOAT
factor → .LPAR exp RPAR
factor → .OP1 factor
I
24
= goto(I
17
, ct)
ct → var SEMI ct.
I
25
= goto(I
18
, ct)
ct → lenh SEMI ct.
I
26
= goto(I
21
, COMA)
n_id → ID COMA .n_id

n_id → .ID COMA n_id
n_id → .ID
23
I
27
= goto(I
22
, exp)
pbgan → ID ASG exp.
exp → exp .OP1 term
I
28
= goto(I
22
, term) = goto(I
23
, term) = goto(I
33
, term) = goto(I
40
, term) =
goto(I
52
, term) = goto(I
55
, term)
exp → term.
term → term .OP2 factor
I
29

= goto(I
22
, factor) = goto(I
23
, factor) = goto(I
33
, factor) = goto(I
40
,
factor) = goto(I
44
, factor) = goto(I
52
, factor) = goto(I
55
, factor)
term → factor.
I
30
= goto(I
22
, ID) = goto(I
23
, ID) = goto(I
33
, ID) = goto(I
34
, ID) =
goto(I
40

, ID) = goto(I
44
, ID) = goto(I
45
, ID) = goto(I
52
, ID) = goto(I
55
, ID)
factor → ID.
I
31
= goto(I
22
, NUMINT) = goto(I
23
, NUMINT) = goto(I
33
, NUMINT) =
goto(I
34
, NUMINT) = goto(I
40
, NUMINT) = goto(I
44
, NUMINT) = goto(I
45
,
NUMINT) = goto(I
52

, NUMINT) = goto(I
55
, NUMINT)
factor → NUMINT.
I
32
= goto(I
22
, NUMFLOAT) = goto(I
23
, NUMFLOAT) = goto(I
33
,
NUMFLOAT) = goto(I
34
, NUMFLOAT) = goto(I
40
, NUMFLOAT) = goto(I
44
,
NUMFLOAT) = goto(I
45
, NUMFLOAT) = goto(I
52
, NUMFLOAT) = goto(I
55
,
NUMFLOAT)
factor → NUMFLOAT.
I

33
= goto(I
22
, LPAR) = goto(I
33
, LPAR) = goto(I
34
, LPAR) = goto(I
40
,
LPAR) = goto(I
44
, LPAR) = goto(I
45
, LPAR) = goto(I
52
, LPAR) = goto(I
55
,
LPAR)
factor → LPAR .exp RPAR
exp → .exp OP1 term
exp → .term
term → .term OP2 factor
term → .factor
factor → .ID
factor → .NUMINT
factor → .NUMFLOAT
factor → .LPAR exp RPAR
factor → .OP1 factor

I
34
= goto(I
22
, OP1) = goto(I
23
, OP1) = goto(I
33
, OP1) = goto(I
34
, OP1) =
goto(I
40
, OP1) = goto(I
44
, OP1) = goto(I
45
, OP1) = goto(I
52
, OP1) = goto(I
55
,
OP1)
factor → OP1 .factor
factor → .ID
24
factor → .NUMINT
factor → .NUMFLOAT
factor → .LPAR exp RPAR
factor → .OP1 factor

I
35
= goto(I
23
, bieu_thuc)
while → WHILE LPAR bieu_thuc .RPAR body_while
I
36
= goto(I
23
, bt1)
bieu_thuc → bt1.
bt1 → bt1 .AND bt3
bt1 → bt1 .OR bt3
I
37
= goto(I
23
, bt2)
bieu_thuc → bt2.
I
38
= goto(I
23
, NOT)
bt1 → NOT .bt3
bt3 → .LPAR bt4 RPAR
I
39
= goto(I

23
, bt3)
bt1 → bt3.
I
40
= goto(I
23
, LPAR)
bt3 → LPAR .bt4 RPAR
factor → LPAR .exp RPAR
bt4 → .bt4 RELOP exp
bt4 → .exp
exp → .exp OP1 term
exp → .term
term → .term OP2 factor
term → .factor
factor → .ID
factor → .NUMINT
factor → .NUMFLOAT
factor → .LPAR exp RPAR
factor → .OP1 factor
I
41
= goto(I
23
, bt4)
bt2 → bt4.
bt4 → bt4 .RELOP exp
I
42

= goto(I
23
, exp) = goto(I
52
, exp)
bt4 → exp.
exp → exp .OP1 term
I
43
= goto(I
26
, n_id)
n_id → ID COMA n_id.
25

×