【发布时间】:2017-03-20 15:57:18
【问题描述】:
编辑:
我下面的问题仍然存在,但我很感激如果不筛选一堆代码就很难回答。因此,要问一个有点类似的问题,有没有人有任何 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 中有一些产品最初是“空的”,我使用 ocaml option 类型(Some 和 None)处理了这些产品。也许我在这里有问题?
【问题讨论】:
-
您能否删除旧问题并在必要时在另一个问题中提出?这将有助于人们寻找有关 menhir 示例的答案。
标签: json parsing ocaml ocamlyacc menhir