何时/如何解决这个PLY Shift-Reduce解析器生成器中的COOL语言冲突?

时间:2017-11-13 18:00:29

标签: python parsing compiler-construction ply

我正在为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规范做错任何事。

否则,我应该在语义分析阶段处理这个吗?有关如何做的任何想法?

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

1 个答案:

答案 0 :(得分:0)

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

  

<expr>的{​​{1}}扩展到目前为止(包含尽可能多的令牌)。

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

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