0

编辑:

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

原始问题:

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

  • AST 的规范是使用atdgen生成的。这基本上是一个将我的所有语法规则都转换为 ATD 格式的文件。这允许我序列化一些我用来打印 AST 的 JSON。
  • 在我的 parser.mly 文件中,我有一长串生产清单。当我使用 Menhir 时,我可以将这些产生式链接到 AST 节点的创建,即解析器的每个产生式都对应于在 AST 中记录值的指令。

第二点是我真正努力取得进展的地方。我有一个巨大的语法(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
        { $1 }
    | and_expr AMPERSAND shift_expr
        { `And_shift ($1, `Ampersand, $3) } ;

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

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]

我意识到这个问题在这样的抽象中有点难以回答,我很高兴提供指向我的代码保管箱的链接,但如果有人能指出我正确的方向,我将不胜感激。

可能感兴趣:我在 parser.mly 中有一些产品最初是“空的”,我使用 ocamloption类型 ( Someand None) 处理了这些产品。也许我可能在这里遇到问题?

4

1 回答 1

1

关于代码使用示例,您可以查看OPAM menhir 页面menhir右侧的列表- 所有这些都取决于。menhir

于 2017-03-20T16:59:10.800 回答