File 从文件解析OCaml中的行
我对OCaml非常陌生,我需要编写一个函数,将文件的每一行解析为三个元素的列表 在下面的示例中,我想解析Aemilia、np和Aemilia____1File 从文件解析OCaml中的行,file,parsing,ocaml,File,Parsing,Ocaml,我对OCaml非常陌生,我需要编写一个函数,将文件的每一行解析为三个元素的列表 在下面的示例中,我想解析Aemilia、np和Aemilia____1 Aemilia 100 np [pred="Aemilia_____1<Suj:(sn)>",@hum,@first_name,cat=np,@fs] Aemilia_____1 Default fs %default nc-1fs 实际上,我有类似的东西,但我不知道如何在C中实现它,这很容易:-/ 让我们提取\
Aemilia 100 np [pred="Aemilia_____1<Suj:(sn)>",@hum,@first_name,cat=np,@fs] Aemilia_____1 Default fs %default nc-1fs
实际上,我有类似的东西,但我不知道如何在C中实现它,这很容易:-/
让我们提取\u行str=
;;
让rec提取ic=
让accum=[]输入
让线路=输入信道。输入线路ic输入
匹配
|无->累计::[]
|一些x->accum::extract_line x::extract ic
In_channel.close ic;;
对于输入行的可能形式,您没有提供足够的信息来仔细解决此问题 可以合理地假设您希望第1个、第3个和第5个单词以空格分隔行中的值
let get_words =
let re = Str.regexp "[ \t]+" in
fun s ->
Str.split re s
let extract ic =
let rec loop accum =
match input_line ic with
| line ->
(match get_words line with
| w1 :: _ :: w3 :: _ :: w5 :: _ ->
loop ((w1, w3, w5) :: accum)
| _ -> loop accum
)
| exception End_of_file -> List.rev accum
in
loop []
行中的第四个值看起来相当复杂。如果它可以包含嵌入的空格,则需要对每一行进行更仔细的分析。例如,您可能需要查找匹配的方括号。但该值是否也可以包含括号
你说这在C语言中很容易,但是想想想象中的C代码在有很长的输入行的情况下的行为是很有趣的。在我的经验中,一旦你正确地处理了这类事情,C语言就会变得更加困难。每个程序都会成为内存管理问题
let get_words =
let re = Str.regexp "[ \t]+" in
fun s ->
Str.split re s
let extract ic =
let rec loop accum =
match input_line ic with
| line ->
(match get_words line with
| w1 :: _ :: w3 :: _ :: w5 :: _ ->
loop ((w1, w3, w5) :: accum)
| _ -> loop accum
)
| exception End_of_file -> List.rev accum
in
loop []