非递归预测分析器1

预测分析法1.实验目的与任务设计一个非递归预测分析器,实现对表达式语言的分析,理解自上而下语法分析方法的基本思想,掌握设计非递归预测分析器的基本方法。2.实验要求建立文法及其LL(1)分析表表示的数据结构,设计并实现相应的预测分析器,对源程序经词法分析后生成的二元式代码流进行预测分析,如果输入串是文法定义的句子则输出“是”,否则输出“否”。3.实验内容(1)文法描述及其LL(1)分析表表达式语言(XL)的语法规则如下:1.程序→表达式;2.|表达式;程序3.表达式→表达式+项4.|项5.项→项*因式6.|因式7.因式→num_or_id8.|(表达式)将该语言的文法转换为如下的LL(1)文法:1prgm→expr;prgm’8term→factorterm’2prgm’→prgm9term’→*factorterm’3prgm’→ε10term’→ε4expr→termexpr’11factor→(expr)5expr→ε12factor→num6expr’→+termexpr’13system_goal→prgm7expr’→ε该LL(1)文法的LL(1)分析表如下:TNNum+*();#prgm111prgm’2223expr4455expr’677term88term’1091010factor1211system_goal131313对文法中每个文法符号指定一个常数值,符号编码表如下:文法符号常数值备注(Num46终结符+);*#25130(#为输入结束标志)Exprexpr’termterm’factorprgmprgm’system_goal258260259262261256257263非终结符(2)文法及其LL(1)分析表的数据结构文法的产生式可用数组Yy_pushtab[]存放。数组的第一个下标是产生式号,第一个产生式的序号为0;每列按逆序存放该产生式右部各符号的常数值,并以0结束。对于该表达式语言XL的LL(1)分析表,可用数组Yy_d[]存放。第一个下标是非终结符数值,第二个下标是终结符数值,数组元素的值为:0(表示接受),1(表示产生式号),-1(表示语法错)。数组Yy_d[]的具体内容及表示如下:0123456#;+*()Numprgm256prgm’257expr258term259expr’260factor261term’262system_goal263数组Yy_pushtab[]的具体内容及表示如下:-10-1-10-1021-1-11-11-14-1-1343-1-1-1-17-17-165-1-16-1-1-1-1-110-111-1998-19-1-112-1-112-112257,1,258,0prgm’;expr256,0prgm0260,259,0expr’term0260,259,2,0expr’term+0262,261,0term’factor262,261,2,0term’factor*5,258,4,0)expr(06,0Num256,0prgm0123456789101112Yyp00Yyp01Yyp02Yyp03Yyp04Yyp05Yyp06Yyp07Yyp08Yyp09Yyp10Yyp11Yyp12(3)预测分析器总控程序结构预测分析器总控程序使用上面的两个表Yy_pushtab、Yy_d和一个分析栈(元素类型为int),其结构如下:初始化;/*把开始符号的常数值压入分析站,输入指向第一个输入符号*/while(分析栈非空){if(栈顶常数表示一个终结符)if(该常数与输入符号的常数不等)报语法错;else{把一个数从栈顶弹出;advance读下一输入符号;}else{/*栈顶的常数表示一个非终结符*/what_to_do=Yy_d[栈顶常数][当前输入符号的常数];if(what_to_do==-1)报语法错;else{把栈顶元素弹出栈;把Yy_pushtab[what_to_do]中列出的全部常数压入分析栈;}}}请实现该程序。在程序中添加输出栈内容的功能,以便和手工模拟分析过程作比较。(4)用预测分析器和手工模拟两种方式对文法的句子1+2;进行分析。综合分析过程可用下表表示。栈(符号)栈(数值)输入串What_to_dosystem_goalprgmprgm’;exprprgm’;expr’termprgm’;expr’term’factorprgm’;expr’term’Numprgm’;expr’term’prgm’;expr’prgm’;expr’term+prgm’;expr’termprgm’;expr’term’factorprgm’;expr’term’Numprgm’;expr’term’prgm’;expr’prgm’;prgm’26325625712582571260259257126026226125712602626257126026225712602571260259225712602592571260262261257126026262571260262257126025712602622571+2;#1+2;#1+2;#1+2;#1+2;#1+2;#+2;#+2;#+2;#2;#2;#2;#;#;#;##120371195711962(5)请考虑如何设计并实现LL(1)分析表的自动生成程序。源程序:预测分析法源程序:#include<iostream>#include<fstream>#include<iomanip>#include<string>usingnamespacestd;#definestacksize10#definestringsize20typedefstructsqst//定义分析栈{intdata[stacksize];intt...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?