语法和语义的实现过程
1 程序--->main{声明 语句集}
2 声明--->int S; | empty
3 S--->V,S
4 S--->V
5 V-->ID
6 V-->ID=digit
7 语句集--->具体语句 语句集 | empty
8 语句集--->具体语句| empty
9 具体语句--->赋值语句 | 选择语句 | 循环语句 | 读值语句 | 打印语句
10 赋值语句--->ID=E;
11 E--->T+E
12 E--->T-E
13 E--->T
14 T--->ID | digit
15 判断式--->T relop T
16 relop---><= | < | > | >= | == | !=
17 选择语句--->M
18 选择语句--->M else H
19 M--->if (判断式) H
20 H--->括号1 语句集 括号2
21括号1--->{ | empty
22括号2--->} | empty
23 循环语句--->while (判断式) H
24读值语句--->read ID ;
25打印语句--->print C;
26 C--->B + C
27 C--->B - C
28 C--->B
29 B--->ID
FIRST&&FOLLOW表
产生式 | FIRST | FOLLOW |
1 程序--->main{声明 语句集} | {main} | {#} |
2 声明--->int S; | empty | {int}{empty} | { } ID if while read print } |
3 S--->V,S | {ID} | {;} |
4 S--->V | {ID} | {;} |
5 V-->ID | {ID} | {, ;} |
6 V-->ID=digit | {ID} | {, ;} |
7 语句集--->具体语句 语句集 | empty | {ID if while read print} {empty} | { } } |
8 语句集--->具体语句| empty | {ID if while read print} {empty} | { } } |
9 具体语句--->赋值语句 | 选择语句 | 循环语句 | 读值语句 | 打印语句 | {ID} {if} {while} {read} {print} | { ID if while read print } } |
10 赋值语句--->ID=E; | {ID} | { ID if while read print } } |
11 E--->T+E | {ID digit} | {;} |
12 E--->T-E | {ID digit} | {;} |
13 E--->T | {ID digit} | {;} |
14 T--->ID | digit | {ID} {digit} | {+ - ;} |
15 判断式--->T relop T | {ID digit} | { ) } |
16 relop---><= | < | > | >= | == | != | {<=}{<}{>}{>=}{==}{!=} | {ID digit} |
17 选择语句--->M | {if} | { ID if while read print } } |
18 选择语句--->M else H | {if} | { ID if while read print } } |
19 M--->if (判断式) H | {if} | { ID if while read print } else } |
20 H--->括号1 语句集 括号2 | { { ID if while read print } | { ID if while read print } else } |
21括号1--->{ | empty | { { } {empty} | {ID if while read print } } |
22括号2--->} | empty | { } } {empty} | { ID if while read print } else} |
23 循环语句--->while (判断式) H
| {while} | { ID if while read print } } |
24读值语句--->read ID ; | {read} | { ID if while read print } } |
25打印语句--->print C; | {print} | { ID if while read print } } |
26 C--->B + C | {ID} | {;} |
27 C--->B - C | {ID} | {;} |
28 C--->B | {ID} | {;} |
29 B--->ID | {ID} | {+ - ;} |
LL(1)分析表
| main | { | } | int | digit | ID | if | else | while | read | |
程序 | 程序->main {声明语句集} |
|
|
|
|
|
|
|
|
|
|
声明 |
|
| 声明->empty | 声明->int S; |
| 声明->empty | 声明->empty |
| 声明->empty | 声明->empty | 声明->empty |
S |
|
|
|
|
| S->V,S S->V |
|
|
|
|
|
V |
|
|
|
|
| V->ID V->ID=digit |
|
|
|
|
|
语句集 |
|
| 语句集->empty |
|
| 语句集->具体语句 语句集 语句集->具体语句 | 语句集->具体语句 语句集 语句集->具体语句 |
| 语句集->具体语句 语句集 语句集->具体语句 | 语句集->具体语句 语句集 语句集->具体语句 | 语句集->具体语句 语句集 语句集->具体语句 |
具体语句 |
|
|
|
|
| 具体语句-->赋值语句 | 具体语句-->选择语句 |
| 具体语句-->循环语句 | 具体语句-->读值语句 | 具体语句-->打印语句 |
赋值语句 |
|
|
|
|
| 赋值语句->ID=E; |
|
|
|
|
|
E |
|
|
|
| E->T+E E->T-E E->T | E->T+E E->T-E E->T |
|
|
|
|
|
T |
|
|
|
| T->digit | T->ID |
|
|
|
|
|
判断式 |
|
|
|
| 判断式->E relop E | 判断式->E relop E |
|
|
|
|
|
选择语句 |
|
|
|
|
|
| 选择语句->M 选择语句->M else H |
|
|
|
|
M |
|
|
|
|
|
| M->if(判断式) H |
|
|
|
|
H |
| H->括号1 语句集 括号2 |
|
|
| H->括号1 语句集 括号2 | H->括号1 语句集 括号2 |
| H->括号1 语句集 括号2 | H->括号1 语句集 括号2 | H->括号1 语句集 括号2 |
括号1 |
| 括号1->{ | 括号1->empty |
|
| 括号1->empty | 括号1->empty |
| 括号1->empty | 括号1->empty | 括号1->empty |
括号2 |
|
| 括号2->} 括号2->empty |
|
| 括号2->empty | 括号2->empty | 括号2->empty | 括号2->empty | 括号2->empty | 括号2->empty |
循环语句 |
|
|
|
|
|
|
|
| 循环语句->while(判断式) H |
|
|
读值语句 |
|
|
|
|
|
|
|
|
| 读值语句->read ID; |
|
打印语句 |
|
|
|
|
|
|
|
|
|
| 打印语句->print C; |
C |
|
|
|
|
| C->B+C C->B-C C->B |
|
|
|
|
|
B |
|
|
|
|
| B->ID |
|
|
|
|
|
可以编译运行以下的范例:
main()//very good!
{
int a=5,c,d,e;
int b=7;
c=56;
e=10;
read d;/*读值语句*/
print d;
if(c<e) {print b;}/*打印语句*/
else {print c;}
while(a<8){a=a+1;if(a==7){print a;}}/*循环语句*/
}