LR(0)解析器冲突

时间:2013-07-08 18:59:45

标签: parsing compiler-construction lr automaton

我对lr(0)解析器有疑问。 例如,我有以下语法:

S -> S N
   | 

N -> terminalsymbol

如果我尝试构造lr0自动机的第一个状态,我得到以下第一个状态:

S ' -> . S $ 

S -> . S N
S -> . 

所以在我看来这是一个愚蠢的怀疑。 因为我有“S - >”。在第一个状态中,这是lr0解析器中的shift / reduce的情况吗?因为解析器可以通过非终结S转移动作,或者通过空转换减少动作(我认为)。

我已经在网上搜索了一个空转换的示例,但我没找到一个。

1 个答案:

答案 0 :(得分:1)

如果你从增强语法开始,那就不是冲突了。

在初始状态下,没有可能的换档动作,只有一个减少动作。因此,必须无条件地进行减少行动。

一旦减少了S,你就会处于以下状态:

S' -> S . $
S  -> S . N
N  -> . nonterminal

将移动输入结束标记或以下非终端。假设它是非终端,我们最终会:

N  -> nonterminal .

这是另一个强制减少,这导致我们

S  -> S N .

然后我们回到:

S' -> . S $
S  -> . S N
S  -> .

但是,原始的未经修饰的语法不是LR(0)。 (没有包含空字符串和其他字符串的语言可以是LR(0)。)