从文件中解析 OCaml 中的行

Parse line in OCaml from a file

我是 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

而extract_line会return

Aemilia; np; Aemilia_____1 (I guess this is string * string * string)

实际上我有这样的东西,但我不知道如何实现它(在 C 中很容易 :-/ )

let extract_line str = 

;;

let rec extract ic = 
  let accum = [] in
    let line = In_channel.input_line ic in
      match line with 
        | None -> accum::[]
        | Some x -> accum :: extract_line x :: extract ic

  In_channel.close ic;;

您没有提供足够的关于您的输入行可能形式的信息来仔细解决这个问题。

假设您想要行中的第 1、第 3 和第 5 "words"(空格分隔值)是合理的。

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 就会变得更根据我的经验很难。每个程序都会成为内存管理问题。)