- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四单元自顶向下的语法分析
第4章 自顶向下的语法分析(2) 语法分析(Syntax Analysis) 文法的改造问题 自顶向下(Top Down)的分析 推导(Derivation) 求FIRST(α) 的算法 令α= X1…Xn 初值 FIRST(α)= FIRST(X1)-{ε}; k=1; 循环 while ε∈FIRST(Xk)kn do FIRST(α)= FIRST(α)∪(FIRST(Xk+1)-{ε}) ; K=k+1; 结束处理 if k=nε∈FIRST(Xn) then FIRST(α)=FIRST(α)∪{ε} 求FOLLOW( A ) 的算法 令#为句子的结束符,对于所有非终结符, 重复进行以下计算 1) 将 # 加入到 FOLLOW(S) 2) 若 A→αBβ, 则 FOLLOW(B)=FOLLOW(B)∪(FIRST(β)–{ε}) 3) 如果A→αB或A→αBβ,且β?*ε,A≠B, 则 FOLLOW(B)=FOLLOW(B)∪FOLLOW(A) 例 表达式文法的语法变量的 FOLLOW 集 FOLLOW(E) = { #, ) } 自顶向下分析希望文法满足的条件 希望:从左到右扫描输入串,寻找它的一个最左推导,每次有唯一的产生式可用 对于 G 的每个非终结符 A 的任何两个不同的候选式 A→α|β 1) FIRST(α)∩FIRST(β)=φ 2) 如果β?*ε,则 FIRST(α)∩FOLLOW(A)=φ 2’)如果α?*ε,则 FIRST(β)∩FOLLOW(A)=φ ——文法G是 LL(1) 的充要条件 4.3.2 LL(1)文法 对G的任意变量A, A→α1|α2|…|αn是所有A产生式,如果它们满足下列条件,则称G是LL(1)文法, FIRST(αi)∩FIRST(αj)=Φ i≠j 且当ε∈FIRST(αj)时,FOLLOW(A)∩FIRST(αi)=Φ LL(1)文法是自顶向下方法能够处理的一类文法 第一个 L 表示从左向右扫描输入符号串 第二个 L 表示生成最左推导 1 表示读入一个符号可确定下一步推导 表达式文法是 LL(1) 文法 E → T E E→ + T E|ε T → F T T→ * F T|ε F → ( E )|id 此文法不满足LL(1)文法的条件,不能保证分析的每一步是确定的,这就是非 LL(1)文法的不确定性 例 对文法 S→cAd A→ab|a 输入 cad 的分析 不确定性的解决方法 1) 采用回溯算法 过于复杂 2)改写文法 将非 LL(1) 文法改写为等价的 LL(1) 文法 并非总有效 3)无法改写时 增加其它的判别因素 文法过于复杂,无法用自顶向下方法处理 4.4 预测分析器(LL(1)分析器) 4.4 预测分析器(LL(1)分析器) 系统维持一个分析表和一个分析栈,根据当前扫描到的符号,选择当前语法变量(处于栈顶)的候选式进行推导——希望找到相应的输入符号串的最左推导 组成 一个通用的控制算法 一个分析栈,#为栈底符号 一个输入缓冲区,#为输入串结束符 一个统一形式的分析表M 不同语言使用内容不同的分析表 考虑简单算术表达式文法的实现 FOLLOW( E)={ ), # } FOLLOW( T)={ +, ), # } FIRST(TE)={(,id} FIRST(+TE)={+} FIRST(FT)={(,id} FIRST(*FT)={*} FIRST((E))={(} FIRST(id)={id} 表达式文法的预测分析表 执行过程举例:分析 id+id*id(在黑板上同时画出语法树) 输入缓冲区 栈 输出 id+id*id# E # id+id*id# TE# E→TE id+id*id# FTE # T→FT id+id*id# idTE # F→id +id*id# TE # +id*id# E # T→ε +id*id# +TE # E→+TE id*id# TE # id*id# FTE # T→FT id*id# idTE# F→id *id# TE# *id# *FTE# T
文档评论(0)