LỜI NÓI ĐẦUChương trình dịch là một môn học của ngành khoa học máy tính.. Cùng với sự phát triển của các chuyên ngành : Lý thuyết ngôn ngữ hình thức & Ôtômat vàcác chuyên ngành khác, lý
Trang 1LỜI NÓI ĐẦU
Chương trình dịch là một môn học của ngành khoa học máy tính Cùng với
sự phát triển của các chuyên ngành : Lý thuyết ngôn ngữ hình thức & Ôtômat vàcác chuyên ngành khác, lý thuyết thiết kế trình biên dịch ngày một hoàn thiện hơn
Ngày nay lý thuyết trình biên dịch đã được ứng dụng không những trongviệc thiết kế trình biên dịch cho ngôn ngữ lập trình mà còn trong lĩnh vực trí tuệnhân tạo - hiểu ngôn ngữ tự nhiên, dịch máy …
Đồ án môn học : CHƯƠNG TRÌNH DỊCH là dịp tốt để cho việc học tập
của sinh viên chuyên ngành tin học nắm vững lý thuyết và cách thiết kế trình biêndịch được tốt
Vì thế chúng em thực hiện đồ án, với đề tài 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) và kiểu array Độ ưu tiên các phép toán tương tự C
- Thực hiện chuyển đổi kiểu từ nguyên sang thực khi cần thiết
Em xin chân thành cảm ơn sự hướng dẫn tận tình của cô Phan Thị Thu
Hồng và sự đóng góp ý kiến của các bạn, nhằm giúp đỡ cho đồ án hoàn thành
đúng yêu cầu Mặc dù đã cố gắng tham khảo nhiều tài liệu nhưng quá trình thựchiện khó tránh khỏi những thiếu sót và hạn chế Rất mong nhận được những ý kiếnnhận xét, đóng góp của thầy cô và các bạn
Nhóm sinh viên thực hiện
Nguyễn Thị Diệp Phạm Thị Định Nguyễn Thị Gấm Nguyễn Thị Nụ
Lớp : THC 52
Trang 2MỤC LỤC
LỜI NÓI ĐẦU 1
A Những nội dung liên quan tới yêu cầu của đề bài 3
I Phát biểu ghép và if trong C 3
1 Phát biểu ghép 3
2 Phát biểu if 3
II Các phát biểu kết thúc bằng dấu ; 4
III Các phép toán 4
1 Các phép toán số học 4
2 Các phép toán logic 4
3 Các phép toán so sánh 4
4 Toán tử chọn theo điều kiện 4
5 Các toán hạng 5
6 Độ ưu tiên của phép toán 5
7 Chuyển đổi kiểu nguyên sang kiểu số thực 5
B Phân tích từ vựng 6
I Bảng token 6
II Sơ đồ dịch 7
1 Định nghĩa các token 7
2 Sơ đồ dịch 8
C Phân tích cú pháp 11
I Định nghĩa văn phạm tổng quát 11
II Các ký hiệu kết thúc và chưa kết thúc 13
1 Các ký hiệu kết thúc 13
2 Các ký hiệu không kết thúc 14
III Xây dựng bảng phân tích LR 14
D Phân tích ngữ nghĩa 51
I Định nghĩa trực tiếp cú pháp 51
II Kiểm tra kiểu 52
E Sinh mã trung gian 54
Trang 3A Những nội dung liên quan tới yêu cầu của đề bài
Trang 4lệnh S2;
- Lệnh S1, S2 có thể là một khối lệnh
II Các phát biểu kết thúc bằng dấu ;
Đa số các câu lệnh kết thúc bằng dấu ; dùng để ngăn cách các câu lệnh Ví
dụ như: Phát biểu gán (a=0, gán 0 cho biến a), khai báo biến, hằng (float a, khai báo biến a có kiểu số thực)…
Trang 54 Toán tử chọn theo điều kiện
(Điều kiện) ? biểu thức 1 : biểu thức 2
- Điều kiện đúng thì biểu thức nhận giá trị biểu thức 1, các trường hợp còn lại bằngbiểu thức 2
Kiểu tên_mảng [kích_thước_chiều1][kích_thước_chiều2]…[kích_thước_chiều_n]
6 Độ ưu tiên của phép toán
- Có 15 mức ưu tiên, thường thì các toán tử 1 ngôi có độ ưu tiên cao hơn 2 ngôi Thứ tự ưu tiên được chỉ rõ hơn trong dấu ()
7 Chuyển đổi kiểu nguyên sang kiểu số thực
int i;
- Chuyển kiểu: (float) i;
Trang 6B Phân tích từ vựng
I Bảng token
hoặc dấu gạch chân theo sau là số hoặcchữ, dấu gạch chân và không trùng vớikhóa
Trang 87 6
1 0
Trang 9* num
* real
Chú ý: Một số trạng thái có thêm một dấu * để chỉ ra đồ thị chuyển đã xử lý quá
một ký tự của phần khác Ký hiệu này được lưu và trả lại khi đoán nhận phần khác
Trang 10Start 1
7 8
5 6
4 3
2 +
] ) ( /
* -
[
9 10
13 14
12 11
{ }
; :
?
Trang 11C Phân tích cú pháp
I Định nghĩa văn phạm tổng quát
S → void main left right block
block → begin assign_list end
assign_list → assign assign_list |
assign → dec_var | begin assign_list end | pbif
dec_var → type id id1 semi dec_var
id1 → coma id1 | open num close id1 |
pbif → if expr pbif | if expr pbif else pbif | begin assign_list end |
id asg expr semiexpr → exp aws expr colon expr
exp → exp or exp1 | exp1
exp1 → exp1 and term | term
term → term relop1 term1 | term1
term1 → term1 relop2 term2 | term2
term2 → term2 op1 term3| term3
term3 → term3 op2 factor | factor
factor → not factor1
factor1 → left exp right| id | num | real
!
1 8
19
2 0
Trang 12* Văn phạm tăng cường
S’ → S(1) S → dec_var void main left right block(2) dec_var → type id id1 semi dec_var(4) id1 → coma id id1
(5) id1 → open num close id1
(6) id1 →
(7) block → begin assign_list end
(8) assign_list → assign assign_list
(9) assign_list →
(10) assign → dec_var
(11) assign → if expr assign
(12) assign → if expr assign else assign(13) assign → begin assign_list end
(14) assign → id asg expr semi
(15) expr → exp aws expr colon expr (16) expr → exp
(17) exp → exp or exp1
Trang 13(30) factor1 → left expr right
(31) factor1 → id
(32) factor1 → num
(33) factor1 → real
(34) factor1 → left type right id
II Các ký hiệu kết thúc và chưa kết thúc
Trang 14S → dec_var void main left right block, $
dec_var → type id id1 semi dec_var, void
dec_var → , void
goto(I0, S)
-I 1: S’→S., $
goto(I0, dec_var)
Trang 15-I 2: S → dec_var void main left right block, $
goto(I0, type)
-I 3: dec_var → type id id1 semi dec_var, void
goto(I2, void)
-I 4: S → dec_var void main left right block, $
goto(I3, id)
-I 5: dec_var → type id id1 semi dec_var, void
id1 → coma id id1, semi
id1 → open num close id1, semi
id1 → , semi
goto(I4, main)
-I 6: S → dec_var void main left right block, $
goto(I5, id1)
-I 7: dec_var → type id id1 semi dec_var, void
goto(I5, coma)
-I 8: id1 → coma id id1, semi
goto(I5, open)
-I 9: id1 → open num close id1, semi
goto(I6, left)
-I 10: S → dec_var void main left right block, $
goto(I7, semi)
-I 11: dec_var → type id id1 semi dec_var, void
dec_var → type id id1 semi dec_var, void
Trang 16goto(I8, id)
-I 12: id1 → coma id id1, semi
id1 → coma id id1, semi
id1 → open num close id1, semi
id1 → , semi
goto(I9, num)
-I 13: id1 → open num close id1, semi
goto(I10, right)
-I 14: S → dec_var void main left right block, $
block → begin assign_list end, $
goto(I11, dec_var)
-I 15: dec_var → type id id1 semi dec_var., void
goto(I11, type) ≡ I3
goto(I12, id1)
-I 16: id1 → coma id id1., semi
goto(I12, coma) ≡ I8, goto(I12, open) ≡ I9
goto(I13, close)
-I 17: id1 → open num close id1, semi
id1 → coma id id1, semi
id1 → open num close id1, semi
id1 → , semi
goto(I14, block)
-I 18: S → dec_var void main left right block., $
goto(I14, begin)
Trang 17-I 19: block → begin assign_list end, $
assign_list → assign assign_list, end
assign_list → , end
assign → dec_var, type | begin | id | if |
dec_var → type id id1 semi dec_var, type | begin | id | if |
assign → if expr assign, type | begin | id | if |
assign → if expr assign else assign, type | begin | id | if |
assign → begin assign_list end, type | begin | id | if |
assign → id asg expr semi, type | begin | id | if |
goto(I17, id)
-I 20: id1 → open num close id1., semi
goto(I17, coma) ≡ I8, goto(I17, open) ≡ I9
goto(I19, assign_list)
-I 21: block → begin assign_list end, $
goto(I19, assign)
-I 22: assign_list → assign assign_list, end
assign_list → assign assign_list, end
assign_list → , end
assign → dec_var, type | begin | id | if |
dec_var → type id id1 semi dec_var, type | begin | id | if |
assign → if expr assign, type | begin | id | if |
assign → if expr assign else assign, type | begin | id | if |
assign → begin assign_list end, type | begin | id | if |
assign → id asg expr semi, type | begin | id | if |
goto(I19, dec_var)
-I 23: assign → dec_var., type | begin | id | if |
goto(I19, type)
Trang 18I 24: dec_var → type id id1 semi dec_var, type | begin | id | if |
-goto(I19, if)
I 25: assign → if expr assign, type | begin | id | if |
assign → if expr assign else assign, type | begin | id | if |
expr → exp aws expr colon expr, type | begin | id | if |
expr → exp, type | begin | id | if |
exp → exp or exp1, type | begin | id | if | aws | or |
exp → exp1, type | begin | id | if | aws | or |
exp1 → exp1 and term, type | begin | id | if | aws | or | and |
exp1 → term, type | begin | id | if | aws | or | and |
term → term relop1 term1, type | begin | id | if | aws | or | and | relop1 |
term → term1, type | begin | id | if | aws | or | and | relop1 |
term1 → term1 relop2 term2, type| begin| id| if| aws| or| and| relop1|relop2|
term1 → term2, type| begin| id| if| aws| or| and| relop1|relop2|
term2 →.term2 op1 term3, type|begin|id|if|aws|or|and|relop1|relop2|op1|
term2 → term3, type|begin|id|if|aws|or|and|relop1|relop2|op1|
term3→.term3 op2 factor,type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
term3 → factor, type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
factor → not factor1, type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
goto(I19, begin)
-I 26: assign → begin assign_list end, type | begin | id | if |
assign_list → assign assign_list, end
assign_list → , end
assign → dec_var, type | begin | id | if |
dec_var → type id id1 semi dec_var, type | begin | id | if |
assign → if expr assign, type | begin | id | if |
Trang 19assign → if expr assign else assign, type | begin | id | if |
assign → begin assign_list end, type | begin | id | if |
assign → id asg expr semi, type | begin | id | if |
goto(I19, id)
-I 27: assign → id asg expr semi, type | begin | id | if |
goto(I21, end)
-I 28: block → begin assign_list end., $
goto(I22, assign_list)
-I 29: assign_list → assign assign_list., end
goto(I22, assign) ≡ I22, goto(I22, dec_var) ≡ I23, goto(I22, type) ≡ I24
goto(I22, if) ≡ I25, goto(I22, begin) ≡ I26, goto(I22, id) ≡ I27
goto(I24, id)
I 30: dec_var → type id id1 semi dec_var, type | begin | id | if |
id1 → coma id id1, semi
id1 → open num close id1, semi
id1 → , semi
goto(I25, expr)
-I 31: assign → if expr assign, type | begin | id | if |
assign → if expr assign else assign, type | begin | id | if |
assign → dec_var, type | begin | id | if | | else
dec_var → type id id1 semi dec_var, type | begin | id | if | | elseassign → if expr assign, type | begin | id | if | | else
assign → if expr assign else assign, type | begin | id | if | | elseassign → begin assign_list end, type | begin | id | if | | esleassign → id asg expr semi, type | begin | id | if | | else
goto(I25, exp)
-I 32: expr → exp aws expr colon expr, type | begin | id | if |
Trang 20expr → exp., type | begin | id | if |
exp → exp or exp1, type | begin | id | if | aws | or |
-goto(I25, exp1)
I 33: exp → exp1., type | begin | id | if | aws | or |
exp1 → exp1 and term, type | begin | id | if | aws | or | and |
-goto(I25, term)
I 34: exp1 → term., type | begin | id | if | aws | or | and |
term → term relop1 term1, type | begin | id | if | aws | or | and | relop1 |
-goto(I25, term1)
I 35: term → term1., type | begin | id | if | aws | or | and | relop1 |
term1 → term1 relop2 term2, type| begin| id| if| aws| or| and| relop1|relop2|
-goto(I25, term2)
I 36: term1 → term2., type| begin| id| if| aws| or| and| relop1|relop2|
term2 →term2 op1 term3, type|begin|id|if|aws|or|and|relop1|relop2|op1|
-goto(I25, term3)
I 37: term2 → term3., type|begin|id|if|aws|or|and|relop1|relop2|op1|
term3→term3 op2 factor,type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
Trang 21I 39: factor → not factor1, type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
factor1 → left expr right,type|begin|id|if|aws|or|and|
relop1|relop2|op1|op2|
factor1 → id, type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
factor1 → num, type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
factor1 → real, type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
factor1 → left type right id, type|begin|id|if|aws|or|and|
relop1|relop2|op1|op2|
-goto(I26, assign_list)
I 40: assign → begin assign_list end, type | begin | id | if |
goto(I26, assign) ≡ I22, goto(I26, dec_var) ≡ I23, goto(I26, type) ≡ I24
goto(I26, if) ≡ I25, goto(I26, begin) ≡ I26, goto(I26, id) ≡ I27
-goto(I27, asg)
I 41: assign → id asg expr semi, type | begin | id | if |
expr → exp aws expr colon expr, semi
expr → exp, semi
exp → exp or exp1, semi | aws | or
exp → exp1, semi | aws | or
exp1 → exp1 and term, semi | aws | or | and
exp1 → term, semi | aws | or | and
term → term relop1 term1, semi | aws | or | and | relop1
term → term1, semi | aws | or | and | relop1
term1 → term1 relop2 term2, semi | aws | or | and | relop1| relop2
term1 → term2, semi | aws | or | and | relop1| relop2
term2 →.term2 op1 term3, semi | aws | or | and | relop1| relop2 | op1term2 → term3, semi | aws | or | and | relop1| relop2 | op1
term3→.term3 op2 factor, semi | aws | or | and | relop1| relop2 |op1|op2term3 → factor, semi | aws | or | and | relop1| relop2 |op1|op2
Trang 22factor → not factor1, semi | aws | or | and | relop1| relop2 |op1|op2
-goto(I30, id1)
I 42: dec_var → type id id1 semi dec_var, type | begin | id | if |
Goto(I30, coma) ≡ I8, goto(I30, open) ≡ I9
Goto(I31, assign)
I 43: assign → if expr assign., type | begin | id | if |
assign → if expr assign else assign, type | begin | id | if |
I 46: assign → if expr assign, type | begin | id | if | | else
assign → if expr assign else assign, type | begin | id | if | | else
expr → exp aws expr colon expr, type | begin | id | if |
expr → exp, type | begin | id | if |
exp → exp or exp1, type | begin | id | if | aws | or |
exp → exp1, type | begin | id | if | aws | or |
exp1 → exp1 and term, type | begin | id | if | aws | or | and |
exp1 → term, type | begin | id | if | aws | or | and |
term → term relop1 term1, type | begin | id | if | aws | or | and | relop1 |
term → term1, type | begin | id | if | aws | or | and | relop1 |
term1 → term1 relop2 term2, type| begin| id| if| aws| or| and|
relop1|relop2|
term1 → term2, type| begin| id| if| aws| or| and| relop1|relop2|
term2 →.term2 op1 term3, type|begin|id|if|aws|or|and|
relop1|relop2|op1|
term2 → term3, type|begin|id|if|aws|or|and|relop1|relop2|op1|
term3→.term3 op2 factor,type|begin|id|if|aws|or|and|
Trang 23term3 → factor, type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
factor → not factor1,type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
goto(I31, begin)
I 47: assign → begin assign_list end, type | begin | id | if | | else
assign_list → assign assign_list, end
assign_list → , end
assign → dec_var, type | begin | id | if |
dec_var → type id id1 semi dec_var, type | begin | id | if |
assign → if expr assign, type | begin | id | if |
assign → if expr assign else assign, type | begin | id | if |
assign → begin assign_list end, type | begin | id | if |
assign → id asg expr semi, type | begin | id | if |
I 49: expr → exp aws expr colon expr, type | begin | id | if |
expr → exp aws expr colon expr, colon
expr → exp, colon
exp → exp or exp1, colon | aws | or
exp → exp1, colon | aws | or
exp1 → exp1 and term, colon | aws | and | or
exp1 → term, colon | aws | and | or
term → term relop1 term1, colon | aws | and | relop1 | or
term → term1, colon | aws | and | relop1 | or
term1 → term1 relop2 term2, colon | aws | and | relop1 | relop2 | orterm1 → term2, colon | aws | and | relop1 | relop2 | or
term2 →.term2 op1 term3, colon|aws|or|and|relop1|relop2|op1
term2 → term3, colon |aws|or|and|relop1|relop2|op1
Trang 24term3→.term3 op2 factor,colon|aws|or|and|relop1|relop2|op1|op2
term3 → factor, colon|aws|or|and|relop1|relop2|op1|op2
factor → not factor1, colon|aws|or|and|relop1|relop2|op1|op2
Goto(I32, or)
I 50: exp → exp or exp1, type | begin | id | if | aws | or |
exp1 → exp1 and term, type | begin | id | if | aws | or | | and
exp1 → term, type | begin | id | if | aws | or | | and
term → term relop1 term1, type | begin | id | if | aws | or | | and | relop1term → term1, type | begin | id | if | aws | or | | and | relop1
term1 →.term1 relop2 term2, type| begin| id| if| aws| or| | and| relop1|relop2
term1 → term2, type| begin| id| if| aws| or| | and| relop1| relop2
term2 →.term2 op1 term3, type|begin|id|if| aws| or| | and| relop1| relop2|op1
term2 → term3, type| begin| id| if| aws| or| | and| relop1| relop2| op1
term3 → term3 op2 factor, type|begin|id|if|aws|or| |and|
relop1|relop2|op1|op2term3 → factor, type| begin| id| if| aws| or| | and| relop1| relop2|op1|op2factor →.not factor1, type|begin| id| if| aws| or| | and| relop1| relop2|op1|op2 -
Goto(I33, and)
I 51: exp1 → exp1 and term, type | begin | id | if | aws | or | and |
term → term relop1 term1, type | begin | id | if | aws | or | | and | relop1term → term1, type | begin | id | if | aws | or | | and | relop1
term1 →.term1 relop2 term2, type| begin| id| if| aws| or| | and| relop1|relop2
term1 → term2, type| begin| id| if| aws| or| | and| relop1| relop2
term2 →.term2 op1 term3, type|begin|id|if| aws| or| | and| relop1| relop2|op1
term2 → term3, type| begin| id| if| aws| or| | and| relop1| relop2| op1
Trang 25term3 → term3 op2 factor, type|begin|id|if|aws|or| |and|
relop1|relop2|op1|op2term3 → factor, type| begin| id| if| aws| or| | and| relop1| relop2|op1|op2factor →.not factor1, type|begin| id| if| aws| or| | and| relop1| relop2|op1|op2 -
Goto(I34, relop1)
I 52: term → term relop1 term1, type | begin | id | if | aws | or | and | relop1 |
term1 →.term1 relop2 term2, type| begin| id| if| aws| or| | and| relop1|relop2
term1 → term2, type| begin| id| if| aws| or| | and| relop1| relop2
term2 →.term2 op1 term3, type|begin|id|if| aws| or| | and| relop1| relop2|op1
term2 → term3, type| begin| id| if| aws| or| | and| relop1| relop2| op1
term3 → term3 op2 factor, type|begin|id|if|aws|or| |and|
relop1|relop2|op1|op2term3 → factor, type| begin| id| if| aws| or| | and| relop1| relop2|op1|op2factor →.not factor1, type|begin| id| if| aws| or| | and| relop1| relop2|op1|op2 -Goto(I35, relop2)
I 53: term1 → term1 relop2 term2, type| begin| id| if| aws| or| and| relop1|relop2|
term2 →.term2 op1 term3, type|begin|id|if| aws| or| | and| relop1| relop2|op1
term2 → term3, type| begin| id| if| aws| or| | and| relop1| relop2| op1
term3 → term3 op2 factor, type|begin|id|if|aws|or| |and|
relop1|relop2|op1|op2term3 → factor, type| begin| id| if| aws| or| | and| relop1| relop2|op1|op2factor →.not factor1, type|begin| id| if| aws| or| | and| relop1| relop2|op1|op2 -
Goto(I36, op1)
I 54: term2 →term2 op1 term3, type|begin|id|if|aws|or|and|relop1|relop2|op1|
term3 → term3 op2 factor, type|begin|id|if|aws|or| |and|
Trang 26relop1|relop2|op1|op2term3 → factor, type| begin| id| if| aws| or| | and| relop1| relop2|op1|op2factor →.not factor1, type|begin| id| if| aws| or| | and| relop1| relop2|op1|op2 -
I 57: factor1 → left expr right, type | begin | id | if | aws | or | and |
relop1| relop2 |op1 |op2 |
expr → exp aws expr colon expr, right
expr → exp, right
exp → exp or exp1, right | aws | or
exp → exp1, right | aws | or
exp1 → exp1 and term, right | aws | or | and
exp1 → term, right | aws | or | and
term → term relop1 term1, right | aws | or | and | relop1
term → term1, right | aws | or | and | relop1
term1 → term1 relop2 term2, right | aws | or | and | relop1 | relop2
term1 → term2, right | aws | or | and | relop1 | relop2
term2 →.term2 op1 term3, right | aws | or | and | relop1 | relop2 | op1
term2 → term3, right | aws | or | and | relop1 | relop2 | op1
term3→.term3 op2 factor, right | aws | or | and | relop1 | relop2 | op1| op2term3 → factor, right | aws | or | and | relop1 | relop2 | op1| op2
factor → not factor1, right | aws | or | and | relop1 | relop2 | op1| op2
factor1 → left type right id, type|begin|id|if|aws|or|and|
relop1|relop2|op1|op2|
Trang 27Goto(I39, id)
-I 58: factor1 → id., type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
-Goto(I39, num)
I 59: factor1 → num., type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
Goto(I39, real)
-I 60: factor1 → real., type|begin|id|if|aws|or|and|relop1|relop2|op1|op2|
I 63: expr → exp aws expr colon expr, semi
expr → exp., semi
exp → exp or exp1, semi | aws | or
-Goto(I41, exp1)
I 64: exp → exp1., semi | aws | or
exp1 → exp1 and term, semi | aws | or | and
-Goto(I41, term)
I 65: exp1 → term., semi | aws | or | and
term → term relop1 term1, semi | aws | or | and | relop1
-Goto(I41, term1)
I 66: term → term1., semi | aws | or | and | relop1
term1 → term1 relop2 term2, semi | aws | or | and | relop1| relop2 -
Goto(I41, term2)
I 67: term1 → term2., semi | aws | or | and | relop1| relop2
Trang 28term2 →term2 op1 term3, semi | aws | or | and | relop1| relop2 | op1 -
Goto(I41, term3)
I 68: term2 → term3., semi | aws | or | and | relop1| relop2 | op1
term3→term3 op2 factor, semi | aws | or | and | relop1| relop2 |op1|op2 -
Goto(I41, factor)
I 69: term3 → factor., semi | aws | or | and | relop1| relop2 |op1|op2
-Goto(I41, not)
I 70: factor → not factor1, semi | aws | or | and | relop1| relop2 |op1|op2
factor1 → left expr right, semi| aws| or| and| relop1| relop2|op1|op2factor1 → id, semi | aws | or | and | relop1| relop2 |op1|op2
factor1 → num, semi | aws | or | and | relop1| relop2 |op1|op2
factor1 → real, semi | aws | or | and | relop1| relop2 |op1|op2
factor1 → left type right id, semi | aws | or | and | relop1| relop2 |op1|op2 -
Goto(I42, semi)
I 71: dec_var → type id id1 semi dec_var, type | begin | id | if |
dec_var → type id id1 semi dec_var, type | begin | id | if |
dec_var → , type | begin | id | if |
-Goto(I43, else)
I 72: assign → if expr assign else assign, type | begin | id | if |
assign → dec_var, type | begin | id | if |
dec_var → type id id1 semi dec_var, type | begin | id | if |
assign → if expr assign, type | begin | id | if |
assign → if expr assign else assign, type | begin | id | if |
assign → begin assign_list end, type | begin | id | if |
assign → id asg expr semi, type | begin | id | if |
-Goto(I45, id)
I 73: dec_var → type id id1 semi dec_var, type | begin | id | if | | else
id1 → coma id id1, semi