When/How 解决 COOL 语言解析器生成器中的 PLY Shift-Reduce 冲突?

When/How to solve this PLY Shift-Reduce conflict in parser generator for COOL language?

我正在为 Cool: the Classroom Object-Oriented Language 制作一个编译器。我按照手册 Cool-manual.pdf 创建语法并在 python 3.5.2 中使用 PLY 3.10 我设法创建了一个词法分析器和一个解析器,但不知何故它在这个产品上发现了 Shift-Reduce 冲突:

expr : LET ID COLON TYPE assign_optional let_assignments IN expr

expr 是一个非终结符号,它会产生一些东西,其中包括上面的 "LET...." 但是,因为这个 LET 产生以“...IN expr”,这意味着来自 yacc 的 LALR(1) 解析器不知道它是否应该在最后一个 expr 之后移动或 REDUCE expr.

例如:

最后一个表达式可能是这样的:

a + 2

在 COOL 允许的情况下,我也可以这样做:

expr : expr + expr #that means expr produces expr PLUS expr

因此,在 LET 中的最后一个 expr 之后,我可以得到一个 + (或任何允许的)。例如,在这一行

LET a:Int <- 3 IN a + 2 + c

可能意味着添加 a + 2 + c 作为 LET 内部的表达式或添加 c LET 表达式.

的结果

我的主要问题是:

我是否应该重做语法以避免这种冲突?如果我应该,我会怎么做?因为我认为我遵循 COOL 规范没有做错任何事情。

否则,我应该在语义分析阶段处理这个问题吗?有什么想法吗?

提前致谢。 我希望我解释了自己。如果没有,请告诉我,我会尽力解释得更好。

我不知道为什么 let 不在手册第 11 节的表达式优先级列表中,但第 7 节说

The <expr> of a let extends as far (encompasses as many tokens) as the grammar allows.

这等于说它具有尽可能低的优先级(与赋值相同)。

我假设您正在为 expr 规则使用优先级声明,因此只需将 let 添加到列表中即可。