我正在学习词法分析器和解析器,所以我正在阅读这本经典的书: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
我想知道为什么在这种简单的情况下,野牛无法自动翻译语法?
答案 0 :(得分:2)
因为像这样的简单案例都是人造的,在现实生活中,这是困难的或不可能的。
要清楚,如果您有一个LR(k)
的k>1
语法,并且您知道k
的值,那么您就需要进行机械转换可以制作出等效的LR(1)
语法,而且您还可以通过一些修改来修正归约动作,以使它们具有相同的效果(至少,只要它们不包含副作用)。我不知道任何解析器生成器会这样做,部分原因是正确转换归约动作会很棘手,部分原因是即使对于k
的较小值,生成的LR(1)语法通常也很大。
但是,如上所述,您需要知道k
的值才能执行此转换,事实证明,没有一种算法可以接受语法并告诉您它是否为{{1 }}。因此,您所能做的就是依次尝试更大的LR(k)
值,直到找到一个可行的值,或者您决定放弃。