[英]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
)文件中生成的文本。 因此,无论您何时指定进入接口的类型(令牌或规则的类型),都需要使用完全限定类型。
在这里看起来你可以使用完全限定类型,但有时这是不可能的,因为类型涉及仿函数应用程序。 有几种解决方法:
.mli
文件进行后处理以添加标头。 你可以用这种方式做任何事情,但它很丑陋而烦人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.