《编译原理》(实验部分)
实验6_自顶向下递归子程序法
一、实验目的
通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的优缺点。
二、实验设备
1、PC 兼容机一台;操作系统为WindowsWindowsXP。
2、Visual C++ 6.0 或以上版本, Windows 2000 或以上版本,汇编工具(在Software 子目录下)。
三、实验原理
针对算术表达式文法:E→TE’
E’→ +TE’|ε
T→FT’
T’→*FT’ |ε
F→(E) |i
为其编写递归下降子程序,判定某个算术表达式是否正确:如j+k*m,j*k+m
输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i
输出:分析结果:算术表达式结构正确或结构错误。
四、实验步骤
各个函数之间的调用关系如下图所示:
源代码如下:
#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\ E(); if((a[lookahead]=='#')) printf(\"句子结构正确\\n\"); else printf(\"无结束标志,分析失败\\n\"); } return 0; } 程序运行结果如下所示: 因篇幅问题不能全部显示,请点此查看更多更全内容