我对lr(0)解析器有疑问。 例如,我有以下语法:
S -> S N
|
N -> terminalsymbol
如果我尝试构造lr0自动机的第一个状态,我得到以下第一个状态:
S ' -> . S $
S -> . S N
S -> .
所以在我看来这是一个愚蠢的怀疑。 因为我有“S - >”。在第一个状态中,这是lr0解析器中的shift / reduce的情况吗?因为解析器可以通过非终结S转移动作,或者通过空转换减少动作(我认为)。
我已经在网上搜索了一个空转换的示例,但我没找到一个。
答案 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)。)