为Menhir配备抽象语法树

时间:2017-03-20 15:57:18

标签: json parsing ocaml ocamlyacc menhir

编辑:

我的下面的问题仍然存在,但我很欣赏,如果不对一堆代码进行筛选,很难回答。因此,要问一个类似的问题,是否有人有任何Menhir用于实施AST的例子?最好不要"玩具"像计算器这样的项目,但我很感激我能得到的任何帮助。

原始问题:

我试图使用Menhir实现一个抽象语法树,而且我似乎无法解决这个问题。我的设置如下:

  • AST的规范是使用atdgen生成的。这基本上是一个文件,我的所有语法规则都转换为ATD格式。这允许我序列化一些JSON,这是我用来打印AST的。
  • 在我的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]

我意识到这个问题在这个摘要中有点难以回答,我很乐意提供链接到我的代码的Dropbox,但我真的很感激,如果有人能指出我的话在正确的方向。

可能有兴趣:我在解析器中有一些作品。最初是#34;空的"我使用ocaml option类型(SomeNone)来处理。也许我可能在这里遇到问题?

1 个答案:

答案 0 :(得分:1)

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