2012-03-21 63 views
0

假设我有以下上下文无关文法,在那个特定的顺序(YACC):LR分析器降低/减少(YACC等)

  • Ž→X
  • Ž→ZX

如果我有一个输入:

(Z(ZX

将解析器减少:

  1. 'X' 到 'Z'
  2. 'Z X' 到 'Z'

我想到的是它的2号,但我不明白为什么。非常感谢

编辑:改变输入澄清

+1

如果你有'z z x'的输入,你的解析器会反对z是一个未知符号(因为它是一个规则,而不是一个标记)。 – 2012-03-21 21:46:10

回答

1

你的语法是向左结合的,因为它是左递归。左联合意味着当输入从左到右扫描时,产品将会贪婪地完成。你总是有一个z,它通过扫描另一个x并减少,延长到更长的z

关于你的问题,你不能有一个输入z z x,因为输入由终端符号组成。据推测,x是一个终端符号(否则语法不完整)。 z显然是非终结符。

你可以考虑部分句子形式z z x。然而,这种形式不能由这个语法产生。

z开始,您的下一步是生成x(并因此完成)或生成z x。接下来可能的步骤是用以下两种方法之一替换z:生成x x(并完成)或生成z x x

正如您所见,这些规则无法访问字符串z z x

+0

让我尝试更改输入,然后可能会更有帮助.. 让我们假设输入是:(z(zx – teh0wner 2012-03-22 13:03:42

+0

)这是一个语法错误,因为在语法中没有关于左括号的内容 – Kaz 2012-03-22 17:57:18

+0

正确。假设输入是zx,它应该消除关联性的任何不明确性,并且如果存在这种模糊性,让我们假设它是右联合的,即它首先查看最右边的标记。 – teh0wner 2012-03-23 14:42:29