compiler3语法分析.ppt

  1. 1、本文档共163页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * 2.LR分析 1)逻辑结构 2)分析过程 状态栈 分析表 控制程序 GOTO表 分析动作表 3.如何构造SLR分析表 1)构造DFA 2)由DFA构造分析表 * * 除了递归子程序法,其他几种方法逻辑结构很象: 输入串 符号栈(状态栈) 控制程序 分析表 (1)对于LL(1)分析法 符号栈 αi (自顶向下,保证最左推导) LL(1)分析表 αi A A::=αi error 终结符 非终结符 首字符 * * (2)对于算法优先分析: 符号栈 栈内终结符 = error 栈外终结符 (3)LR分析: 符号栈 S0,S1…Sm #X0,X1…Xm 分析表 状态转移GOTO表 分析动作表 * * GOTO表 下一状态 状态 符号 根据栈顶状态和栈 顶符号推导出下一 状态 分析动作表 移进S 规约(rj) 状态 终结符号 根据栈顶状态和输入 符号推导出下一动作 * * 将GOTO表和分析动作表压缩后得: 状态 终结符号 非终结符号GOTO表 Si rj i(下一状态数) * * 1) 确定S集合,即LR(0)项目集规范族,同时确定S0 2) 确定状态转移函数GOTO ∴构造DFA方法: * * (2)构造LR(0)的方法 LR(0)是DFA的状态集,其中每个状态又都是项目的集合 项目:文法G的每个产生式(规则)的右部添加一个圆点就构成一个项目。 例:产生式:A→XYZ 项 目: A→.XYZ A→X.YZ A→XY.Z A→XYZ. 产生式:A→ε 项 目: A→. 项目的直观意义:指明在分过程中的某一时刻已经规约的部分和等待规约部分。 * * Ⅰ. 将文法扩充 构造LR(0)文法的方法(三步) 目的:使构造出来的分析表只有一个接受状态,这是 为了实现的方便。 方法:修改文法,使识别符号的规则只有一条 G[E] E→··· E→··· ··· 拓广 G[E] E→E E→··· E→··· ··· L(G(E))=L(G[E]) * * Ⅱ. 根据文法列出所有的项目 Ⅲ. 将有关项目组合成集合,即DFA中的状态; 所有状态再组合成一个集合,即LR(0)项目集规范族 我们通过一个具体例子来说明LR(0)的构造以及DFA 的构造方法 例:G[E] E→E+T|T T→T*F|F F→(E)|i * * 例:G[E] E→E+T|T T→T*F|F F→(E)|i 1 将文法拓广为G’[E’] (0) E’→E (4) T→F E→E+T (5) F→(E) E→T (6) F→i T→T*F 2 列出文法的所有项目 E’→.E E’→E. (3) E→.E+T (4) E→E.+T (5) E→E+.T (6) E→E+T. (7) E→.T (8) E→T. (9) T→.T*F (10) T→T.*F (11)T→T*.F (12)T→T*F. (13)T→.F (14)T→F. (15)F→.(E) (16)F→(.E) (17)F→(E.) (18)F→(E). (19)F→.i (20) F→i. * * 3 将有关项目组成项目集,所有项目集构成的集合即为LR(0) 为实现这一步,先定义: 项目集闭包closure 状态转移函数GOTO 例:G’[E’] 令I={E’→.E} closure(I)={E’→.E, E→.E+T, E→.T, T→.T*F, T→.F, F→.(E), F→.i } * * A.项目集闭包closure的定义和计算: 令I是文法G’的任一项目集合,定义closure(I)为项目集合I的闭包,可用一个过程来定义并计算closure(I)。 Procedure closure(I); begin 将属于I的项目加入closure(I); repeat

文档评论(0)

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

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

1亿VIP精品文档

相关文档