当一个文法满足LL(1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。这样的一个分析程序成为递归下降分析器。
例:一个支持 +,*,(,) 的简单文法为(用$表示空字符):
E -> TE'
E -> +TE' | $
T -> FT'
T' -> *FT' | $
F -> (E) | i
《编译原理》 第三版(陈火旺)P74:
#include "iostream"
#include "cstdio"
#include "cstring"
using namespace std;
char a[100];
int len;
int p;
char sym;
bool ok;
void E();
void E2();
void T();
void T2();
void F();
void init()
{
len = strlen(a);
ok=true;
p=0;
}
void getNext()
{
sym = a[p++];
}
int main()
{
freopen("in.txt","r",stdin);
while(cin>>a)
{
init();
getNext();
E();
cout<<a<<endl;
if(ok)cout<<"Success"<<endl;
else cout<<"Error"<<endl;
}
return 0;
}
void E()
{
T();
E2();
}
void E2()
{
if(sym=='+')
{
getNext();
T();
E2();
}
}
void T()
{
F();
T2();
}
void T2()
{
if(sym=='*')
{
getNext();
F();
T2();
}
}
void F()
{
if( sym=='i' )
{
getNext();
}
else
{
if(sym=='(')
{
getNext();
E();
if(sym==')')
{
getNext();
}
else
{
ok = false;
return;
}
}
else
{
ok = false;
return;
}
}
}