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

时间:2019-04-18 15:10:10

标签: parsing grammar bison context-free-grammar

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

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

我想知道为什么在这种简单的情况下,野牛无法自动翻译语法?

1 个答案:

答案 0 :(得分:2)

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

要清楚,如果您有一个LR(k) k>1语法,并且您知道k 的值,那么您就需要进行机械转换可以制作出等效的LR(1)语法,而且您还可以通过一些修改来修正归约动作,以使它们具有相同的效果(至少,只要它们不包含副作用)。我不知道任何解析器生成器会这样做,部分原因是正确转换归约动作会很棘手,部分原因是即使对于k的较小值,生成的LR(1)语法通常也很大。

但是,如上所述,您需要知道k的值才能执行此转换,事实证明,没有一种算法可以接受语法并告诉您它是否为{{1 }}。因此,您所能做的就是依次尝试更大的LR(k)值,直到找到一个可行的值,或者您决定放弃。