编译原理递归下降预测分析(1)doc资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》课程实验报告
课程实验题目:
作者所在系部:计算机科学与工程系作者所在专业:计算机科学与技术
作者所在班级:
作者学号:
作者姓名:
指导教师姓名:
一、实验目的
通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的优缺点。
二、实验内容及要求
1.给定文法:
S→(T)|a+S|a
T→T,S|S
改写文法,使其可以使用递归下降子程序方法进行分析,编写递归下降子程序,判断句子:(((a+a+a),a+a),a)是否符合该文法。
输入:(((a+a+a),a+a),a)
输出:结构正确或结构错误
2.编写程序调试运行;考虑如果将你的程序改为识别其他的文法,你的递归下降子程序可否通用,考虑递归下降子程序方法的优缺点。
三、实验程序设计说明
1.实验方案设计
1.match;函数:从文件中依次读字符
2.S函数:判断表达式是否满足S→(T)|aS1。
3.S1函数:判断表达式是否满足S1→(a+)S1|e
4.T函数:判断表达式是否满足T→ST1
5.T1函数:判断表达式是否满足T1→,ST1|e
6.error函数:输出错误信息到屏幕
2.程序源代码
#include
#include
void match(char t);
void S();
void S1();
void T();
void T1();
void error();
char lookahead;
char a[100];
int i=0;
int j=0;
int x=0;
void match(char t)
{
if(lookahead==t)
lookahead=a[++j];
else error();
}
void S()
{
if(lookahead=='(')
{
match('(');
T();
if(lookahead==')')
match(')');
else error();
}
else if(lookahead=='a')
{
match('a');
S1();
}
else error();
}
void S1()
{
if(lookahead=='+')
{
match('+');
S();
}
}
void T()
{
S();
T1();
}
void T1()
{
if(lookahead==',')
{
match(',');
S();
T1();
}
}
void error()
x=-1;
}
void main()
{
cout<<"请输入一个表达式(((a+a+a),a+a),a)(以@结束):";
char c;
cin>>c;
char s;
cin>>s;
while(s!='@')
{
a[i]=s;
i++;
cin>>s;
}
lookahead=*a;
S();
if(x==-1)
cout<<"不匹配"< if(x==0) cout<<"匹配"< } 3.程序的执行结果 4.实验程序的优点和特色 1.输入是以读文件的方式进行,避免了输入时的繁琐; 2.递归下降子程序的健壮性较好,能准确分析出表达式错误的位置等; 3.采用C语言极其部分函数编写,易懂。 四、实验中出现的问题及解决方法 在这次实验中出现了以下问题: (1)对于表达式的内容如何更快的输入,避免繁琐。 采用了以文件读写的方式 (2)实验中编写的递归下降子程序无法准确的分析表达式错误的位置。 针对程序的健壮性问题,通过和同学讨论补充了error函数,用于判断表达式是否错误并输出错误信息到屏幕。 五、体会、意见或建议 通过此次实验,更加深入的了解递归下降预测分析的原理和过程以及可能存在的回溯问题。掌握了解决方法,为预测分析表方法的学习奠定了基础,明白了递归下降子程序的优缺点。 在实验过程中,出现了一些问题,在得同学以及老师的帮助下完成了此次实验内容。本实验基本达到了老师的要求,实现了递归下降子程序的编写的基本功能。