parsing - 使包含标记的表对 .mly 和 .mll 均可见(作者:menhir)

标签 parsing ocaml lexical-analysis ocamllex menhir

我想定义一个 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中定义 token 。文件。执行menhir对于此文件 --only-tokens选项将生成一个包含 type token 的模块您可以在用 --external-tokens 编译的解析器中使用它选项。

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

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

建议引用to menhir examples ,即参见calc-two了解外部 token 并访问 calc-param了解如何创建参数化解析器。

关于parsing - 使包含标记的表对 .mly 和 .mll 均可见(作者:menhir),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21621614/

相关文章:

java - HTML 混合编码?

java - "Expected BEGIN_OBJECT but was STRING at line 1 column 1"

Lisp、OCaml 或 Runge Kutta 的什么?

compiler-construction - 编译器如何处理运行时错误消息中的行号

c - 如何为词法分析器创建makefile?

python - 如何防止 lark 将标识符的一部分识别为关键字?

ocaml - 从 utop 检索文档

parsing - OCaml 解析函数

python - 匹配多个正则表达式组并删除它们

php - 如何在 sql 查询中插入 php 变量?