我正在尝试编写一个OCamllex解析器,该解析器从列表中构造一个字串映射。但是,当我试图在头文件中打开StringMap模块时,我会收到一个“无限模块”错误:
{
open StringMap
type token = EOF | Word of string
}
(* other code *)当我没有显式打开模块时,以及当我试图在预告片中创建一个映射时,也会发生同样的错误:
module StringMap = Map.Make (String)所有的OCaml教程都建议我使用正确的语法,所以我可能误用了OCamllex(?)我承认,我不清楚标题、规则和预告片的范围。我在文档中搜索了解决方案,但是针对OCamllex的教程很少。有人能推断出我做错了什么吗?OCamllex允许使用StringMap模块吗?
发布于 2014-02-20 06:26:25
问题是不存在StringMap模块:您必须使用函子应用程序(如module StringMap = Map.Make (String) )生成一个模块。把这个放在头上,而不是拖车里。(预告片代码将放在生成文件的末尾,因此在其中建立的绑定无法从您的lexer代码中看到。)
如果您愿意,也可以打开模块:
open module StringMap = Map.Make (String)不过,开放模块被认为是有点糟糕的风格。特别是避免打开模块,例如Map和Set的应用程序,因为它们对compare的定义会从Pervasives中隐藏通常的模块,从而产生混乱。
https://stackoverflow.com/questions/21897707
复制相似问题