我在一个expr.ml文件中有一个类型表达式。在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类型并将其用作规则的返回值?谢谢。
发布于 2011-06-16 01:07:51
您需要使用模块名称来限定expr类型。也就是说,如果它是在expression.ml (使用type expr = ...)中定义的,那么您应该使用
%type <Expresssion.expr> main使用模块名称时,请注意大写的E。
发布于 2011-06-15 23:28:20
我不确定我的理解是否正确。
但是你正在为循环依赖而苦苦挣扎?假设T包含您的类型并调用解析器P。P不能生成类型T.t,因为T依赖于P,而不是相反。通常,我创建了第三个包含类型信息的文件T'。
例如,
T.ml
let parse filename : T'.t =
filename
|> open_in
|> Lexing.from_channel
|> P.command L.tokenP.mly
%type <T'.t> command
%start command
%%T'.ml
type t = Label of String
| Integer of String
| Float of string
| Star of t发布于 2011-06-16 21:25:16
Ocamlyacc不允许您指定要在界面(.mli)文件中生成的文本。因此,无论您在接口中指定哪种类型(令牌或规则的类型),都需要使用完全限定类型。
在这里,看起来您可以使用完全限定类型,但有时这是不可能的,因为该类型涉及到一个函数式应用程序。有几种解决方法:
.mli文件进行后处理,以添加头。你几乎可以用这种方式做任何事情,但它既丑陋又烦人。https://stackoverflow.com/questions/6359845
复制相似问题