如何确定语法是LL(1)、LR(0)还是SLR(1)?
有谁能够使用这个示例或其他示例来解释一下吗?
X → Yz | a
Y → bZ | ε
Z → ε
如何确定语法是LL(1)、LR(0)还是SLR(1)?
有谁能够使用这个示例或其他示例来解释一下吗?
X → Yz | a
Y → bZ | ε
Z → ε
检查语法是否为LL(1)的一个方法是构建LL(1)分析表并检查任何冲突。这些冲突可能会有:
我们可以通过为每个非终端构建FIRST和FOLLOW集合来尝试对您的语法进行操作。在这里,我们得到:
FIRST(X) = {a, b, z}
FIRST(Y) = {b, epsilon}
FIRST(Z) = {epsilon}
我们还有FOLLOW集合:
FOLLOW(X) = {$}
FOLLOW(Y) = {z}
FOLLOW(Z) = {z}
基于此,我们可以构建以下 LL(1) 分析表:
a b z $
X a Yz Yz
Y bZ eps
Z eps
由于我们可以构建不带冲突的解析表,所以这个文法是LL(1)。
要检查一个文法是否是LR(0)或SLR(1),我们首先需要为该文法构建所有LR(0)配置集。在此情况下,假设X是您的起始符号,我们得到以下结果:
(1)
X' -> .X
X -> .Yz
X -> .a
Y -> .
Y -> .bZ
(2)
X' -> X.
(3)
X -> Y.z
(4)
X -> Yz.
(5)
X -> a.
(6)
Y -> b.Z
Z -> .
(7)
Y -> bZ.
从这里我们可以看出,语法不是LR(0),因为状态(1)存在移进/归约冲突。具体来说,由于我们有移进项目X → .a和Y → .,我们无法确定是将a移进还是规约为空字符串。更普遍地说,具有ε-productions的文法都不是LR(0)。
但是,这个文法可能是SLR(1)。为了看清楚这一点,我们用特定非终结符的展望集合扩充每个规约。这给出了SLR(1)配置集的集合:
(1)
X' -> .X
X -> .Yz [$]
X -> .a [$]
Y -> . [z]
Y -> .bZ [z]
(2)
X' -> X.
(3)
X -> Y.z [$]
(4)
X -> Yz. [$]
(5)
X -> a. [$]
(6)
Y -> b.Z [z]
Z -> . [z]
(7)
Y -> bZ. [z]
在状态(1)中的移位/规约冲突已被消除,因为我们仅在向前看符号为z时才进行规约,这不会与任何其他项发生冲突。
S -> Xb | Yc
X -> a
Y -> a
仅凭第一个输入符号“a”,您无法确定是应用产生式S -> Xb
还是S -> Yc
,因为“a”都在X和Y的FIRST集中。
FIRST/FOLLOW冲突的一个例子:
S -> AB
A -> fe | ε
B -> fg
仅凭第一个输入符号“ f”,您无法确定是应用产生式A -> fe
还是A -> ε
,因为“ f”既在A的FIRST集合中又在A的FOLLOW集合中(A可以被解析为空,B为f)。
请注意,如果没有ε-产生式,则不可能存在FIRST/FOLLOW冲突。
Take the simple grammar A -->Aa|b.[A is non-terminal & a,b are terminals]
then find the First and follow sets A.
First{A}={b}.
Follow{A}={$,a}.
Parsing table for Our grammar.Terminals as columns and Nonterminal S as a row element.
a b $
--------------------------------------------
S | A-->a |
| A-->Aa. |
--------------------------------------------
These are some simple checks.
LL(1)文法是一种上下文无关且无歧义的语法,可以由LL(1)解析器进行解析。
在LL(1)中:
要检查文法是否为LL(1),您可以绘制预测分析表。如果在表中找到多个条目,则可以说该文法不是LL(1)。
还有一种简便方法来检查文法是否为LL(1)。 快捷技巧