解析器中的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
只能出现在模块的最外层。这是声明模块全局名称的方法
但是在表达式中有这样一个声明(ofwordlist
):
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