【发布时间】: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