解析器中的OCaml语法错误

解析器中的OCaml语法错误,ocaml,ocamllex,Ocaml,Ocamllex,有人能帮我解释一下为什么这一行出现语法错误:让wordMap=StringMap.empty?这包含在一个.mll文件中。上面定义了模块StringMap let lexbuf = Lexing.from_channel stdin in let wordlist = let rec next l = match token lexbuf with EOF -> l | Word(s) -> next (s ::

有人能帮我解释一下为什么这一行出现语法错误:
让wordMap=StringMap.empty
?这包含在一个.mll文件中。上面定义了模块StringMap

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 []

    let wordMap = StringMap.empty in 
        let wcList  = StringMap.fold (fun word count l -> (string_of_int count ^ " " ^ word) :: l) wordMap [] in 

        List.iter print_endline wcList;;
我知道它不打印任何内容,这只是为了测试。

声明如下:

let v = expr
只能出现在模块的最外层。这是声明模块全局名称的方法

但是在表达式中有这样一个声明(of
wordlist
):

let lexbuf = ... in
let wordlist = ...
在模块外部级别以外的所有位置,
let
后面必须跟有
In
。这是声明局部变量(在任何表达式中)的方法

我不清楚你想成为全球知名人士。但解决问题的一种方法是删除中的第一个
。然后您将有三个全局名称,
lexbuf
wordlist
,和
wordMap


另一种方法是在
wordlist
的定义之后添加
。那么您将没有全局名称。

您的
let绑定有问题。如果我将您的代码改写为以下内容,则此操作应该有效:

    let main () =
      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
     wordlist

   let wordMap = StringMap.empty

函数
main
返回
wordList

解决此类问题的黄金法则:使用适当的缩进工具、caml模式、tuareg模式或ocp缩进。如果这些工具显示的缩进与您的意图不同,则通常是您犯了语法错误。

我没有包含完整的代码。事实上,我有一个在wordMap之后的插件,但我不确定是否有必要。请检查我更改的代码,它仍然给我一个语法错误!您还需要在
wordlist
之后的
中输入
。不仅仅是在
wordMap
之后。我早些时候试过,效果不错,只是想看看是否有其他选择/了解语法错误的原因。再次感谢杰弗里。
    let main () =
      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
     wordlist

   let wordMap = StringMap.empty