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

Tiểu luận môn chương trình dịch Viết trình biên dịch để dịch 1 đoạn chương trình

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 (154.62 KB, 26 trang )

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
case',': state=35; break;
case'/': state=36; break;
case'*': state=37; break;
default: state=fail(29);
}
break;
case 30:
retract(2);
t.type=BEGIN;
exitflag=1;
return t;
case 31:
retract(2);
t.type=END;
exitflag=1;
return t;
case 32:
retract(2);

t.type=LPAR;
exitflag=1;
return t;
case 33:
retract(2);
t.type=RPAR;
exitflag=1;
return t;
case 34:
retract(2);
t.type=SEMI;
exitflag=1;
return t;
case 35:
retract(2);
t.type=COMA;
exitflag=1;
return t;
case 36:
ch=nextchar();
11
if(ch=='/') state=37;
else if(ch=='*') state=38;
else state=fail(29);
break;
case 37:
retract(2);
t.type=COMM;
exitflag=1;
return t;

case 38:
retract(2);
t.type=OCOMM;
exitflag=1;
return t;
case 39:
ch=nextchar();
if(ch=='/') state=40;
else state=fail(29);
break;
case 40:
retract(2);
t.type=CCOMM;
exitflag=1;
return t;
}
} while(exitflag==0);
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 → if ct
7. ct → ε
8. lenh → pbghep
9. lenh → body
10.var → TYPE n_id

12
11.n_id → ID COMA n_id
12.n_id → array LCRO NUMINT RCRO SEMI
13. n_id → ID
14.pbghep → BEGIN lenh END
15.if → IF LPAR bieu_thuc RPAR body_ if
16.body_if → BEGIN lenh_ if END
17.lenh_ if → ct
18.lenh_ if → THEN lenh ELSE lenh
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
B. Ký hiệu kết thúc
1. ID

2. NUMINT
3. NUMFLOAT
4. MAIN
5. BEGIN
6. END
7. TYPE
8. IF
9. THEN
10.ELSE
11.LPAR
13
12.RPAR
13.LCRO
14.RCRO
15.ASG
16.SEMI
17.COMA
18.NOT
19.AND
20.OR
21.INCRE
22.REDUCT
23.OP1
24.OP2
25.RELOP
26.COMM
27.OCOMM
28.CCOMM
29.$
C. Ký hiệu không kết thúc

1. main
2. body
3. ct
4. lenh
5. var
6. array
7. pbghep
8. n_id
9. if
10.body_ if
11.lenh_if
12.bieu_thuc
13.bt1
14.bt2
15.bt3
16.bt4
17.exp
18.term
19.factor
14
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, IF, ε}
4. FIRST(lenh) = {ID, BEGIN}
5. FIRST(var) = {TYPE}
6. FIRST(pbghep) = {BEGIN}
7. FIRST(n_id) = {ID}
8. FIRST(if) = {IF}
9. FIRST(body_if) = {BEGIN}

10.FIRST(lenh_if) = {TYPE, ID, BEGIN, IF }
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, $}
6. FOLLOW(pbghep) = {SEMI, $}
7. FOLLOW(n_id) = {SEMI, $}
8. FOLLOW(if) ={END, $}
9. FOLLOW(body_if) = {END, $}
10.FOLLOW(lenh_if) = {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, $}
15

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 → .if ct
ct → .
var → .TYPE n_id
lenh → .pbghep
lenh → .body
pbghep → .BEGIN lenh END
body → .BEGIN ct END

I
7
= goto(I
6
, ct)
body → BEGIN ct .END

16
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

ct → if .ct
ct → .var SEMI ct
ct → .var SEMI
ct → .lenh SEMI ct
ct → .if ct
ct → .
var → .TYPE n_id
lenh → .pbghep
lenh → .body
pbghep → . BEGIN lenh END
body → .BEGIN ct END

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
, pbghep) = goto(I
10
, pbghep) = goto(I
17
, pbghep) = goto(I
18
,
pbghep) = goto(I
60
, pbghep) = goto(I
70
, pbghep) = goto(I
71
, pbghep)
lenh → pbghep.

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)
pbghep → BEGIN . lenh END

I
16
= goto(I
7
, END)
17
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 → .if ct
ct → .
var → .TYPE n_id

lenh → . pbghep
lenh → .body
pbghep → . BEGIN lenh END
body → .BEGIN ct END
if → .IF LPAR bieu_thuc RPAR body_ if
I
18
= goto(I
9
, SEMI)
ct → lenh SEMI .ct
ct → .var SEMI ct
ct → .var SEMI
ct → .lenh SEMI ct
ct → .if ct
ct → .
var → .TYPE n_id
lenh → .pbghep
lenh → .body
pbghep → .BEGIN lenh END
body → .BEGIN ct END
if → .IF LPAR bieu_thuc RPAR body_ if
I
19
= goto(I
10
, ct)
ct → if 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.

18
I
22
= goto(I
14
, ASG)
pbghep → BEGIN lenh END
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)
if → .IF LPAR bieu_thuc RPAR body_ if
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.

19
I
26
= goto(I
21
, COMA)
n_id → ID COMA .n_id
n_id → .ID COMA n_id
n_id → .ID

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
20
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
factor → .NUMINT
factor → .NUMFLOAT
factor → .LPAR exp RPAR
factor → .OP1 factor

I
35

= goto(I
23
, bieu_thuc)
if → .IF LPAR bieu_thuc RPAR body_ if
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
21
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.

I
44
= goto(I
27
, OP1) = goto(I
42
, OP1) = goto(I
46
, OP1) = goto(I
54
, OP1) =

goto(I
64
, OP1)
exp → exp OP1 .term
term → .term OP2 factor
term → .factor
factor → .ID
factor → .NUMINT
factor → .NUMFLOAT
factor → .LPAR exp RPAR
factor → .OP1 factor

I
45
= goto(I
28
, OP2) = goto(I
56
, OP2)
term → term OP2 .factor
factor → .ID
factor → .NUMINT
factor → .NUMFLOAT
factor → .LPAR exp RPAR
factor → .OP1 factor

I
46
= goto(I
33

, exp)
22
factor → LPAR exp .RPAR
exp → exp .OP1 term

I
47
= goto(I
34
, factor)
factor → OP1 factor.

I
48
= goto(I
35
, RPAR)
if → .IF LPAR bieu_thuc RPAR body_ if
body_ if→ .BEGIN lenh_ if END

I
49
= goto(I
36
, AND)
bt1 → bt1 AND .bt3
bt3 → .LPAR bt4 RPAR

I
50

= goto(I
36
, OR)
bt1 → bt1 OR .bt3
bt3 → .LPAR bt4 RPAR
I
51
= goto(I
38
, bt3)
bt1 → NOT bt3.

I
52
= goto(I
38
, LPAR) = goto(I
49
, LPAR) = goto(I
50
, LPAR)
bt3 → LPAR .bt4 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
53
= goto(I
40
, bt4) = goto(I
52
, bt4)
bt3 → LPAR bt4 .RPAR
bt4 → bt4 .RELOP exp

I
54
= goto(I
40
, exp)
factor → LPAR exp .RPAR
23
bt4 → exp.
exp → exp .OP1 term

I
55
= goto(I
41
, RELOP) = goto(I
53

, RELOP)
bt4 → bt4 RELOP .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
56
= goto(I
44
, term)
exp → exp OP1 term.
term → term .OP2 factor

I
57
= goto(I
45
, factor)
term → term OP2 factor.

I
58
= goto(I

46
, RPAR) = goto(I
54
, RPAR)
factor → LPAR exp RPAR.

I
59
= goto(I
48
, body_if)
if → IF LPAR bieu_thuc RPAR body_ if

I
60
= goto(I
48
, BEGIN)
body_ if → BEGIN .lenh_ if END
lenh_ if → .ct
ct → .var SEMI ct
ct → .var SEMI
ct → .lenh SEMI ct
ct → .iF ct
ct → .
var → .TYPE n_id
lenh → .pbghep
lenh → .body
pbghep→ . BEGIN lenh END
24

body → . BEGIN ct END
if → IF LPAR bieu_thuc RPAR body_ if
I
61
= goto(I
49
, bt3)
bt1 → bt1 AND bt3.

I
62
= goto(I
50
, bt3)
bt1 → bt1 OR bt3.

I
63
= goto(I
53
, RPAR)
bt3 → LPAR bt4 RPAR.

I
64
= goto(I
55
, exp)
bt4 → bt4 RELOP exp.
exp → exp .OP1 term

I
65
= goto(I
60
, lenh_ if)
body_ if → BEGIN lenh_ if .END

I
66
= goto(I
60
, ct) = goto(I
70
, ct) = goto(I
71
, ct)
lenh_if → ct.


I
69
= goto(I
65
, END)
body_ if → BEGIN lenh_ if END.

I
70
= goto(I
67

, SEMI)
ct → .var SEMI ct
ct → .var SEMI
ct → .if SEMI ct
ct → .if ct
ct → .
var → .TYPE n_id
lenh → .pbghep
lenh → .body
pbghep → .BEGIN lenh END
body → .BEGIN ct END
if → .IF LPAR bieu_thuc RPAR body_ if

I
71
= goto(I
68
, SEMI)
ct → .var SEMI ct
ct → .var SEMI
25

×