编译原理-递归下降分析法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理-递归下降分析法

PAGE  PAGE 7 实验二 递归下降分析法 一 实验目的 递归下降分析法。 二 实验要求 (一)准备: 1.阅读课本有关章节; 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E-TG (2)G-+TG|—TG (3)G-ε (4)T-FS (5)S-*FS|/FS (7)F-(E) (8)F-i 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (3)输出结果:i+i*i# 为合法符号串 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。 注意: (6)S-ε 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 3.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 三 实验内容 1.程序思路 (1)定义部分:定义常量、变量、数据结构。 (2)初始化:从文件将输入符号串输入到字符缓冲区中。 (3)利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 (4)实验思路: 利用程序设计语言的知识和大量编程技巧,递归下降分析法是一种较实用的分析法,通过练习,掌握函数间相互调用的方法。 四 实验结果 (1)当输入“i-i”,不但输出推导过程,还会把栈内的状态显示出来; (2)当输入“iii”,则直接输出“不符合该文法”; 五 实验总结 通过这次试验,让我更加熟悉掌握了自上而下语法分析法的特点。掌握了递归下降语法分析的基本原理和方法。运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。此分析法简单,直观,易构造分析程序,但是实验要求不灵活,换另一套语法,就要重新写,但思路不变。 在试验的过程中,遇到了一些小问题,算法思路不清晰,导致代码编写比较乱,后通过借鉴其它资料,把代码改写的更加精炼。通过这次试验,也让自己更加对算法感兴趣。 源代码 #include iostream #include iomanip #include string #include vector using namespace std; //stackStr : 模拟栈 string s, str, stackStr; int i; vectorstring v; void E(); void G(); void T(); void S(); void F(); void err(); int check(); void err(); void push(string pre, string value); void err(){ coutERRORendl; exit(0); } //将字符串存入输出栈 void push(string pre, string value){ int idx = stackStr.find_first_of(pre[0],0); if(value != ε) { stackStr.replace( idx, 1, value); } else { stackStr.erase(idx,1); } v.push_back((pre+value+,+stackStr)); } //验证是否已经到栈底 int check(){ if(i = s.size()) { return 1; } else if(s[i]==#) { return 1; } return 0; } void E(){ push(E--,TG); T(); G(); } void G(){ if(s[i] == + || s[i] == -) { str = s[i]; str += TG; push(G--,str); i++; T(); G(); } else { push(G--,ε); } } void T() { push(T--,FS); F(); S(); } void S(){ if(s[i]==* || s[i]==/) { str = s[i]; str += FS;

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档