LL(1)语法的例子不是LALR?

问题描述 投票:6回答:2

我现在正在学习关于编译理论课程的解析器。我需要找到LL(1)但不在LALR中的语法示例。我知道它应该存在。请帮我想一想这个问题最简单的例子。

parsing compilation
2个回答
14
投票

Some googling为非LALR(1)语法提出了这个例子,它是LL(1):

S ::= '(' X 
    | E ']' 
    | F ')'
X ::= E ')' 
    | F ']'
E ::= A
F ::= A
A ::= ε

LALR(1)构造失败,因为在E和F之间存在减少 - 减少冲突。在LR(0)状态集中,存在由

E ::= A . ;
F ::= A . ;

这是S和X上下文所需要的。 LALR(1)这些项目的前瞻设置因此混合了源自S和X产品的令牌。这对于LR(1)是不同的,其中对于这些情况存在不同的状态。

对于LL(1),通过查看第一组备选方案来做出决策,其中')'和']'总是出现在不同的备选方案中。


1
投票

来自龙书(第二版,第242页):

可以使用LR方法解析的语法类是可以使用预测或LL方法解析的语法类的正确超集。对于语法为LR(k),我们必须能够以右句形式识别生产右侧的出现,其中k个输入符号为先行。这个要求远不如LL(k)语法那么严格,在这些语法中我们必须能够识别生产的使用,只看到右边派生的前k个符号。因此,LR语法可以描述比LL语法更多的语言也就不足为奇了。

© www.soinside.com 2019 - 2024. All rights reserved.