为什么我不能在我的lex文件中使用模块?

时间:2017-10-25 21:53:09

标签: ocaml ocamllex

这是我目前为{ 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。运行module StringMap = Map.Make(String)将打印出mll文件中存在的所有字符串,这正是我期望它做的。

但是,如果我在List.iter调用之前添加File "a.mll", line 17, characters 4-10:,则会出现语法错误...
module其中第17行是module的行,4-10是{{1}}。

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

1 个答案:

答案 0 :(得分: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