编译原理之自上而下语法分析

本关任务:编写一个程序实现自上而下语法分析,利用递归下降分析算法实现。

对文法G[E]实现递归下降分析算法,规则如下

E → TE'

E'→ +TE' | ε

T → FT'

T'→ *FT' | ε

F → (E) | i

文法G[E]各非终结符的first和follow集合如下所示:

first(E)={(,i}    follow(E)={),$}

first(E1)={+,ε}   follow(E1)={),$}

first(T)={(,i}    follow(T)={),$,+}

first(T1)={*,ε}   follow(T1)={),$,+}

first(F)={(,i}     follow(F)={),$,+,*}

如何确定输入串

从文法开始符E进行推导,得到的句型作为输入串进行测试。

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

char token;
char str[20];
char *p;
void E();
void E1();
void T();
void T1();
void F();
void match(char);

void E()
{
  switch(token)
  {
   case '(': T();E1();break;
   case 'i': T();E1();break;
   default:break;
  }
}
void E1()
{
  switch(token)
  {
   case '+': match('+');T();E1();break;
   case ')':break;
   default:break;
  }
}
void T()
{
  switch(token) 
   {
    case 'i':F();T1();break;
    case '(':F();T1();break;
    default:break;
   }
}

void T1()
{ 
  switch(token)
   {case '*':match('*');F();T1();break;
    case ')':break;
    case '+':break;
    default:break;
  }
}
void F()
{
  switch(token)
  {
   case 'i':match('i');break;
   case '(':match('(');E();match(')');break;
   default:break;
  }
}
void match(char x)
{//字符匹配成功,读取下一个字符
	if(token==x)  {p++;token=*p;}
    else {printf("\n");}
}

int main()
{  
   cin>>str;
   p=str;
   token=*p;
   E();
   if(token=='$')
      cout<<"succes,此字符串能被接受"<<endl;
   else 
      cout<<"fail,此字符串不能被接受"<<endl;
}

//

 因为编译器的原因,一些获取输入输出的语句可能需要读者自行修改一下。

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值