OCaml:发出操作从文件读取字符串的问题

时间:2018-03-15 20:51:37

标签: string file parsing ocaml

我正在尝试在OCaml中逐行读取文件。文件中的每一行代表一个我想要解析的字符串,其格式为解析工具所需的正确格式。我在列表结构中保存每一行。

我发现解析列表中每​​个元素中包含的字符串的问题。我使用OCamllex和Menhir作为解析工具。

  • 如果我尝试使用print_string在每个元素上打印列表的内容,我会得到正确的文件内容。

  • 如果我尝试将我在程序中定义的string传递给函数,那么我会得到所需的输出。

  • 但是,如果我尝试解析我刚从文件中读取的字符串,则会收到错误:Fatal error: exception Failure ("lexing empty token")

注意:所有这些都是针对相同的字符串进行测试的。

以下是代码片段:

let parse_mon m = Parser.monitor Lexer.token (from_string m)

let parse_and_print (mon: string)=
  print_endline (print_monitor (parse_mon mon) 0)

let get_file_contents file =
  let m_list = ref [] in
    let read_contents = open_in file in
      try
        while true; do
          m_list := input_line read_contents :: !m_list
        done; !m_list
      with End_of_file -> close_in read_contents; List.rev !m_list

let rec print_file_contents cont_list = match cont_list with
  | [] -> ()
  | m::ms -> parse_and_print m

let pt = print_file_contents (get_file_contents filename)

3 个答案:

答案 0 :(得分:1)

我同意 kne ,很难说没有看到文件,但你可以做的是试图通过这样做来隔离导致麻烦的行:

WITH SYSDATE_TABLE AS (
    SELECT to_date('01-06-2015', 'dd-mm-yyyy') as date_dt
    FROM DUAL
)
SELECT
    to_char(DATE_DT,'W') as WEEK_OF_MONTH,
    to_char(to_date(DATE_DT),'WW') as WEEK_OF_YEAR
FROM
    SYSDATE_TABLE;

答案 1 :(得分:0)

如果没有看到你的语法和文件,我只能提供一个疯狂的猜测:该文件最后是否包含空行?取决于可能导致错误的.mll。原因是get_file将新行添加到列表的前面,而print_file_contents只查看该列表的开头。

答案 2 :(得分:0)

当流中的文本与任何扫描仪模式都不匹配时,Ocamllex会抛出异常Failure "lexing: empty token"。因此,您需要匹配“全包”模式,例如._eof

{ }
rule scan = parse
  | "hello" as w { print_string w; scan lexbuf }
  (* need these two for catch-all *)
  | _ as c       { print_char c; scan lexbuf }
  | eof          { exit 0 }