为什么野牛不自动转换语法?

Why bison does not convert grammar automatically?

我正在学习词法分析器和解析器,所以我正在阅读这本经典书籍:flex & bison(作者:John Levine,出版商:O'Reilly Media)。 给出了一个无法被bison解析的例子:

phrase : cart_animal AND CART | work_animal AND PLOW
cart_animal-> HORSE | GOAT
work_animal -> HORSE | OX

我很明白为什么不能。实际上,它需要 两个 个前瞻符号。

但是,通过简单的修改,它可以被解析:

phrase : cart_animal CART | work_animal PLOW
cart_animal-> HORSE AND | GOAT AND
work_animal -> HORSE AND | OX AND

我想知道为什么 bison 不能在这种简单的情况下自动翻译语法?

因为像这​​样简单的案例都是人为的,而在现实生活中的例子中,很难或不可能。

明确地说,如果你有一个 LR(k) 语法 k>1 并且你知道 k 的值,那么有一个机械转换,你可以用它来制作一个等效的 LR(1) 语法,而且你可以通过一些杂耍来修复减少动作,以便它们具有相同的效果(至少,只要它们不包含副作用).我不知道有哪个解析器生成器会这样做,部分原因是正确翻译归约操作会很棘手,部分原因是生成的 LR(1) 语法通常非常大,即使 k 的值很小.

但是,正如我上面提到的,您需要知道 k 的值才能执行此转换,事实证明没有算法可以采用语法并告诉您它是否是 LR(k)。因此,您所能做的就是连续尝试更大的 k 值,直到找到一个有效的值,或者您决定放弃。