编译原理递归下降分析器(语法分析器)(C/C++)

37b4d51e2b9d477a9cadfe76ec374db6.jpg

#include<stdio.h>

#include<string.h>

char lookahead;

char token[80];\\存储字符串

char ch,t;

int p=0;

int flat=1;\\标志位

void G();

void T();

void S();

void F();//函数声明

void match(char t)//匹配函数

{

       if(lookahead==t)

  {

      lookahead=token[++p];

  }

     else printf("匹配不正确") ;

}

void E()

{

     printf("E=>TG ");

     T();

     G();

}

void G()

{

       if(lookahead=='+')

{

printf(" G=>+TG");

     match('+');

     T();

     G();

}

else if (lookahead=='-')

{

      printf(" G=>-TG ");

      match('-');

      T();

      G();

}

    else printf(" G=>ε");

}

void T()

{

     printf(" T=>FS");

     F();

     S();

}

void S()

{

      if(lookahead=='*')

{

printf(" S=>*FS");

match('*');

F();

S();

}

else if(lookahead=='/')

{

printf(" S=>/FS");

match('/');

F();

S();

}

else printf(" S=>ε");

}

void F()

{

if(lookahead=='i')

{ printf(" F=>i ");

match('i');

}

else if(lookahead=='(')

{

printf(" F=>(E)");

match('(');

E();

if(lookahead==')')

{ match(')');

}

else

{ flat=0; }

}

else

{ flat=0; }

}

int main()

{

int pd=1;

int r=0;

char ch;

printf("请输入以#结束的符号串(包括+ - * / ( ) i #):");

do{

ch=getchar();

token[r++]=ch;

}while(ch!='#');

lookahead=token[0];

E();

printf("\n");

if(pd==flat&&lookahead=='#')

{

printf("输出结果:");

printf("%s",token);

printf("为合法符号串\n");

}

else {

printf("输出结果:");

printf("非法的符号串\n");

}

实验总结:

1.对于嵌套调用函数必须在函数前进行函数声明

2.递归下降分析法和LL(1)文法都必须消除文法二义性,消除左递归,提公共公左因子

3.最重要的是lookahead=token[0];E();调用且只调用一次文法开始符,切勿循环调用

4.错误可以用一个标志位解决,首先可以将flat定义为1,然后如果错了将flat置为0,最后通过if(pd==flat&&lookahead=='#')判断分析是否正确。(解释为什么要判断lookahead是否等于‘#’?如果最后分析错误,那么lookahead就不会指道‘#’。例如字符串‘i)#’,lookahead首先指向i,

E->TG,T->FS,F->i(匹配成功,lookahead指向下一个,既‘)’),S->ε,G->ε(G要么匹配加要么匹配减,而lookahead指向右括号,所以执行else,返回ε,最后函数调用完lookahead值为右括号,并非#,所以以lookahead最后等于#作为判断是否成功的其中一个条件))

5.特别注意有左右括号的写法有俩个错误输出,第一如果匹配不上右有括号;一个是既匹配不上i,又匹配不上左括号

if(lookahead=='(')

{

match('(');

E();

if(lookahead==')')

{ match(')');

}

else

{ flat=0; }

}

else

{ flat=0; }

}

 

 

 

 

 

 

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟d d

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值