为 Menhir 配备抽象语法树时出现类型错误

Type error when equipping Menhir with an abstract syntax tree

编辑:

我的以下问题仍然存在,但我明白如果不筛选一堆代码就很难回答。因此,要问一个有点类似的问题,有没有人有任何 Menhir 被用来实现 AST 的例子? 最好不要 "toy" 像计算器这样的项目,但我会很感激任何帮助我可以得到。

原问题:

我正在尝试使用 Menhir 实现抽象语法树,但有一个问题我似乎无法解决。我的设置如下:

第二点是我真正在努力取得进步的地方。我有一个巨大的语法(ast.atd 文件长约 600 行,parser.mly 文件长约 1000 行)所以很难确定我哪里出错了。我怀疑我在某个地方遇到了类型错误。

代码片段

这是我的 ast.atd 文件的样子:

    ...
type star = [ Star ]

type equal = [ Equal ]

type augassign = [
  | Plusequal
  | Minequal
  | Starequal
  | Slashequal
  | Percentequal
  | Amperequal
  | Vbarequal
  | Circumflexequal
  | Leftshiftequal
  | Rightshiftequal
  | Doublestarequal
  | Doubleslashequal
]
    ...

这是我的 parser.mly 文件的样子:

    ...
and_expr // Used in: xor_expr, and_expr
    : shift_expr
        {  }
    | and_expr AMPERSAND shift_expr
        { `And_shift (, `Ampersand, ) } ;

shift_expr // Used in: and_expr, shift_expr
    : arith_expr
        {  }
    | shift_expr pick_LEFTSHIFT_RIGHTSHIFT arith_expr
        { `Shift_pick_arith (, , ) } ;

pick_LEFTSHIFT_RIGHTSHIFT // Used in: shift_expr
    : LEFTSHIFT
        { `Leftshift }
    | RIGHTSHIFT
        { `Rightshift } ;
    ...

我尝试用

编译文件时遇到的错误
ocamlbuild -use-menhir -tag thread -use-ocamlfind -quiet -pkgs
    'core,yojson,atdgen' main.native

是类型错误,即

This expression has type [GIANT TYPE CONSTRUCTION] but an expression
    was expected of type [DIFFERENT GIANT TYPE CONSTRUCTION]

我意识到这个问题有点难以像这样抽象地回答,我很乐意为我的代码的保管箱提供一个 link,但如果有人可以,我将不胜感激给我指出正确的方向。

可能感兴趣:我在 parser.mly 中有一些最初是 "empty" 的作品,我使用 ocaml option 类型(SomeNone).也许我在这里遇到了问题?

关于使用menhir的代码示例,您可以查看OPAM menhir page右边的列表-所有这些都依赖于menhir