我是OCaml的新手,我一直在研究解析器(.mll文件)。我在代码中的某个地方使用StringMap,我不确定在哪里&如何打开模块。当我运行它时说
Error: Unbound module StringMap
所以我知道我必须做module StringMap = Map.Make(String)
但我应该把它放在哪里?
代码在这里:
{ type token = EOF | Word of string }
rule token = parse (*...*)
{
(* use StringMap in here *)
}
答案 0 :(得分:1)
这应该有效
{
module StringMap = Map.Make(String)
type token = EOF | Word of string
}
rule token = parse ...
请注意,这不会打开"模块StringMap
。它只是定义了模块。这很好,尽可能避免打开模块。
<强>更新强>
如果您不打算在词法分析器中使用StringMap
模块(考虑一段时间,我决定您可能不会),您可以这样做:
{ type token = EOF | Word of string }
rule token = parse ...
{
module StringMap = Map.Make(String)
... any other code ...
}
更新2
这是一个完整的工作示例。我希望它不会有点过分;我不想从中获取乐趣。
{ }
rule scan = parse
| '\n' { scan lexbuf }
| _ as c { Some c }
| eof { None }
{
module CharMap = Map.Make(Char)
let main () =
let lexbuf = Lexing.from_channel stdin in
let rec loop map =
match scan lexbuf with
| Some c ->
let map' =
if CharMap.mem c map then
CharMap.add c (CharMap.find c map + 1) map
else
CharMap.add c 1 map
in
loop map'
| None -> map
in
let m = loop CharMap.empty in
CharMap.iter (fun c ct -> Printf.printf "%c %d\n" c ct) m
let () = main ()
}
它对我有用:
$ ocamllex l.mll
4 states, 257 transitions, table size 1052 bytes
$ ocamlc -o l l.ml
$ echo swell | l
e 1
l 2
s 1
w 1