Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 从文件解析OCaml中的行_File_Parsing_Ocaml - Fatal编程技术网

File 从文件解析OCaml中的行

File 从文件解析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中实现它,这很容易:-/ 让我们提取\

我对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中实现它,这很容易:-/

让我们提取\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 []