编译原理递归子程序语法分析
递归子程序法也称为递归下降分析法。该方法的实现思想是:对文法中的每个非终结符号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;
}
}
- 运行截图
- 函数流程图