为 Menhir 配备抽象语法树时出现类型错误
Type error when equipping Menhir with an abstract syntax tree
编辑:
我的以下问题仍然存在,但我明白如果不筛选一堆代码就很难回答。因此,要问一个有点类似的问题,有没有人有任何 Menhir 被用来实现 AST 的例子? 最好不要 "toy" 像计算器这样的项目,但我会很感激任何帮助我可以得到。
原问题:
我正在尝试使用 Menhir 实现抽象语法树,但有一个问题我似乎无法解决。我的设置如下:
- AST 的规范是使用 atdgen 生成的。这基本上是一个文件,我的所有语法规则都已转换为 ATD 格式。这允许我序列化一些 JSON,这是我用来打印 AST 的内容。
- 在我的 parser.mly 文件中有一长串生产清单。当我使用 Menhir 时,我可以 link 这些产生式直到 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
{ }
| 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
类型(Some
和 None
).也许我在这里遇到了问题?
关于使用menhir
的代码示例,您可以查看OPAM menhir page右边的列表-所有这些都依赖于menhir
。
编辑:
我的以下问题仍然存在,但我明白如果不筛选一堆代码就很难回答。因此,要问一个有点类似的问题,有没有人有任何 Menhir 被用来实现 AST 的例子? 最好不要 "toy" 像计算器这样的项目,但我会很感激任何帮助我可以得到。
原问题:
我正在尝试使用 Menhir 实现抽象语法树,但有一个问题我似乎无法解决。我的设置如下:
- AST 的规范是使用 atdgen 生成的。这基本上是一个文件,我的所有语法规则都已转换为 ATD 格式。这允许我序列化一些 JSON,这是我用来打印 AST 的内容。
- 在我的 parser.mly 文件中有一长串生产清单。当我使用 Menhir 时,我可以 link 这些产生式直到 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
{ }
| 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
类型(Some
和 None
).也许我在这里遇到了问题?
关于使用menhir
的代码示例,您可以查看OPAM menhir page右边的列表-所有这些都依赖于menhir
。