OCAML 从 stdin 中获取多个参数并对其进行一一操作
OCAML Taking multiple arguments from stdin and operating on them one by one
我已经使用 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
这是我的主要 class,它处理 stdin
和 stdout
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;
感谢您的宝贵时间
这里没有足够的代码来提供帮助。
如果我假设输出是由 eval
编写的,那么我只会看到对 eval
的一次调用。但是这里没有从命令行处理文件名的内容,所以很难多说。
如果您打算从文件中读取输入,那么据我所知,没有理由使用 stdin
。
(我知道这是一个很次要的点,但是这段代码并不构成class。其他语言都使用classes,但这是一个模块。)
更新
这是一个类似于 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
我已经使用 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
这是我的主要 class,它处理 stdin
和 stdout
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;
感谢您的宝贵时间
这里没有足够的代码来提供帮助。
如果我假设输出是由 eval
编写的,那么我只会看到对 eval
的一次调用。但是这里没有从命令行处理文件名的内容,所以很难多说。
如果您打算从文件中读取输入,那么据我所知,没有理由使用 stdin
。
(我知道这是一个很次要的点,但是这段代码并不构成class。其他语言都使用classes,但这是一个模块。)
更新
这是一个类似于 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