您的位置:首页 > 其它

编译原理递归子程序语法分析

2018-11-28 22:07 260 查看

编译原理递归子程序语法分析

递归子程序法也称为递归下降分析法。该方法的实现思想是:对文法中的每个非终结符号U都编写出一个子程序,以完成该非终结符号所对应的语法成分的分析和识别任务。高级程序设计语言的语法规则通常都是用上下文无关文法来描述的,文法中的符号分为终结符号和非终结符号。
本分析程序所分析的文法如下:

  • G[E]:
    E→eBaA
    A→a|bAcB
    B→dEd|aC
    C→e|dC

  • 可以求出
    First(E)={e} Slect(A→a)={a} Slect(B→aC)={a}
    First(A)={a,b} Slect(E→eBaA)={e} Slect(C→e)={e}
    First(B)={a,d} Slect(A→bAcB)={b} Slect(C→dC)={d}
    First©={d,e} Slect(B→dEd)={d}

  • 求解字符串
    1、eadeaa
    2、edeaebd
    3、edeaeaadabacae
    是否是该文法的句子。

  • C++源代码

#include<iostream>
#include<string>
using namespace std;
char lookahead ;
int count;
int i=0;
bool sign=1;
char int_str[][20]={"eadeaa","edeaebd","edeaeaadabacae"};
void ParseB();
void ParseA();
void ParseC();
void ParseE();
void MatchToken(int expected)
{
if(lookahead!=expected)
{
sign=0;
//cout<<" Match error!"<<endl;
}
else
count++;

lookahead=int_str[i][count];

}
void ParseE()
{

if(lookahead=='e')
{

MatchToken('e');
ParseB();
MatchToken('a');
ParseA();
}
else
sign=0;
//cout<<"E error"<<endl;

}

void ParseB()
{
if(lookahead=='d')
{
MatchToken('d');
ParseE();
MatchToken('d');
}
else if(lookahead=='a')
{
MatchToken('a');
ParseC();
}
else{
sign=0;
//cout<<"B error"<<endl;
}
}
void ParseA()
{
if(lookahead=='a')
{
MatchToken('a');
}
else if(lookahead=='b')
{
MatchToken('b');
ParseA();
MatchToken('c');
ParseB();
}
else{
sign=0;
//cout<<"A error"<<endl;
}
}

void ParseC()
{
if(lookahead=='e')
{
MatchToken('e');
}
else if(lookahead=='d')
{
MatchToken('d');
ParseC();
}

}
int main()
{

for(;i<3;i++)
{
count=0;
sign=1;
lookahead=int_str[i][count];
ParseE();
if(sign)
{
cout<<"第"<<i+1<<"组数据正确"<<endl;
}
else
cout<<"第"<<i+1<<"组数据错误"<<endl;
}

}
  • 运行截图
  • 函数流程图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: