如何判断一个文法是LL文法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断一个文法是LL文法相关的知识,希望对你有一定的参考价值。
LL(1)是一种自顶向下的分析文法,是非二义的。所以你如果能为一个输入串构造两棵语法树就不是LL(1)。另外一种直观的判定。LL(1)是向后展望1个字符,如果出现规约冲突就不是LL(1).例子可以参考:判断下列文法是否是
LL(1)
文法
文法
G
[S]... 参考技术A 1.
对文法g的句子进行确定的自顶向下语法分析的充分必要条件是,g的任意两个具有相同左部的产生式a->α|β
满足下列条件:
(1)如果α、β均不能推导出ε,则
first(α)
∩
first(β)
=
φ。
(2)α
和
β
至多有一个能推导出
ε。
(3)如果
β
*═>
ε,则
first(α)
∩
follow(a)
=
φ。
将满足上述条件的文法称为ll(1)文法。
2.
第一个l代表从左向右扫描输入符号串,第二个l代表产生最左推导,1代表在分析过程中执行每一步推导都要向前查看一个输入符号——当前正在处理的输入符号。
3.
ll(1)文法既不是二义性的,也不含左递归,对ll(1)文法的所有句子均可进行确定的自顶向下语法分析。
4.
并不是所有的语言都可以用ll(1)文法来描述,而且不存在判定某语言是否是ll(1)文法的算法。也就是说,确定的自顶向下分析只能实现一部分上下文无关语言的分析,这就是ll(1)文法所产生的语言。另外,在上述ll(1)文法的条件中,要求:ε
∈
first(α1),ε
∈
first(α2),…ε
∈
first(αn)
中至多有一个成立。
编译原理题目关于判断LL(1)文法的
下列文法中____是LL(1)文法。(S是公理)
A . S→aSb|ab B.S→ab|Sab
C. S→aS|b D .S→aS|Sa
各位答案什么?为什么
B 和D不是,因为含有左递归
C是,因为SELECT(S→aS) 与SELECT(S→b)的交集为空,符合LL(1)文法的定义。 参考技术A 选C
因为 C里面 FIRST(aS)yuFIRST(b)为空
以上是关于如何判断一个文法是LL文法的主要内容,如果未能解决你的问题,请参考以下文章