递归下降分析法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程编译原理实验名称递归下降分析法
专业班级学号姓名
实验日期: 2015 年 5 月 20 日
一、实验目的
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。
二、实验内容
1、递归下降分析法的功能:词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。
三、实验环境
Visual c++ 6.0
四、实验步骤
代码:
#include
#include
char t[20];
char sym;
int p;
void T();
void E();
void G()
{
if(sym=='+')
{
printf("G->+TG…………%c\n",sym);
sym=t[p];
p++;
T();
G();
}
else if(sym=='-')
{
printf("G->-TG…………%c\n",sym); sym=t[p];
p++;
T();
G();
}
else
printf("S->ε…………%c\n",sym);
}
void F()
{
if(sym=='i')
{
printf("F->i…………%c\n",sym);
sym=t[p];
p++;
}
else if(sym=='(')
{
printf("F->(E)…………%c\n",sym); sym=t[p];
p++;
E();
if(sym==')')
{
sym=t[p];
p++;
}
else
{
printf("匹配不成功\n");
exit(0);
}
}
else
{
printf("匹配不成功\n");
exit(0);
}
}
void S()
{
if(sym=='*')
{
printf("S->*FS…………%c\n",sym);
sym=t[p];
p++;
F();
S();
}
else if(sym=='/')
{
printf("S->/FS…………%c\n",sym);
sym=t[p];
p++;
F();
S();
}
else
printf("S->ε…………%c\n",sym);
}
void T()
{
printf("T->FS…………%c\n",sym);
F();
S();
}
void E()
{
printf("E->TG…………%c\n",sym);
T();
G();
}
void main()
{
printf("请输入以#结尾的且由*,/,i,(,),+,-中任意几个组成的字符串:\n"); gets(t);
p=0;
sym=t[p];
p++;
E();
if(sym=='#')
printf("匹配成功\n");
else
printf("匹配不成功\n"); }
五、实验结果与讨论
六、总结
通过这次实验,使我对递归下降分析过程有了更进一步的了解。递归下降分析就是对每个非终结符按其产生式结构来构造相应语法分析子程序,其中终结符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。通过这次实验,对
递归下降分析程序的设计方法有了更深的理解,同时,也提高了自己的程序设计能力和调试技巧。