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


expr ::= let ID : TYPE [ <- expr ] [[

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

我试图在野牛中实施这条规则。

所以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 : 类型 [ <- expr ]]。 我也将此逻辑应用于其他规则。然而,我现在遇到了一堆减少班次的冲突,我相当确定这是罪魁祸首。但我不确定如何解决这个问题。

这是使用Bison和Flex的代码。语法在第 16 页,共 30 页。

如果有人看到这个,链接的 GitHub 存储库包含正确的代码。否则,你可以使用Cool搜索编译器,你会发现同一件事的几十个其他实现。

最新更新