网站大量收购独家精品文档,联系QQ:2885784924

自上而下语法实验报告剖析.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自上而下语法实验报告剖析

自上而下语法分析 实验目的: 1.根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。(选做) 2.根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。(必做) 本次实验的目的主要是加深对自上而下分析法的理解。实验内容: 程序的功能描述 LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。具体描述如下: 对下列文法,对任意输入的符号串进行分析: (1)E-TG (2)G-+TG (3)G-ε (4)T-FS (5)S-*FS (6)S-ε (7)F-(E) (8)F-i 输入一以#结束的符号串(包括+—*/()i#): 输出结果:包括分析栈、数组中的剩余字符串以及所用的产生式,形如: 分析栈 剩余输入串 所用产生式 E i+i*i# E-TG 其中有如下两点要求: 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); (二)LL(1)分析法实验设计思想及算法 三、程序设计的过程以及关键函数的功能 (一)模块结构: 1、定义部分:定义常量、变量、数据结构。 2、初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体等); 3、运行程序:让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则; 4、利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简单的错误提示。 (二)程序的整体流程及关键函数解析: 1、定义一个栈,用于存放非终结符 将终结符和非终结符各存放在一个数组中,用于判断栈顶元素是否是终结符或非终结符,然后根据情况判断接下来是查表,还是进行匹配移进。 定义一个全局变量f,用于指示从文件中读出的匹配后的剩余字符串中的首个字符在数组中的位置。当输出栈时,同时输出剩余字符串。 4、对于chaxun( )函数,X在 v2[5]中的位置相当于表的行位置,sym在v1[6]中的位置,相当于表的列位置。根据查表操作可以判断(X,sym)对于的表中是否有产生式。 bool chaxun(char X,char sym){ int m=feizhongjie(X ); int n=iszhongjie(sym); char str[10]; strcpy(str,table[m][n]); if (strlen(str)==0) { return false;} else {if (str[0]!=^) { for (int i=strlen(str)-1;i=0;i--) push(str[i]); } print(); cout\tv2[m]--strendl; return true;} } 读文件,并将文件里的内容读入数组b[ ]中。 6、根据表中的产生式,对栈顶元素根据情况进行移进匹配操作,知道剩余表达式中无非终结符为止,即匹配成功。否则,则匹配失败,给出的字符表达式无法由给定的文法推出。 while (flag!cuo) { X=pop();//把符号栈的式子付给x if (X==#) { if(sym==X) { cout输入的是合法符号串endl; flag=false; } else cout非法的符号串endl; } else if(iszhongjie(X)!=-1) { //如果是终结符跳到if if(X==sym) { f++; sym=fgetc(fp); } else printf(错误);} else if(!chaxun(X,sym)) cuo=true; } 四、运行结果: 输入文件内容:i+i*i 若输入i++i*i,显示如下: 若输入i*(i+i),显示如下: 五、实验总结 通过本次实验,我初步掌握了ll(1)文法,在写代码的过程中也加深了我对栈的理解,,老师课上已经讲解了许多,而且实验时也指导了我们一些该注意的地方,中间还是有一些小问题但是,在判断输入串是否匹配的时候,还是有些问题,不过总体目标还是完成了,当然问题最多的还是栈顶元素与剩余字符串的移进匹配过程,这一点我老是搞不太清楚。不过在同学的帮助和指导下

文档评论(0)

ee88870 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档