首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OCamlyacc中使用外部类型声明

在OCamlyacc中使用外部类型声明
EN

Stack Overflow用户
提问于 2011-06-15 23:01:43
回答 3查看 1.8K关注 0票数 9

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

代码语言:javascript
复制
    %start expr
    %type <expr> expr

然而,我得到了:

代码语言:javascript
复制
    File "parser.mli", line 34, characters 48-52:
    Error: Unbound type constructor expr

我试着添加

代码语言:javascript
复制
    %{
      open Expr
    %}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-16 01:07:51

您需要使用模块名称来限定expr类型。也就是说,如果它是在expression.ml (使用type expr = ...)中定义的,那么您应该使用

代码语言:javascript
复制
%type <Expresssion.expr> main

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

票数 10
EN

Stack Overflow用户

发布于 2011-06-15 23:28:20

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

但是你正在为循环依赖而苦苦挣扎?假设T包含您的类型并调用解析器PP不能生成类型T.t,因为T依赖于P,而不是相反。通常,我创建了第三个包含类型信息的文件T'

例如,

T.ml

代码语言:javascript
复制
 let parse filename : T'.t =
     filename
         |> open_in
         |> Lexing.from_channel
         |> P.command L.token

P.mly

代码语言:javascript
复制
%type <T'.t> command
%start command
%%

T'.ml

代码语言:javascript
复制
type t = Label of String
       | Integer of String
       | Float of string
       | Star of t
票数 2
EN

Stack Overflow用户

发布于 2011-06-16 21:25:16

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

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

  • 安排在单独的编译单元中构建所有函数器。这很简单,但不起作用,例如,如果函数器涉及令牌类型。
  • 会对ocamlyacc生成的.mli文件进行后处理,以添加头。你几乎可以用这种方式做任何事情,但它既丑陋又烦人。
  • 使用的是Menhir,它是Ocamlyacc的改进替代品。它是一个额外的依赖项,但它确实解决了Ocamlyacc的主shortcomings.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6359845

复制
相关文章

相似问题

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