- 实验目的:
1.1掌握语法分析方法。
1.2掌握使用算符优先分析法。
1.3完成语法分析程序的设计和实现。
1.4程序能完成对指定语言的语法分析。
2. 递归下降分析器
在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下,我们就可能构造一个不带回溯的自上而下的分析程序,这个分析程序是由一组递归过程(或函数)组成的,每个过程(或函数)对应文法的一个非终结符。这样的一个分析程序称为递归下降分析器。
文法G[E]为:
G[E]: E→E+T∣T
T→T*F∣F
F→(E)∣i
经过消去直接左递归后得到文法G'[E]为:
G'[E]: E→TE1
E1→+TE1∣ε
T→FT1
T1→*FT∣ε
F→(E) ∣i
2.1、 递归下降分析器程序源代码
#include<stdio.h>
void E();
void T();
void E1();
void T1();
void F();
void i();char s[100];
int j,k;int main(){
printf("请输入一个语句,以#号结束语句\n");while( 1 ){k = 0;j=0;scanf("%s",&s);if( s[0] == '#')return 0;E();if(k==0){if(s[j]=='#')printf("合法!\n");
}
printf("请输入一个语句,以#号结束语句\n");}
return 1;
}
void E(){if(k==0){
T();
E1();
}
}
void E1()
{
if(k==0)
{
if(s[j]=='+')
{++j;T();E1();}else if(s[j]!='#'&&s[j]!=')')
{
printf("不合法!\n");k=1;
}
}
}
void T()
{if(k==0)
{
F();
T1();
}
}
void T1(){
if(k==0)
{
if(s[j]=='*')
{
++j;
F();
T1();
}
else if(s[j]!='#'&&s[j]!=')'&&s[j]!='+')
{
printf("不合法!\n");
k=1;
}
}
}
void F()
{
if(k==0)
{
if(s[j]=='('){
++j;
E();
if(s[j]==')')
++j;
else if(s[j]== '#')
{
printf("不合法!\n括号不匹配\n");
++j;
k=1;
}
}
else i();
}
}
void i(){if(s[j]>='0'&&s[j]<='9')++j;else{printf("不合法!\n");k=1;}
}
2.2实验结果