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
添加到列表中即可。
我正在为 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 alet
extends as far (encompasses as many tokens) as the grammar allows.
这等于说它具有尽可能低的优先级(与赋值相同)。
我假设您正在为 expr
规则使用优先级声明,因此只需将 let
添加到列表中即可。