如果合并失败停止 LR(1) 到 LALR(1) 的转换
Should a merge failure stop the LR(1) to LALR(1) conversion
假设我有一组 LR(1) 状态,我想尝试将其转换为 LALR(1)。
我执行了查找具有相同 LR(0) 核心的状态的第一步,现在我正在执行合并过程。然而,不能合并这样一组状态中的一个,因为它会引入 RR 冲突。 我应该:
- 现在停止转换并说构造此状态机的语法不是 LALR(1) 语法,
- 还是我应该继续合并其他可能的状态,只有当 none 个这样的候选人可以合并时才停止?
冲突不会随着更多合并而消失,因此您可以立即停止并报告失败。
大多数解析器生成器会一直运行到最后,但是:
- 用户可能希望了解所有冲突,而不仅仅是第一个发现的冲突,以便调试他们的语法;
- 有时,解决冲突的简单试探法可以成功生成可用的解析器。 (例如,Yacc 首先使用声明的运算符优先级进行解析,然后优先使用 shift 而非 reduce,最后优先使用语法中较早出现的归约。)
假设我有一组 LR(1) 状态,我想尝试将其转换为 LALR(1)。 我执行了查找具有相同 LR(0) 核心的状态的第一步,现在我正在执行合并过程。然而,不能合并这样一组状态中的一个,因为它会引入 RR 冲突。 我应该:
- 现在停止转换并说构造此状态机的语法不是 LALR(1) 语法,
- 还是我应该继续合并其他可能的状态,只有当 none 个这样的候选人可以合并时才停止?
冲突不会随着更多合并而消失,因此您可以立即停止并报告失败。
大多数解析器生成器会一直运行到最后,但是:
- 用户可能希望了解所有冲突,而不仅仅是第一个发现的冲突,以便调试他们的语法;
- 有时,解决冲突的简单试探法可以成功生成可用的解析器。 (例如,Yacc 首先使用声明的运算符优先级进行解析,然后优先使用 shift 而非 reduce,最后优先使用语法中较早出现的归约。)