我想定义一个keyword_table
,它将某些字符串映射到某些标记,我希望这个表格对parser.mly
和lexer.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.mly
和lexer.mll
生成数据?
答案 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
。