如果合并失败停止 LR(1) 到 LALR(1) 的转换

Should a merge failure stop the LR(1) to LALR(1) conversion

假设我有一组 LR(1) 状态,我想尝试将其转换为 LALR(1)。 我执行了查找具有相同 LR(0) 核心的状态的第一步,现在我正在执行合并过程。然而,不能合并这样一组状态中的一个,因为它会引入 RR 冲突。 我应该:

冲突不会随着更多合并而消失,因此您可以立即停止并报告失败。

大多数解析器生成器会一直运行到最后,但是:

  • 用户可能希望了解所有冲突,而不仅仅是第一个发现的冲突,以便调试他们的语法;
  • 有时,解决冲突的简单试探法可以成功生成可用的解析器。 (例如,Yacc 首先使用声明的运算符优先级进行解析,然后优先使用 shift 而非 reduce,最后优先使用语法中较早出现的归约。)