2010-11-14 107 views

回答

8

是的,因为这两个LL和LR解析从左至右的数据;并且由于LL(1)仅向前看一个令牌,它必须是LR(1)。 LR(k)也是如此,其中k> 1,因为LR(k)语法可以转换为LR(1)语法。

LR和LL文法之间的差异来在LR产生最右边的推导,其中作为LL产生最左推导。所以这意味着一个LR解析器实际上可以解析一个比LL语法更大的集合,因为它从树叶中建立起来。

,假设我们已经制作如下:

​​

然后LL(1)将解析字符串(())

(()) -> A 
    -> "(" A ")" 
    -> "(" "(" ")" ")" 

凡为LR(1)将解析如下:

Input Stack   Action 
(()) 0  
()) 0 '(' 
))  0 '(' '(' 
)  0 '(' '(' ')' Reduce using A -> "(" ")" 
)  0 '(' A 
-  0 '(' A ')' Reduce using A -> "(" A ")" 
-  0 A   Accept 

欲了解更多信息,请参阅:http://en.wikipedia.org/wiki/LL_parsing

+0

但使用的LL(1)来解析序列(生产的)并不总是相反的顺序(生产的)的LR(1)使用解析。即使前者是自上而下的,而后者是自下而上的解析器,所以你所有的LL(1)都是LR(1)的理由似乎不够。 – siddharth 2010-11-14 01:43:45

+1

东西是LR并不意味着分析树与等同于逆LL语法分析树,而语法分析器因而将不一定使用制作以相反的顺序。它意味着一个LR解析器可以正确地解析给定相同语法的同一组字符串。 – Mike 2010-11-14 03:31:11

+0

这个事实矛盾吗? http://cs.stackexchange.com/questions/60763/does-my-grammar-contradict-ll-⊆-lr1/60764#60764 – Pranav 2016-07-24 11:51:12