以前自己做的一个小编译器的语法设计

语法和语义的实现过程

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

print

程序

程序->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;}}/*循环语句*/
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值