本关任务:编写一个程序实现自上而下语法分析,利用递归下降分析算法实现。
对文法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;
}
//
因为编译器的原因,一些获取输入输出的语句可能需要读者自行修改一下。