文法判断算法
⑴ 为什么说不存在一个可以判断文法是否有二义性的算法 如题
二义性是那些模棱两可的语句产生的,所以不能用算法消除 追问: 不是消除,是判断 回答: 那也没有判断的,只能自己判断,因为二义性它不是错误语句,不管怎样它都能运行 追问: 难道不存在一个分析树算法,判断是否有两种分析树? 回答: 说实话我真没有见过有这种算法
⑵ 如何判断一个文法是否为SLR(1)文法
是。
例如证明下列文法是ll(1)文法但不是slr(1)文法
s->aaab|bbba
a->ᵋ(空值)
b->ᵋ(空值)
(1)首先该文法无左递归存在,没有公共左因子.
其次:对于s→aaab|bbba
first(aaab)={a}
first(bbba)={b}
first(aaab)∩first(bbba)=φ
所以该文法是ll(1)文法.
(2)证明该文法不是slr的.
文法的lr(0)项目集规范族为:
i0={s’→.s
s→.aaab
s→.bbba
a→.
b→.}
i1={
s’→
s.
}
i2={
s→a.aab
}
i3={
s→b.bba
}
i4={
s→aa.ab
a→.
}
i5={
s→bb.ba
b→.
}
i6={
s→aaa.b
}
i7={
s→bbb.a
}
i8={
s→aaab.
}
i9={
s→bbba.
}
考察i0:
follow(a)={a,b}
follow(b)={a,b}
follow(a)∩follow(b)=
{a,b}
产生规约-规约冲突.
所以该文法不是slr(1)文法.
⑶ MATLAB问题求解,文法推断算法的问题,最后结果是无限循环,估计问题出在参数定义或者循环条件上
...
⑷ 为什么说不存在一个可以判断文法是否有二义性的算法
二义性是那些模棱两可的语句产生的,所以不能用算法消除 追问: 不是消除,是判断 回答: 那也没有判断的,只能自己判断,因为二义性它不是错误语句,不管怎样它都能运行 追问: 难道不存在一个分析树算法,判断是否有两种分析树? 回答: 说实话我真没有见过有这种算法
⑸ 如何判断文法是SLR,LR,LALR
1、构造它的LR(0)项目集合的DFA(即识别该文法全部活前缀的DFA); 2、根据该DFA画出该文法的LR(0)分析表; 3、在分析表中,每格要么只有一个内容,要么没有内容,(即无冲突)则为LR(0)文法。
⑹ 如何判断文法是SLR(1),LR(1),LALR(1)
LL(1)就是向前只搜索1个符号,即与FIRST()匹配,如果FIRST为空则还要考虑FELLOW。
LR需要构造一张LR分析表,此表用于当面临输入字符时,将它移进,规约(即自下而上分析思想),接受还是出错。
LR(0)找出句柄前缀,构造分析表,然后根据输入符号进行规约。
SLR(1)使用LR(0)时若有冲突,不知道规约,移进,活移进哪一个,所以需要向前搜索,则只把有问题的地方向前搜索一次。
LR(1)1.在每个项目中增加搜索符。2.举个列子如有A->α.Bβ,则还需将B的规则也加入。
LALR(1)就是假如两个产生式集相同则将它们合并为一个,几合并同心集。
我认为LR(1),SLR(1),LALR(1)只是对LR(0)的一种更全面的分析与考虑,关键先把LR(0)搞懂。
⑺ 编译原理实现判断是不是一个文法的句子
构造LL(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。
⑻ 怎么判断一个文法是LR(0)
LR(0)分析就是LR(K)分析当K=0的情况,亦即在分析的每一步,只要根据当前的栈顶状态 (或者说根据当前分析栈中已移进或归约出的全部文法符号)就能确定应采取何种分析动作,而无须向前查看输入符号。
LR(0)分析器的分析能力最低,但它是构造其余三种LR分析器的基础。SLR是“简单LR”分析的缩写,它是为了解决构造LR(0)分析器所出现的问题而形成的一种方法,其分析能力自然要比LR(0)分析器稍强一些。
(8)文法判断算法扩展阅读:
1965年,D.Knuth首先提出了LR(K)文法及LR(K)分析技术。所谓LR(K)分析,是指从左至右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再向前查看K个输入符号,就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成,从而也就可以确定当前所应采取的分析动作。
LR分析是当前最一般的分析方法。这是因为它对文法的限制最少,现今能用上下文无关文法描述的程序设计语言一般均可用LR方法进行有效的分析,而且在分析的效率上也不比诸如不带回溯的自顶向下分析、一般的“移进归约”以及算符优先等分析方法逊色。
此外,LR分析器在工作过程中,还能准确及时地发现输入符号串的语法错误。凡此种种,就使LR分析方法在国际上受到了广泛的重视。
⑼ 如何判断一个文法是LL文法
对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的产生式A->α|β 满足下列条件:
(1)如果α、β均不能推导出ε,则 FIRST(α) ∩ FIRST(β) = Φ。
(2)α 和 β 至多有一个能推导出 ε。
(3)如果 β *═> ε,则 FIRST(α) ∩ FOLLOW(A) = Φ。
将满足上述条件的文法称为LL(1)文法。
第一个L代表从左向右扫描输入符号串,第二个L代表产生最左推导,1代表在分析过程中执行每一步推导都要向前查看一个输入符号——当前正在处理的输入符号。
LL(1)文法既不是二义性的,也不含左递归,对LL(1)文法的所有句子均可进行确定的自顶向下语法分析。
并不是所有的语言都可以用LL(1)文法来描述,而且不存在判定某语言是否是LL(1)文法的算法。也就是说,确定的自顶向下分析只能实现一部分上下文无关语言的分析,这就是LL(1)文法所产生的语言。另外,在上述LL(1)文法的条件中,要求:ε ∈ FIRST(α1),ε ∈ FIRST(α2),…ε ∈ FIRST(αn) 中至多有一个成立。