我已经盯着这段代码看了一段时间,但不明白为什么我会收到语法错误:
let rec e_closure (m:nfa_t) (l:int list) = match m with
| (_, _, (ts:transition list)) ->
List.sort_uniq (List.fold_left
(fun (lst:int list) (state:int) ->
List.fold_left
(fun (lst2:int list) (t:transition) ->
match t with
| ((start:int), (letter:char option), (end:int)) -> (if ((start = a) && (isEpilson letter)) then end::lst2 else lst2)
| _ -> raise (NFAError "e_closure match failure (nested)")) lst ts) l l)
| _ -> raise (NFAError "e_closure match failure")
;;
在不深入了解这个复杂代码的情况下,它的功能是返回给定 NFA(非确定性有限自动机)的状态的 epsilon 闭包列表。它的例外类型在代码中进行了注释。
我得到的错误信息在第 8 行,说明Error: Syntax error: operator expected.
我怀疑了解代码的功能无关紧要,但这里仍然是:
isEpsilon
是一个函数,如果transition
匹配则返回 true None
。
NFAError
是用户定义的错误。
用户定义的类型是:
type char option = None | Some of char
type transition = int * char option * int
type nfa_t = int * int list * transition list
上面列出的顺序中每种类型的示例:
None
(1, None, 2)
(1, [2;3], [(1, None, 2); (1, Some 'a', 3)])
使用函数的一个例子e_closure
:
e_closure (1, [2,3], [(1, None, 2); (1, Some 'a', 3)]) [1] = [1;2]
也就是说,该函数查看 list [(1, None, 2); (1, Some 'a', 3)]
,返回一个 int list
包含其第二个参数中的每个元素以及该参数所有元素的每个 epsilon 转换。在这种情况下,由于第二个参数是 [1]
,它将返回[1;2]
,转换(1, Some 'a', 3)
不是 epsilon 转换,因此不包括在内。
该代码使用该函数fold_left
并sort_uniq
在 Ocaml 的本机模块List 中找到。
您正在end
用作标识符,但它是 OCaml 中的关键字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句