创建一个包含令牌的表格.mly和.mll

时间:2014-01-31 21:44:13

标签: parsing ocaml lexical-analysis ocamllex ocamlyacc

我想定义一个keyword_table,它将某些字符串映射到某些标记,我希望这个表格对parser.mlylexer.mll都可见。

似乎必须在parser.mly

中定义表格
%{ 
  open Utility (* where hash_table is defined to make a table from a list *)
  let keyword_table = hash_table [
      "Call", CALL; "Case", CASE; "Close", CLOSE; "Const", CONST; 
      "Declare", DECLARE; "DefBool", DEFBOOL; "DefByte", DEFBYTE ]
%}

但是,我无法在lexer.mll中使用它,例如

{
open Parser
let x = keyword_table (* doesn't work *)
let x = Parser.keyword_table (* doesn't work *)
let x = Parsing.keyword_table (* doesn't work *)
}

谁能告诉我问题出在哪里?是否可以为parser.mlylexer.mll生成数据?

2 个答案:

答案 0 :(得分:0)

是的,这很简单。您可以简单地将数据放在第三个.ml文件中,并引用:

在.mly:

%{ 
    open Data
%}

在.mll中:

{
    open Data
}

您将无法在其他文件中引用parse.mly的内部定义。当ocamlyacc运行时,它会生成parse.mli,但不会使其可用。

答案 1 :(得分:0)

gsg's answer中所述,ocamlyacc与解析器的mli实现一起生成ml接口,并仅导出令牌类型和入口点。根据{{​​3}},这不太可能改变,所以你基本上有两个解决方案:

  • 之后修改生成的mli(我的Makefile通常只有rm的规则,但您可能只想添加必要的签名。
  • 按照上述错误报告中的建议使用menhir