从 OCaml 中的元组中提取数据
Extracting data from a tuple in OCaml
我正在尝试使用 CIL 库来解析 C 源代码。我正在使用其名称搜索特定函数。
let cil_func = Caml.List.find (fun g ->
match g with
| GFun(f,_) when (equal f.svar.vname func) -> true
| _ -> false
) cil_file.globals in
let body g = match g with GFun(f,_) -> f.sbody in
dumpBlock defaultCilPrinter stdout 1 (body cil_func)
所以我有一个 fundec * 位置的 GFun 类型,我正在尝试获取 fundec 的 sbody 属性。
进行第二次模式匹配似乎是多余的,更不用说,编译器抱怨它并不详尽。有更好的方法吗?
您可以定义自己的函数 returns 只是 fundec:
let rec find_fundec fname = function
| [] -> raise Not_found
| GFun (f, _) :: _ when equal (f.svar.vname fname) -> f (* ? *)
| _ :: t -> find_fundec fname t
那么你的代码看起来更像这样:
let cil_fundec = find_fundec func cil_file.globals in
dumpBlock defaultCilPrinter stdout 1 cil_fundec.sbody
尽管如此,标记为 (* ? *)
的行在我看来是错误的。我不明白为什么 f.svar.vname
会是一个函数。我只是在那里复制你的代码。
更新
修正了一个错误(我经常犯的错误),抱歉。
我正在尝试使用 CIL 库来解析 C 源代码。我正在使用其名称搜索特定函数。
let cil_func = Caml.List.find (fun g ->
match g with
| GFun(f,_) when (equal f.svar.vname func) -> true
| _ -> false
) cil_file.globals in
let body g = match g with GFun(f,_) -> f.sbody in
dumpBlock defaultCilPrinter stdout 1 (body cil_func)
所以我有一个 fundec * 位置的 GFun 类型,我正在尝试获取 fundec 的 sbody 属性。 进行第二次模式匹配似乎是多余的,更不用说,编译器抱怨它并不详尽。有更好的方法吗?
您可以定义自己的函数 returns 只是 fundec:
let rec find_fundec fname = function
| [] -> raise Not_found
| GFun (f, _) :: _ when equal (f.svar.vname fname) -> f (* ? *)
| _ :: t -> find_fundec fname t
那么你的代码看起来更像这样:
let cil_fundec = find_fundec func cil_file.globals in
dumpBlock defaultCilPrinter stdout 1 cil_fundec.sbody
尽管如此,标记为 (* ? *)
的行在我看来是错误的。我不明白为什么 f.svar.vname
会是一个函数。我只是在那里复制你的代码。
更新
修正了一个错误(我经常犯的错误),抱歉。