基本要求:
①掌握语法分析方法。
②掌握使用算符优先分析法。
③完成语法分析程序的设计和实现。
④程序能完成对指定语言的语法分析。
重点及难点:熟悉算符优先分析等语法分析方法,掌握语法分析的一般过程。在此基础上完成基于算数表达式的语法分析程序的设计和调试运行。
一.递归下降分析器
在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下,我们就可能构造一个不带回溯的自上而下的分析程序,这个分析程序是由一组递归过程(或函数)组成的,每个过程(或函数)对应文法的一个非终结符。这样的一个分析程序称为递归下降分析器。
本次实验完成如下文法的递归下降分析器的设计。
文法G[E]为:
G[E]: E→E+T∣T
T→T*F∣F
F→(E)∣i
经过消去直接左递归后得到文法G’[E]为:
G’[E]: E→TE’
E’→+TE’∣ε
T→FT’
T’→*FT∣ε
F→(E) ∣i
//该文法对应的递归下降分析器如下:
void match (token t)
{
if (lookahead == t)
lookahead = nexttoken;
else error ( );
}
void E( )
{
T( );
E'( );
}
void E'( )
{
if (lookahead == '+')
{
match ('+');
T( );
E'( );
}
}
void T( )
{
F( );
T'( );
}
void T'( )
{
if (lookahead =='*')
{
match ('*');
F( );
T'( );
}
}
void F( )
{
if (lookahead == 'i')
match ('i');
else if (lookahead =='(')
{
match ('(');
E ( );
if (lookahead ==')')
match (')');
else error ( );
}
else error ( );
}
二.源代码
//递归下降分析器
#include<stdio.h>
#include<string>
char str[10];
int index=0;
void E();
void X();
void T();
void Y();
void F();
int main()
{
int len;
int m;
printf("请输入测试的次数:");
scanf("%d",&m);
while(m--)
{
printf("请输入表达式:");
scanf("%s",str);
len=strlen(str);
str[len]='#';
str[len+1]='\0';
E();
printf("正确语句!\n");
strcpy(str,"");
index=0;
}
return 0;
}
void E()
{
T();
X();
}
void X()
{
if(str[index]=='+')
{
index++;
T();
X();
}
}
void T()
{
F();
Y();
}
void Y()
{
if(str[index]=='*')
{
index++;
F();
Y();
}
}
void F()
{
if(str[index]=='i')
{
index++;
}
else if (str[index]=='(')
{
index++;
E();
if(str[index]==')')
{
index++;
}else{
printf("\n分析失败,错误语句!\n");
exit (0);
}
}
else{
printf("分析失败,错误语句!\n");
exit(0);
}
}