OCAML从stdin中获取多个参数并逐个操作

时间:2017-03-18 18:47:19

标签: ocaml stdin ocamllex ocamlyacc

我使用ocamllex和ocamlyacc编写了一个解释器,词法分析器和解析器正常工作但是目前它们只解析它收到的最后一个.txt参数,而不是依次反对所有这些参数。例如,./interpret one.txt two.txt three.txt仅解析three.txt,而不是解析one.txt,然后是two.txt,然后是three.txt,这就是我想要的。例如,解析结果如下:

one.txt -> "1"
two.txt -> "2"
three.txt -> "3"

在致电./interpret one.txt two.txt three.txt时,当前输出为:3,但我希望它为123

以下是我处理stdinstdout

的主要课程
open Lexer
open Parser
open Arg
open Printf

let toParse c = 
    try let lexbuf = Lexing.from_channel c in  
            parser_main lexer_main lexbuf 
    with Parsing.Parse_error -> failwith "Parse failure!" ;;


let argument = ref stdin in                                         
let prog p = argument := open_in p in
let usage = "./interpreter FILE" in
parse [] prog usage ; 
let parsed = toParse !argument in
let result = eval parsed in
let _ = parsed in
flush stdout;

感谢您的时间

1 个答案:

答案 0 :(得分:1)

这里没有足够的代码可以提供帮助。

如果我假设输出是由eval写的,那么我只看到一次eval的调用。但是这里没有什么可以处理来自命令行的文件名,因此很难说更多。

如果您打算从文件中读取输入,那么就我所知,没有理由使用stdin

(我知道这是一个非常小的问题,但是这段代码不构成一个类。其他语言使用类来处理所有内容,但这是一个模块。)

<强>更新

这是一个类似于Unix cat命令的模块;它会在下一个命令行中写出所有文件的内容。

let cat () =
    for i = 1 to Array.length Sys.argv - 1 do
        let ic = open_in Sys.argv.(i) in
        let rec loop () =
            match input_line ic with
            | line -> output_string stdout (line ^ "\n"); loop ()
            | exception End_of_file -> ()
        in
        loop ();
        close_in ic
    done

let () = cat ()

以下是编译和运行它时的外观。

$ ocamlc -o mycat mycat.ml
$ echo test line 1 > file1
$ echo test line 2 > file2
$ ./mycat file1 file2
test line 1
test line 2