- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LL(1)分析条件 通过上面的讨论,我们可以找出满足构造不带回溯的自顶向下分析的文法条件。 文法不含左递归 对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。即,若A→α1 |α2 | … |αn,则FIRST(αi)∩FIRST(αj)=Φ (i≠j) 对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则,FIRST(A)∩FOLLOW(A)=Φ 如果一个文法G满足以上条件,则称该文法G为LL(1)文法。 这里LL(1)中的第一个L表示从左到右扫描输入串,第二个L表示最左推导,1表示分析时每一步只需向前查看一个符号。 LL(1)分析条件 对于一个LL(1)文法,可以对其输入串进行有效的无回溯的自顶向下分析。 假设要用非终结符A进行匹配,面临的输入符号为a,A的所有产生式为A→α1 |α2 | … |αn 若a∈FIRST(αi),则指派αi去执行匹配任务。 若a不属于任何一个候选首字符集,则: 若ε属于某个FIRST(αi),且a∈FOLLOW(A),则让A与ε自动匹配; 否则,a的出现是一种语法错误。 根据LL(1)文法的条件,每一步这样的工作都是确信无疑的 LL(1)分析法 预测分析程序工作过程 实现LL(1)分析的一种有效方法是使用一张分析表和一个栈进行联合控制。下面要介绍的预测分析程序就是属于这种类型的LL(1)分析器。 预测分析表 预测分析表示一个M[A,a]形式的矩阵。其中A为非终结符,a是终结符或‘#’ 。 矩阵元素M[A,a]中存放着一条关于A的产生式,指出当A面临输入符号a时所应采用的候选。 M[A,a]中也可能存放一个“出错标志”,指出A根本不该面临输入符号a。 i + * ( ) # E E→TE’ E→TE’ E’ E’→+TE’ E’→ε E’→ε T T→FT’ T→FT’ T’ T’→ε T’→*FT’ T’→ε T’→ε F F→i F→(E) 预测分析过程概述 预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a行事的。如下图所示,对于任何(X,a),总控程序每次都执行下述三种可能的动作之一: 若X = a = ‘#’,则宣布分析成功,停止分析过程。 若X = a ≠‘#’,则把X从STACK栈顶弹出,让a指向下一个输入符号。 若X是一个非终结符,则查看分析表M。 若M[X,a]中存放着关于X的一个产生式,那么,先把X弹出STACK栈顶,然后把产生式的右部符号串按反序一一推进STACK栈(若右部符号为ε,则意味着不推什么东西进栈)。 在把产生式的右部符号退进栈的同时应该做这个产生式对应的语义动作(目前暂且不管)。 若M[X,a]中存放着“出错标志”,则调用出错诊断程序ERROR。 预测分析过程举例 i + * ( ) # E E→TE’ E→TE’ E’ E’→+TE’ E’→ε E’→ε T T→FT’ T→FT’ T’ T’→ε T’→*FT’ T’→ε T’→ε F F→i F→(E) i1*i2+i3 步骤 符号栈 输入串 所用产生式 0 #E i*i+i# 1 #E’T i*i+i# E→TE’ 2 #E’T’F i*i+i# T→FT’ 3 #E’T’i i*i+i# F→i 4 #E’T’ *i+i# 5 #E’T’F* *i+i# T’→*FT’ 6 #E’T’F i+i# 7 #E’T’i i+i# F→i 8 #E’T’ +i# 9 #E’ +i# T’→ε 10 #E’T+ +i# E’→+TE’ 11 #E’T i# 12 #E’T’F i# T→FT’ 13 #E’T’i i# F→i 14 #E’T’ # 15 #E’ # T’→ε 16 # # E’→ε 预测分析表的构造 FIRST集合和FOLLOW集合的定义 FIRST集合的构造算法 分析表的构造 分析表的构造 分析表的构造 FIRST集合构造的例子 FIRST(E’)={+,ε} FIRST(T’)={*,ε} FIRST(F)={( , i} FIRST(T)={( , i} FIRST(E)={( , i} E→TE’ E’→+TE’ | ε T→FT’ T’→*FT’ | ε F→(E) | i FOLLOW集合构造的例子 FOLLOW(E)={),#} FOLLOW(E’)={),#} FOLLOW(T)={+,),#} FOLLOW(T’)={+,),#} FOLLOW(F)={*,+,),#} E→TE’ E’→+TE’ | ε T→FT’ T’→*FT’ | ε F→(E) | i FIRST(E’)={+,ε} FIR
文档评论(0)