Parsing LR解析器reduce/reduce(YACC等)
假设我有以下上下文无关语法,按照特定顺序(对于YACC):Parsing LR解析器reduce/reduce(YACC等),parsing,yacc,lr,Parsing,Yacc,Lr,假设我有以下上下文无关语法,按照特定顺序(对于YACC): z→ x z→ z x 如果我有以下输入: (z(z x 解析器是否会减少: “x”到“z” “z x”到“z” 我想是2号,但不太清楚为什么。非常感谢 编辑:更改了用于澄清的输入您的语法是左关联的,因为它是左递归的。左关联意味着在从左到右扫描输入时,将贪婪地完成生成。通过扫描另一个x并减少长度,您总是有一个z扩展到更长的z 关于您的问题,您不能输入z z x,因为输入由终端符号组成。大概x是终端符号(否则语法不完整)。z显然不是终
- z→ x
- z→ z x
编辑:更改了用于澄清的输入您的语法是左关联的,因为它是左递归的。左关联意味着在从左到右扫描输入时,将贪婪地完成生成。通过扫描另一个
x
并减少长度,您总是有一个z
扩展到更长的z
关于您的问题,您不能输入z z x
,因为输入由终端符号组成。大概x
是终端符号(否则语法不完整)。z
显然不是终端符号
你可以考虑一种部分句子形式zx
。然而,这种形式不能由这种语法生成
从z
开始,接下来的步骤是生成x
(并完成)或生成zx
。接下来可能的步骤是以两种方式之一替换z
:生成x
(并完成)或生成zx
如您所见,这些规则无法访问字符串
z z x
。如果您有一个输入'z x',您的解析器将反对z是未知符号(因为它是一个规则,而不是一个标记)。让我尝试重新表述输入,这可能会更有帮助。假设输入是:(z(z x这是一个语法错误,因为语法中没有关于开括号的内容。正确。让我们假设输入是z x,它应该消除关于关联性的任何歧义,如果存在这种歧义,让我们假设它是正确关联的,即它首先查看最右边的标记。输入不能是z x,因为z是不是象征。但是,可能有“句子形式”(部分减少输入)这种形式。它会出现在Yacc解析器的堆栈上。输入以x
的形式出现。第一个x
被移位,然后减少到z
。现在你有了zx
。因为你的语法是递归的,所以减少到z
的过程会很快发生。