第五章作业10.pptVIP

  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文档。上传文档
查看更多
* 1 文法G[S] S→ a |∧ |(T) T→ T,S | S (2)给出(a,(a,a))和 (((a,a), ∧,(a)),a)的最左推导 S?(T) ?(T,S) ?(S,S) ?(a,S) ?(a,(T)) ?(a,(T,S)) ?(a,(S,S)) ?(a,(a,S)) ?(a,(a,a)) S ?(T) ?(T,S) ?(S,S) ?((T),S) ?((T,S),S) ?((T,S,S),S) ?((S,S,S),S) ?(((T),S,S),S) ?(((T,S),S,S),S) ?(((S,S),S,S),S) ?(((a,S),S,S),S) ? (((a,a),S,S),S) ? (((a,a), ∧,S),S) ?(((a,a), ∧,(T)),S) ?(((a,a), ∧,(S)),S) ?(((a,a), ∧,(a)),S) ?(((a,a), ∧,(a)),a) (2)对文法G进行改写,然后对每个非终结符写出不带回溯的递归子程序。 文法中含有左递归,一定不是LL(1)文法,不能应用递归子程序法,所以 a) 消除左递归,改写后的文法是: S → a | ∧ | (T) T→ ST’ T’→ ,ST’ | ε b) 判断文法是否为LL(1)文法 S → a S→∧ S→ (T) T→ ST’ T’→ ,ST’ T’→ ε LL(1)文法的充分必要条件是:对每个非终结符A的任意两个产生式,A→α ,A→β,满足 select(A→ α) ∩select(A→β)=Φ , LL(1)文法的判别: 1 求出能推出ε非终结符 { T’ } T’ T S FIRST S → a S→∧ S→ (T) T→ ST’ T’→ ,ST’ T’→ ε 3计算FOLLOW集 T’ T S FOLLOW , a ∧ ( a ∧ ( # ) ) , ) ε 2计算FIRST集 由S→ (T) 得Follow(T)={)} 由T→ ST’ 得 由于T’能推出ε 所以Follow(S)= (First(T’)-{ε})? Follow(T)={ , } ?{ ) } 由T→ ST’ 得 Follow(T’)= Follow(T)={ ) } select(S→a) 和select(S→ ∧) 和select(S→(T))两两不相交 Select(T ’→ ,ST’ ) ∩ select(T ’→ ε) = Φ 因为具有相同左部的产生式的SELECT集两两交集为空,所以此文法是LL(1)文法。 4计算SELECT集 SELECT(S → a ) ={ a } SELECT(S→∧) ={ ∧ } SELECT(S→ (T)) ={ ( } SELECT(T→ ST’ ) =First(ST’)={ a, ∧,( } SELECT(T ’→ ,ST’ ) ={ , } SELECT(T ’→ ε) =Follow(T’)={ ) } 用到的一些子过程: 过程GETNEXT负责读入下一个TOKEN字 过程ERROR负责报告语法错误 约定: 全局变量TOKEN存放已读入的TOKEN字 过程进入时变量TOKEN存放了一个待匹配的TOKEN字 退出过程时,变量TOKEN中仍存放着一个待匹配的TOKEN字。 c) 对每个非终结符写出不带回溯的递归子程序 递归子程序的写法: 若关于一个非终结符的产生式只有一条,直接按产生式右部写程序,右部是终结符就进行匹配,是非终结符就调用相应的子程序,如T→ ST’ 若关于一个非终结符的产生式不只一条,按select集合写成if条件语句,如: S → a, S→∧, S→ (T) SELECT(S → a ) ={ a } SELECT(S→∧) ={ ∧ } SELECT(S→ (T)) ={ ( } 若产生式右部为空串 可以不生成任何语句,或者按select集合,生成一条判断语句如:SELECT(T ’→ ε) ={ ) } 生成:if Token ≠‘)’ then Error; procedure S; /* S → a | ∧| (T)对应的程序 */ begin If TOKEN=‘a’ then GETNEXT(TOKEN) else if TOKEN=‘∧’ then GETNEXT(TOKEN) else if TOKEN=‘(’ then begin GETNEXT(TOKEN);

文档评论(0)

海川电子书城 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档