实验 4 递归下降子程序的编写
一、实验目的
通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问
题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的
优缺点。
二、实验准备
1.预习自上而下语法分析小节的内容;
2.学生自己考虑使用的开发环境,如 VC++,熟悉开发环境。
三、实验内容
下列文法中选做一题:
1.针对算术表达式文法:E→TE’
E’ → +TE’|ε
T→FT’
T’ →*FT’ |ε
F→(E) |i
为其编写递归下降子程序,判定某个算术表达式是否正确:如 j+k*m,j*k+m
输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i
输出:分析结果:算术表达式结构正确或结构错误。
2.给定文法(PASCAL 语言标识符定义文法)(选做)
type→simple|↑id|array[simple] of type
Simple→integer|char|num dotdot num
其中:dotdot 表示.
编写递归下降子程序,判定一个句子结构是否正确:array [3..5]of integer
输入:其输入数据应该为词法分析器输出的单词序列:array[num dotdot num]
of integer
输出:分析结果
四、实验要求
1.编写程序调试运行;考虑如果将你的程序改为识别其他的文法,你的递归下
降子程序可否通用,考虑递归下降子程序方法的优缺点。
2.撰写实验报告:实验名称、实验目的、实验内容、实验结果、结果分析
五、实验结果
1、程序:
#include
#include
#include
#include
char EL[20];
int word=0;
void E1();
void T();
void T1();
void F();
//编写 E 函数
//E->TE
void E()
{
//因为是第一步,所以直接输出 E->TE'
printf("E->TE'\n");
T();
E1();
//如果为 i、则输出 F->i\n,如果为(则指针下
移、调用 E 函数、如果为)则输出 F->(E),否
则说明括号不匹配。
//F->(E)|i
void F()
{
}
//就是那个 E'函数
//E'->+TE'|ε
void E1()
{
//如果匹配为+号的话 输出 E'->+TE
if(EL[word]=='+')
{
printf("E'->+TE'\n");
word++;
T();
E1();
}
else
//如果不是加号、则输出空
printf("T'->ε\n");
}
//T->FT
void T()
{
printf("T->FT'\n");
F();
T1();
}
//如果匹配*则输出 T'->*FT,否则输出空
//T'->*FT|ε
void T1()
{
if(EL[word]=='*')
{
printf("T'->*FT'\n");
word++;
F();
T1();
}
else
}
printf("T'->ε\n");
if(EL[word]=='i')
{
printf("F->i\n");
word++;
}
else if (EL[word]=='(')
{
word++;
E();
if(EL[word]==')'){
printf("F->(E)\n");
word++;
}
else{
printf("\n 错误、括号不匹配(缺
少右括号)\n");
exit (0);
}
}
else{
式!\n");
}
printf("错误、请输入正确的算术表达
exit(0);
}
//主函数
//输入算数表达式、为其编写递归下降子程序,
判定算术表达式是否正确
int main()
{
while(1)
{
printf("请输入算数表达式:");
scanf("%s",EL);
E();
}
return 0;
}