我的下面的问题仍然存在,但我很欣赏,如果不对一堆代码进行筛选,很难回答。因此,要问一个类似的问题,是否有人有任何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,但我真的很感激,如果有人能指出我的话在正确的方向。
可能有兴趣:我在解析器中有一些作品。最初是#34;空的"我使用ocaml option
类型(Some
和None
)来处理。也许我可能在这里遇到问题?