Parsing LR解析器reduce/reduce(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显然不是终

假设我有以下上下文无关语法,按照特定顺序(对于YACC):

  • z→ x
  • z→ z x
如果我有以下输入:

(z(z x

解析器是否会减少:

  • “x”到“z”
  • “z x”到“z”
  • 我想是2号,但不太清楚为什么。非常感谢


    编辑:更改了用于澄清的输入

    您的语法是左关联的,因为它是左递归的。左关联意味着在从左到右扫描输入时,将贪婪地完成生成。通过扫描另一个
    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
    的过程会很快发生。