Parsing LR(0)解析器冲突

Parsing LR(0)解析器冲突,parsing,compiler-construction,lr,automaton,Parsing,Compiler Construction,Lr,Automaton,我对lr(0)解析器有疑问。 例如,我有以下语法: S -> S N | N -> terminalsymbol 如果我尝试构造lr0自动机的第一个状态,我会得到以下第一个状态: S ' -> . S $ S -> . S N S -> . 所以在我看来这是一个愚蠢的怀疑。 由于我在第一个状态中有“S->”,这是lr0解析器中的移位/减少情况吗?因为解析器可以通过非终结符S来执行移位操作,或者通过空转换来减少操作(我认为) 我已经在网上搜索了一个

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

S -> S N
   | 

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

S ' -> . S $ 

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


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

如果你从扩充语法开始,它不是冲突

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

一旦减少S,您将进入以下状态:

S' -> S . $
S  -> S . N
N  -> . nonterminal
这将移动输入端标记或以下非端子。假设它是非终端,我们最终得到:

N  -> nonterminal .
这是另一个强制减少,这导致我们

S  -> S N .
然后我们回到:

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

但是,原始未经整理的语法不是LR(0)。(包括空字符串和其他字符串的任何语言都不能是LR(0)。

谢谢您的回答。我是新来的。所以没有冲突,因为在第一个状态中不可能有移位操作,对吗?当您说“并且只有一个reduce操作”与空转换相关时?如果一个点(
)正好位于非终结符之前,则在状态中可以有移位操作。如果某个点位于生产结束时,则可以进行减少。如果两者都是真的,或者有两种不同的减少,那么就存在冲突。否则,你所能做的就是你所能做的(转移或减少,视情况而定),没有冲突。再次感谢你的帮助。还有一个问题。如果我有follow语法(S->num S,S->),在第一个状态下我会得到一个shift-reduce冲突?因为符号'num'是一个终端,所以我们可以移位,我们可以通过空的转换来减少?我的想法正确吗?