【问题标题】:Type error when equipping Menhir with an abstract syntax tree为 Menhir 配备抽象语法树时出现类型错误
【发布时间】: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 类型(SomeNone)处理了这些产品。也许我在这里有问题?

【问题讨论】:

  • 您能否删除旧问题并在必要时在另一个问题中提出?这将有助于人们寻找有关 menhir 示例的答案。

标签: json parsing ocaml ocamlyacc menhir


【解决方案1】:

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

【讨论】:

  • 不幸的是,该手册没有给出超出“玩具”程序范围的任何示例(我相信它们都是计算器)。我正在寻找更复杂的东西,可能不是完整的语言实现,但接近那个规模。
  • 我的意思是“必要的”列表——它包括例如 CCSS,它有 a menhir parser
  • 哦,哇,这正是我想要的,谢谢一百万!很抱歉没有早点理解。
猜你喜欢
  • 2017-07-26
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多