繁体   English   中英

使用OCamlyacc的外部类型声明

[英]Using external type declarations with OCamlyacc

我在expr.ml文件中有一个类型expr。 在parser.mly(OCamlyacc文件)中,我定义了expr规则并给出了类型:

    %start expr
    %type <expr> expr

但是,我得到:

    File "parser.mli", line 34, characters 48-52:
    Error: Unbound type constructor expr

我尝试添加

    %{
      open Expr
    %}

在.mly文件的开头,但它仍然无法正常工作。 如何在外部文件中定义此expr类型并将其用作规则的返回值? 谢谢。

您需要使用模块名称限定expr类型。 即,如果它在expression.ml定义(使用type expr = ... ),您应该使用

%type <Expresssion.expr> main

使用模块名称时请注意大写E

我不确定我是否理解正确。

但是你正在努力解决循环依赖问题? 假设T包含您的类型并调用解析器P P不能产生类型Tt因为T取决于P ,而不是相反。 通常,我创建了第三个包含类型信息T'

例如,

T.ml

 let parse filename : T'.t =
     filename
         |> open_in
         |> Lexing.from_channel
         |> P.command L.token

P.mly

%type <T'.t> command
%start command
%%

T'.ml

type t = Label of String
       | Integer of String
       | Float of string
       | Star of t

Ocamlyacc不允许您指定要在接口( .mli )文件中生成的文本。 因此,无论您何时指定进入接口的类型(令牌或规则的类型),都需要使用完全限定类型。

在这里看起来你可以使用完全限定类型,但有时这是不可能的,因为类型涉及仿函数应用程序。 有几种解决方法:

  • 安排在单独的编译单元中构建所有函子。 这很容易,但是如果函子涉及令牌类型则不起作用。
  • 对ocamlyacc生成的.mli文件进行后处理以添加标头。 你可以用这种方式做任何事情,但它很丑陋而烦人。
  • 使用Menhir ,Ocamlyacc的改良替代品。 这是一个额外的依赖,但它确实解决了Ocamlyacc的主要缺点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM