为什么野牛不自动转换语法?
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
值,直到找到一个有效的值,或者您决定放弃。
我正在学习词法分析器和解析器,所以我正在阅读这本经典书籍: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
值,直到找到一个有效的值,或者您决定放弃。