在为项目开发编译器时,我遇到了某种类型的生产问题

While working on a compiler for a project, I had a problem with a certain type of production

expr ::= let ID : TYPE [ <- expr ] [[, ID : TYPE [ <- expr ]]]∗ in expr

我试图在 Bison 中实施此规则。

所以 expr 是非终结符,而 [[ ID : TYPE [ <- expr ]]]∗ 描述了一个正则表达式,我认为描述的唯一方法是结合使用一些规则

express: COMMA ID COL TYPE OSB ASSIGN expr CSB express  
    ;
expr : LET ID COL TYPE OSB ASSIGN expr CSB IN expr

其中COL代表冒号(:),OSB和CSB分别为[和],ASSIGN为<-,TYPE为int/char。

我觉得添加产生式在直觉上是有意义的,因为它允许我出现零次或多次表达式 [ ID : TYPE [ <- expr ]]. 我也将此逻辑应用于其他规则。但是,我现在遇到了一堆 shift-reduce 冲突,我相当确定这是罪魁祸首。但我不确定如何解决这个问题。

这是使用 Bison and Flex. The grammar is on page 16 of 30 的代码。

万一有人看到这个,链接的 GitHub 存储库包含正确的代码。否则,您可以使用 Cool 搜索 Compiler,您会发现同一事物的许多其他实现。