繁体   English   中英

制作一个包含令人可见的标记的表格.mly和.mll由menhir显示

[英]Make a table containing tokens visible for both .mly and .mll by menhir

我想定义一个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 *)
}

正如这条评论所暗示的那样, menhir有一个解决方案,任何人都可以告诉我任何细节吗?

第一个选项是在单独的.mly文件中定义标记。 使用--only-tokens选项为此文件执行menhir将生成一个包含type token的模块,您可以在使用--external-tokens选项编译的解析器中使用--external-tokens

如果这解决了令牌的问题,您可以在Thomash建议的单独文件中指定解析器和词法分析器使用的所有其他函数。

还有一种替代解决方案。 您可以在解析器中使用%parameter<module signature>声明,以在给定签名内指定的类型和函数注释上参数化整个解析器。 主要优点是此签名在解析器的接口文件中提供,因此解析器可以与其他模块共享此签名(可以根据签名构建模块)。

我建议引用menhir示例 ,即参见calc-two以了解外部令牌,并参考calc-param以了解如何创建参数化解析器。

我通常将keyword_table放在lexer.mll ,我认为没有理由把它放在parser.mly 如果你需要同时访问它lexer.mllparser.mly (但为什么要从parser.mly访问它?),最简单的解决办法是把它放在第三个文件keyword.ml和使用Keyword.keyword_table (或open Keywordkeyword_table )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM