首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Menhir配备抽象语法树时输入错误

为Menhir配备抽象语法树时输入错误
EN

Stack Overflow用户
提问于 2017-03-20 15:57:18
回答 1查看 142关注 0票数 0

编辑:

下面的问题仍然存在,但我理解,如果不仔细筛选一堆代码,就很难回答。因此,为了问一个有点类似的问题,是否有任何使用Menhir来实现AST?的例子,最好不是像计算器那样的“玩具”项目,但是我希望能得到任何帮助。

原题:

我试图使用Menhir实现一个抽象语法树,但有一个问题我似乎无法解决。我的安排如下:

  • AST的规范是使用阿特根生成的。这基本上是一个文件,我所有的语法规则都被翻译成ATD格式。这允许我序列化一些JSON,这是我用来打印AST的。
  • 在我的parser.mly文件中,我有一个很长的生产列表。当我使用Menhir时,我可以将这些结果链接到AST节点创建,即解析器中的每个产品对应一个指令,以便在AST中记录一个值。

第二点是我真的在努力取得进步。我有一个庞大的语法( ast.atd文件长约600行,parser.mly文件长约1000个),所以很难找出我出错的地方。我想我在路上的某个地方有一个类型错误。

代码片段

下面是我的ast.atd文件的样子:

代码语言:javascript
复制
    ...
type star = [ Star ]

type equal = [ Equal ]

type augassign = [
  | Plusequal
  | Minequal
  | Starequal
  | Slashequal
  | Percentequal
  | Amperequal
  | Vbarequal
  | Circumflexequal
  | Leftshiftequal
  | Rightshiftequal
  | Doublestarequal
  | Doubleslashequal
]
    ...

下面是我的parser.mly文件的样子:

代码语言:javascript
复制
    ...
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 } ;
    ...

当我试图用

代码语言:javascript
复制
ocamlbuild -use-menhir -tag thread -use-ocamlfind -quiet -pkgs
    'core,yojson,atdgen' main.native

是类型错误,即

代码语言:javascript
复制
This expression has type [GIANT TYPE CONSTRUCTION] but an expression
    was expected of type [DIFFERENT GIANT TYPE CONSTRUCTION]

我意识到这个问题很难用这样的抽象来回答,我很乐意提供一个链接到我的代码的dropbox,但是如果有人能指出正确的方向,我会非常感激的。

可能令人感兴趣的是:我在parser.mly中有一些最初“空”的产品,我使用ocaml option类型(SomeNone)来处理这些产品。也许我在这里会有问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-20 16:59:10

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42908273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档