编译原理递归下降子程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北华航天工业学院
《编译原理》课程实验报告
课程实验题目:递归下降子程序实验作者所在系部:计算机科学与工程系作者所在专业:计算机科学与技术
作者所在班级:xxxx
作者学号:xxxxx _ 作者姓名:xxxx
指导教师姓名:xxxxx
完成时间:2011年3月28日
一、实验目的
通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的优缺点。
二、实验内容及要求
1.针对算术表达式文法:E→TE’
E’→ +TE’|ε
T→FT’
T’→*FT’ |ε
F→(E) |i
为其编写递归下降子程序,判定某个算术表达式是否正确:如j+k*m,j*k+m
输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i
输出:分析结果:算术表达式结构正确或结构错误。
三、实验程序设计说明
1.实验方案设计
各个函数之间的调用关系如下图所示:
2.程序源代码
源代码如下:
#include
#include
#include
#include
char a[10];
int lookahead=0;
void E1();
void T();
void T1();
void F();
void E()
{
printf("E->TE'\n");
T();
E1();
}
void E1()
{
if(a[lookahead]=='+')
{
printf("E'->+TE'\n");
lookahead++;
T();
E1();
}
else
printf("T'->ε\n"); }
void T()
{
printf("T->FT'\n");
F();
T1();
}
void T1()
{
if(a[lookahead]=='*')
{
printf("T'->*FT'\n");
lookahead++;
F();
T1();
}
else
printf("T'->ε\n"); }
void F()
{
if(a[lookahead]=='i')
{
printf("F->i\n");
lookahead++;
}
else if (a[lookahead]=='(')
{
lookahead++;
E();
if(a[lookahead]==')'){
printf("F->(E)\n");
lookahead++;
}
else{
printf("\n括号不匹配分析失败!\n");
exit (0);
}
}
else{
printf("括号不匹配,分析失败!\n");
exit(0);
}
}
int main()
{
while(1)
{
printf("请输入算数表达式(以#键结束):");
scanf("%s",a);
E();
if((a[lookahead]=='#'))
printf("句子结构正确\n");
else
printf("无结束标志,分析失败\n");
}
return 0;
}
3.程序的执行结果
程序运行结果如下所示:
四、实验中出现的问题及解决方法
1.错误处理:最初程序只是将所有的错误都简单的显示为句子结构错误,并没有进行具体详细的说明和解释,最后通过修改程序,细化错误类型,使用了对if语句的嵌套,将错误分为三种类型。
2.句子结构分析:最初程序只能分析结构比较简单的句子类型,比如输入的字符不匹配等问题,输入类似i+i*+等缺少操作数结构类型的句子则不能做出正确的判断,通过修改
F()等相关函数解决了这个问题;但此程序只能分析此类文法的句子结构,如果文法改变则需要修改程序,才能进一步分析对应的句子结构。
尽管,在实验过程中遇到的问题得到了解决,但是仍然有很多缺陷。尤其是在进行错误处理时只有三种,并不完善,并没有对错误进行详细的分析和说明的功能。
五、体会、意见或建议
通过本次实验基本掌握了语法分析的原理和递归下降子程序分析方法,通过编写程序进一步复习巩固了c语言的相关知识,由于对c语言的掌握不扎实,在编程过程中遇到了很多基础性问题,通过不断的查阅课本,最终解决了问题,但程序仍然存在很多值得改进和完善的地方,这就提醒我们在以后的学习过程当中应该及时复习巩固以前学过的相关知识。