我想定义一个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 *)
}
正如this comment所建议的,
menhir
有一个解决方案,有人可以告诉我任何细节吗? 最佳答案
第一种选择是在单独的.mly
文件中定义标记。使用menhir
选项对此文件执行--only-tokens
将生成一个包含type token
的模块,您可以在使用--external-tokens
选项编译的解析器中使用该模块。
如果这解决了令牌问题,则可以按照Thomash的建议,在单独的文件中指定解析器和词法分析器都使用的所有其他函数。
也有替代解决方案。您可以在解析器中使用%parameter<module signature>
声明,根据给定签名内指定的类型和函数注释对整个解析器进行参数化。主要优点是此签名在解析器的接口文件中提供,因此解析器可以与其他模块(可以基于签名构造模块)共享此签名。
我建议参考to menhir
examples,即参见calc-two
以了解有关外部令牌的信息,并参考calc-param
以了解如何创建参数化的解析器。
关于parsing - 使表格包含Menhir对.mly和.mll都可见的标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21621614/