0

我正在尝试编写一个 OCamllex 解析器,它从列表中构造单词的字符串映射。但是,当我尝试在标题中打开 StringMap 模块时收到“无界模块”错误:

{
  open StringMap
  type token = EOF | Word of string
}
(* other code *)

当我没有显式打开模块以及尝试在预告片中创建地图时,也会发生相同的错误:

module StringMap = Map.Make (String)

所有 OCaml 教程都建议我使用正确的语法;所以也许我在滥用 OCamllex(?) 我承认,标题、规则和预告片的范围对我来说并不清楚。我在文档中搜索了解决方案,但针对 OCamllex 的教程很少。谁能告诉我做错了什么?OCamllex 是否允许使用 StringMap 模块?

4

1 回答 1

1

问题是不StringMap存在模块:您必须使用函子应用程序生成一个模块,例如module StringMap = Map.Make (String). 将其放在header中,而不是预告片中。(预告片代码将放置在生成文件的末尾,因此在您的词法分析器代码中无法看到其中建立的绑定。)

如果你喜欢你也可以打开模块:

open module StringMap = Map.Make (String)

不过,打开模块被认为有点糟糕。特别要避免打开诸如 and 的应用程序之类的模块MapSet因为它们的定义compare会影响通常的模块Pervasives并产生混淆。

于 2014-02-20T06:26:25.230 回答