在OCaml .mll程序中打开模块

时间:2015-10-07 05:37:44

标签: ocaml

我是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 *)
}

1 个答案:

答案 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