编辑:
下面的问题仍然存在,但我理解,如果不仔细筛选一堆代码,就很难回答。因此,为了问一个有点类似的问题,是否有任何使用Menhir来实现AST?的例子,最好不是像计算器那样的“玩具”项目,但是我希望能得到任何帮助。
原题:
我试图使用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
{ $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,但是如果有人能指出正确的方向,我会非常感激的。
可能令人感兴趣的是:我在parser.mly中有一些最初“空”的产品,我使用ocaml option类型(Some和None)来处理这些产品。也许我在这里会有问题?
发布于 2017-03-20 16:59:10
关于使用menhir的代码示例,您可以查看OPAM menhir页面右侧的列表--所有这些都依赖于menhir。
https://stackoverflow.com/questions/42908273
复制相似问题