Разобрать строку в OCaml из файла - PullRequest
0 голосов
/ 09 мая 2020

Я новичок в 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 вернет

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 голосов
/ 09 мая 2020

Вы не предоставляете достаточно информации о возможных формах строк ввода, чтобы тщательно решить эту проблему.

Разумно предположить, что вам нужны 1-е, 3-е и 5-е «слова» (разделенные пробелами values) из строки.

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, но интересно подумать о том, как вы себе представляете * Код 1010 * будет вести себя при наличии очень длинных входных строк. Если вы правильно обработаете такие вещи, C, по моему опыту, станет намного сложнее. Каждая программа становится проблемой управления памятью.)

...