0

这就是我目前拥有的mll运行良好的文件。

{ type token = EOF | Word of string }

rule token = parse
    | eof { EOF }
    | ['a'-'z' 'A'-'Z']+ as word {Word(word)}
    | _ { token lexbuf }
{
    let lexbuf = Lexing.from_channel stdin in
    let wordlist = 
        let rec next l = 
            match token lexbuf with
                EOF -> l
            | Word(s) -> next (s::l)
        in next []
    in

    List.iter print_endline wordlist
}

我做ocamllex a.mll然后ocamlc -o a a.ml。运行./a < a.mll将打印出 mll 文件中存在的所有字符串,这正是我所期望的。

但是,如果我module StringMap = Map.Make(String)在调用之前添加List.iter,我会得到一个语法错误......
File "a.mll", line 17, characters 4-10:其中第 17 行是 with 的行,module而 4-10 是 word module

我无法弄清楚为什么添加这一行会给我一个语法错误...如果我在顶层输入相同的代码,它就可以正常工作。

4

1 回答 1

2

我会假设 ocamllex 生成的代码最终在一个函数中。您不能在函数中声明全局样式的模块。

但是,您可以像这样声明一个本地模块:

let module StringMap = Map.Make(String) in ...

例子:

# let fgm () =
      module StringMap = Map.Make(String)
      StringMap.cardinal StringMap.empty;;
Error: Syntax error
# let flm () =
      let module StringMap = Map.Make(String) in
      StringMap.cardinal StringMap.empty;;
val flm : unit -> int = <fun>
# flm ();;
- : int = 0
于 2017-10-25T22:01:47.000 回答