编译原理实验ll1文法的判断及转换.docxVIP

编译原理实验ll1文法的判断及转换.docx

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理实验LL(1)文法的判断及转换 ———————————————————————————————— 作者: ———————————————————————————————— 日期: ? 2016.11.30 LL(1)文法的判断及转换 目录 TOC \o "1-3" \h \z \u 一、实验名称 2 二、实验目的 2 三、实验原理 2 1、First集定义 2 2、Follow集定义 2 3、Select集定义 3 4、含左递归文法 3 四、实验思路 3 1、求非终结符是否能导出空 3 2、求First集算法 3 3、求Follow集算法 3 4、求Select集算法 4 五、实验小结 4 六、附件 4 1、源代码 4 2、运行结果截图 10 一、实验名称 ?LL(1)文法的判断及转换 二、实验目的 输入:任意一个文法 输出:(1)是否为LL(1)文法   (2)若是,给出每条产生式的select集     (3)若不是,看看是否含有左公共因子或者含有左递归,并用相应的方法将非LL(1)文法变成LL(1)文法,并输出新文法中每条产生式的select集。 三、实验原理 1、First集定义 令X为一个文法符号(终止符或非终止符)或ε,则集合First(X)有终止符组成,此外可能还有ε,它的定义如下: 1.?若X是终止符或ε,则First(X)=?{X}。 2.?若X是非终结符,则对于每个产生式X—>X1X2…Xn,First(X)包含了First(X1)-{ε}。 若对于某个i?<?n,所有的集合First(X1),...?,First(Xi)都包含了ε,则First(X)也包?括了First(Xi+1)-?{ε}。若所有集合First(X1),...,First(Xn)都包括了ε,则First(X)也包括了ε。 2、Follow集定义 给出一个非终结符A,那么集合Follow(A)则是由终结符组成,此外可能还含有#(#是题目约定的字符串结束符)。集合Follow(A)的定义如下: 1. 若A是开始符号,则#在Follow(A)中。 2. 若存在产生式B—>αAγ,则First(γ)- {ε}在Follow(A)中。 3. 若存在产生式B—>αAγ,且ε在First(γ)中,则Follow(A)包括Follow(B)。 3、Select集定义 ?对于产生式A—>α。集合select(A—>α)定义如下: 1. 若α不能推出ε,则select(A—>α) = first(α)。 2. 若α能推出ε,则select(A—>α)= first(α)∪ follow(A)。 4、含左递归文法 一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。   左递归分为直接左递归和间接左递归。 直接左递归经过一次推导就可以看出文法存在左递归,如P→Pa|b。   间接左递归侧需多次推导才可以看出文法存在左递归,如文法:S→Qc|c,Q→Rb|b,R→Sa|a有S =>Qc =>Rbc =>Sabc 四、实验思路 本次实验采用python完成。 1、求非终结符是否能导出空 ?a. 第一轮扫描。当前的产生式还没被删除,非终结符lp可以导出空,将以该非终结符为左部的产生式标记为要删除的。产生式右部分解,若该产生式右部包含终结符,删除该产生式因为由它不会导出空。判断没有被删除的产生式中是否还有以该非终结符为左部的产生式。 b. 第二轮扫描。逐一扫描每一条产生右部的每一个符号,循化直至每个非终结符的状态都确定下来。 2、求First集算法 存储每一个非终结符对应的First集,扫描每一条产生式,记录每一轮扫描是每个非终结符First集是否增大过。全部初始化为没有增大的状态,对于课本的五种类型依次求解,每次将结果加入对应的集合中,若一次扫描First集没有增大,则说明循环结束。 ?3、求Follow集算法 存储每一个非终结符对应的Follow集,将'#'加入文法的开始符号的Follow集合中,记录每一轮扫描是每个非终结符Follow集合是否增大过,全部初始化为没有增大的状态,扫描每一条产生式的右部,扫描到非终结符,判断在该非终结符之后的子串能否推导空,若该符号串可以推导出空,还要将Follow(lp)加入到里面。 4、求Select集算法 ?初始化每条产生式对应的Select集合为空,若产生式右部不能推导出空,则将右部的First集加入Select集,如果可以推出空,则需要同时将左部的Follow集合右部的First集去掉空的部分加入Select集。 五、实验

文档评论(0)

177****0805 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档