Compiler construction 每个LL(1)语法也是LR(1)语法吗?

Compiler construction 每个LL(1)语法也是LR(1)语法吗?,compiler-construction,lr,Compiler Construction,Lr,每个LL(1)语法是否也是LR(1)?是,因为LL和LR都从左到右解析数据;由于LL(1)只向前看一个令牌,所以它必须是LR(1)。对于LR(k)也是如此,其中k>1,因为LR(k)语法可以转换为LR(1)语法 LR和LL语法之间的区别在于LR产生最右边的派生,而as LL产生最左边的派生。因此,这意味着LR解析器实际上可以解析比LL语法更大的集合,因为它是从叶子构建的 假设我们的产品如下: A -> "(" A ")" | "(" ")" Input Stack A

每个LL(1)语法是否也是LR(1)?

是,因为LL和LR都从左到右解析数据;由于LL(1)只向前看一个令牌,所以它必须是LR(1)。对于LR(k)也是如此,其中k>1,因为LR(k)语法可以转换为LR(1)语法

LR和LL语法之间的区别在于LR产生最右边的派生,而as LL产生最左边的派生。因此,这意味着LR解析器实际上可以解析比LL语法更大的集合,因为它是从叶子构建的

假设我们的产品如下:

A -> "(" A ")" | "(" ")"
Input  Stack          Action
(())   0       
())    0 '('
))     0 '(' '(' 
)      0 '(' '(' ')'  Reduce using A -> "(" ")"
)      0 '(' A
-      0 '(' A ')'    Reduce using A -> "(" A ")"
-      0  A           Accept
然后LL(1)将解析字符串
(())

其中,LR(1)将解析如下:

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

有关更多信息,请参见:

,但LL(1)用于解析的序列(生产序列)并不总是与LR(1)用于解析的序列(生产序列)相反。尽管前者是自上而下的解析器,后者是自下而上的解析器,所以您认为所有LL(1)都是LR(1)的理由似乎还不够。LR并不意味着解析树与反向LL解析树相同,因此解析器不一定会以相反的顺序使用结果。这意味着LR解析器可以正确解析给定相同语法的同一组字符串。这一事实是否矛盾?⊆-lr1/60764#60764我想我在大学里有一天在几个月前遇到了这个问题;)这里值得一提的是,LL(1)不包含在LR(0)中(因为epsilon规则)。