【问题标题】:Ocaml does not recognize elseOcaml 无法识别 else
【发布时间】:2021-03-13 15:50:12
【问题描述】:

我对 Ocaml 比较陌生,遇到了一个恼人的错误。我的代码在这里:

let rec nfa_to_dfa_step (nfa: ('q,'s) nfa_t) (dfa: ('q list, 's) nfa_t)
    (work: 'q list list) : ('q list, 's) nfa_t =
  match work with 
  | [] -> dfa
  | h::t -> 
    if (h <> []) then 
      (match nfa with { sigma; qs; q0; fs; delta } ->
        (let states = (new_states nfa h) in 
          (union states qs);
          (union states t);
          (union (new_trans nfa h) delta);
          (union (fold_left (fun acc state -> 
            let cur_final = (new_finals nfa state) in
            if (cur_final <> []) then (cur_final::acc) else acc) [] states) fs);
          (nfa_to_dfa_step nfa dfa t)));;
    else 
        (nfa_to_dfa_step nfa dfa t)

我在倒数第二行的 else 语句中遇到语法错误。我相当确定它与括号有关,需要在没有括号的地方放置一些,但我已经在所有内容周围加上括号,并且我已经检查并仔细检查了不匹配的括号。如果我在整个 if else 语句周围加上括号,我会得到一个不同的错误:

Error: Syntax error: ')' expected
File "src/nfa.ml", line 90, characters 4-5:
90 |     (if (h <> []) then
         ^
  This '(' might be unmatched

我做错了什么?关于如何调试此类错误的任何想法?我一直在用 ocaml 编程时遇到过类似的问题。作为习惯于命令式低级语言(如 c++)的人,任何有关如何解释和调试此类错误消息的建议都将不胜感激。

【问题讨论】:

  • 为什么else之前的行尾有一个;;
  • begin/end,不是括号。
  • @glennsl 我正在使用 (expr1; expr2; expr3;;) 语法
  • @Shawn 你这是什么意思?
  • 看待事物的最佳方式(恕我直言)是 ;; 不是 OCaml 语法的一部分。这只是告诉 REPL 评估您迄今为止输入的内容的一种方式。 @Shawn 指出,if ... then ... else 的语法中肯定没有 ;;

标签: syntax-error ocaml finite-automata


【解决方案1】:

如前所述,(nfa_to_dfa_step nfa dfa t))) 之后的;; 是罪魁祸首。 更细致一点,;; 并非无用/语法无效,它用于结束“顶级短语”。例如:

(* say_hello is at toplevel *)
let say_hello x = 
  (* the body of the function is not *)
  let message = "Hello " ^ x ^ "!" in
  print_endline ()
;; (* here, ;; is a terminaison for the function `say_hello`
      it is perfectly valid *)

为了避免混淆,我们可以到处阅读;; 仅在 REPL 中有用。在我看来,它对于错误报告很有用。但如果你不想担心,我建议你永远不要戴上它们,而是使用 OCamlformat 让它们为你放置它们。

【讨论】:

  • 使用开始/结束语法解决了这个问题!我很困惑,有什么区别,我用过; ;;之前的语法没有任何问题
猜你喜欢
  • 2023-01-06
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
相关资源
最近更新 更多