LR解析总结计划.docxVIP

  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文档。上传文档
查看更多
实验五 LR 分析 .实验目的与任务 设计一个 LR分析器,实现对表达式语言的分析,加深对 LR 语法分析方法的 基本思想的理解,掌握 LR分析器设计与实现的基本方法。 2.实验要求 太原科技大学 计算机学科学与技术院 计算机 08200 班 李永峰 建立文法及其 LR 分析表表示的数据结构,设计并实现一个 LALR(1)的分析 器,对源程序经词法分析后生成的二元式代码流进行分析, 如果输入串是文法定 义的句子则输出“是” ,否则输出“否”。 3.实验内容 (1)文法描述及其 LALR(1)分析表 描述表达式语言的文法 G如下: 0. S → E 1. E→E+T 2. E → T 3. T→T*F 4. T → F 5. F→(E) 6. F→ID 该文法的 LALR(1)分析表如下: 分析表 动作 Action 表(Yy_action ) 转 移 Goto 表 状态 (Yy_goto) # ID + * ( ) S E T F 0 - S1 - - S2 - - 3 4 5 1 R6 - R6 R6 - R6 - - - - 2 - S1 - - S2 - - 6 4 5 3 A - S7 - - - - - - - 4 R2 - R2 S8 - R2 - - - - 5 R4 - R4 R4 - R4 - - - - 6 - - S7 - - S9 - - - - 7 - S1 - - S2 - - - 10 5 8 - S1 - - S2 - - - - 11 9 R5 - R5 R5 - R5 - - - - 10 R1 - R1 S8 - R1 - - - - 11 R3 - R3 R3 - R3 - - - - SN = 移进并转移到状态 N A = accept 接受 RN = 按第 N条产生式进行规约 - = error 转移 (2)LR 分析器总控程序框架如下: push(0); advance(); while(Action[tos][sym]!=accept) if(Action[tos][sym]== ’- ’ ) error(); else if (Action[tos][sym]==SN){ push(N); advance(); } else if ( Action[tos][sym]==RN{ act(N); pop( 产生式 N 的右部的符号个数 ); push(Goto[ 新 tos][ 产生式 N的左部符号 ]) ; } accept(); 上述算法中的有关函数与符号的意义如下: accept() :返回成功状态, LR 分析器停止工作; act(N) :执行利用产生式 N的归约的动作,通常为产生代码; advance() :丛输入流读下一单词到 sym; error() :出错处理; pop(N) :从栈顶弹出 N个符号(状态); push(N) :把状态 N压入状态栈; sym:当前输入的单词符号; tos :栈顶状态号。 (3)存放 LR分析表的数据结构 ① 实现方法一:用一个二维整数数组表示 数组元素为表示动作的整数。数组的行下标为状态号,列下标用来表示终结符与非终结符的整数表示。数组元素可作如下约定: 正整数:表示移进动作,如 S6用数 6 表示; 负整数:表示归约动作,如 R5用数 -5 表示; 0:表示接受,通常为按产生式 0 归约; 状态号也用整数表示; 用不可能是状态号的较大的整数表示错误转移。 请将上述 LALR(1)分析表用这种表示方法, 完成 LR分析器的程序设计, 并添加输出状态栈内容的功能。 用上述表达式文法 G的一个句子作为输入,进行测试。 ② 实现方法二:采用压缩表示法 动作 Action 表的每一行用一个数组表示,数组的第一个元素是本数组中存放的数偶个数, 第二个元素到最后一个元素都以 [ 终结符,动作 ] 的数偶的形式存放。再用一个以状态号为下标的下标数组, 每个元素含一个指向数偶数组的指针。若数组元素的值为 NULL,则表示从此状态无转移弧发出。若分析表有几行相同, 则只需保存一行,其它元素则都指向存放这一行表的数组即可。转移 Goto 表也按同样方式组织,只是这个行数组的数偶为 [ 非终结符,下一状态号 ] 。 每个行数组 Yyan表示动作表 Yy_action 的一行,每个行数组 Yygn 表示转移表 Yy_goto 的一行。假定上述表达式文法 G中终结符及非终结符的整数值为: 终结符:# ID + * ( ) 非终结符:S E T F 整数值:0 1 2 3 4 5 整数值: 0 1 2 3 Yy_action 数组是以状态号为下标的下标数组, 每个元素含有指向数组 Yyan 的指针;下标数组 Yy_goto 的每个元素含有指向数组

文档评论(0)

150****0902 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档