语法分析的方法.ppt

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

1 1  用产生式(1)、(2)的右部置换产生式(3)中的A得 到左部为B的产生式: (1)B  aBc (2)B   Bbc (3)B   d  消除左递归后得: (1)B  (αBc|d)B` (2)B`   bcB`| ε  再把原来其余的产生式(1)、(2)加入,最终文法为: (1)A  αB (2)A   Bb (3)B  (αBc|d)B` (4)B`   bcB`| ε 3)消除文法中一切左递归的算法: 对文法中一切递归的消除要求文法中不含回路即无A  A  的推导 满足这个要求的充分条件是,文法中不包含形如A  A  的有害规则和A   ε的空产生式 算法步骤: (1)把文法的所有非终结符按某一顺序排序,如: A1| A2|… |An + (2)从A1开始消除左部为A1的产生式的直接左递归,然  后把左部为A1的所有规则的右部逐个替换左部为A2右部以  A1开始的产生式中的A1,并消除左部为A2的产生式中的直  接左递归。继而以同样方式把A1、A2的右部代入左部为A3  右部以A1或A2开始的产生式中,消除左部为A3的产生式之  直接左递归,直到把左部为A1,A2,…,An-1的右部代入  左部为An的产生式中,从An中消除直接左递归 把上述算法归结为:若非终结符的排序为: A1| A2|… |An FOR i:=1 TO N DO BEGIN FOR j:=1 TO i-1DO BEGIN  若Aj的所有产生式为:  Aj  δ 1| δ 2|… | δ k    替换形如Ai Ajr的产生式变为:   Ai   δ1r| δ2r|… | δkr  END 消除Ai中的一切直接左递归 END  (3)去掉无用产生式 例如 若文法的产生式为: (1)S  Qc|c (2)Q  Rb|b (3)R  Sa|a  该文法的每个非终结符为间接左递归,消除方法: 非终结符排序为:S、Q、R 把(1)右部代入(3)得: (4)R  Qca|ca|a 再将(2)的右部代入(4)得: (5)R`  Rbca|bca|ca|a 对(5)消除直接左递归得:  R  (bca|ca|a)R`  R`  bcaR`|ε  最终文法变为:  S  Qc|c  Q  Rb|b  R  (bca|ca|a)R`  R`  bcaR`|ε 非终结符排序为:R、Q、S 把(3)右部代入(2)得: Q  Sab|ab|b 再将此式代入(1)得: S  Sabc|abc|bc|c 消除该产生式的左递归得: S   (abc|bc|c|)S` S`  abcS`| ε Q  Rb|b R  Sa|a  由于Q、R为不可到达的非终结符,所以删除得最终文法: S   (abc|bc|c|)S` S`  abcS`| ε 结论:当非终结符排序不同时,最后结果的产生式形式不  同,但它们是等价的 5.4 不确定的自顶向下分析思想 不确定的自顶向下分析(带回溯的自顶向下分析):在文  法中当关于某个非终结符的产生式有多个候选时,而面临  当前的输入符无法确定选用唯一的产生式,从而引起回溯 1.由于相同左部产生式的右部FIRST集交集不为空而引起回溯 例如,文法: S   xAy A   ab|a 若当前输入串为xay 2.由于相同左部非终结符的右部存在能   ε的产生式,且  该非终结符的FOLLOW集中含有其他产生式右部FIRST  集的元素  例如,文法G[S]为: S   aAS     S   b   A   bAS   A   ε   对输入串ab#的试探推导, 如右图所示: * 3.由于文法含有左递归而引起回溯  例如,文法G[S]为: S   Sa     S   b    对输入串baa#的试探推导,如下图所示: 由以上例子可知:   带回溯的自顶向下分析是是一个试探过程,当分析不成 功时则推翻分析退回到适当位置再重新试探其余候选可能的 推导,这样需要记录已选过的产生式,直到把所有可能的推 导序列都试完仍不成功才能确认输入串不是该文法的句子而 报错 由于在编译程序真正实现时往往是边分析边插入语义动作,  因而带回溯分析代价很高,效率很低,在实用编译程序中  几乎不用,因此对它实现的详细算法不做介绍 5.5 确定的自顶向下分析方法 1.递归子程序法:   实现思想:是对应文法中每个非终结符编写一个递归过 程,每个过程的功能是识别由该非终结符推出的串,当某非 终结符的产生式有多个候选时能够按LL(1)形式可唯一地确 定选择某个候选进行推导  缺点: 对文法要求高,必须满足LL(1)文法,个别LL(2)例外 速度慢占用空间多 2.预测分析方法:  预测分析器的组成

文档评论(0)

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

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

1亿VIP精品文档

相关文档