我正在为Cool:The Classroom面向对象语言编写一个编译器。我按照手册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 之后移位或者使用 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 添加到< em> LET表达。
我的主要问题是:
我应该重做语法以避免这种冲突吗?如果我应该,我该怎么做?因为我认为我没有按照COOL规范做错任何事。
否则,我应该在语义分析阶段处理这个吗?有关如何做的任何想法?
提前致谢。 我希望我解释自己。如果没有,请告诉我,我会尽力解释。
答案 0 :(得分:0)
我不知道为什么let
不在手册第11节的表达式优先级列表中,但第7节说
<expr>
的{{1}}扩展到目前为止(包含尽可能多的令牌)。
这无异于说它具有最低可能的优先级(与赋值相同)。
我认为您正在使用let
规则的优先声明,因此只需将expr
添加到列表中。