我从一个教程(http://plus.kaist.ac.kr/~shoh/ocaml/ocamllex-ocamlyacc/ocamllex-tutorial/sec-ocamllex-some-simple-examples.html)中摘取了一个简单的词汇
{ }
rule translate = parse
| "c" { print_string (Sys.getcwd ()); translate lexbuf }
| _ as c { print_char c; translate lexbuf }
| eof { exit 0 }生成OCaml并创建可执行文件之后,
ocamllex testlexer.mll && ocamlc -o testlexer testlexer.ml
我试图通过stdin echo c | ./testlexer和文件./testlexer input传递内容,但两者都不起作用。
我也没有在生成的testlexer.ml中看到从stdin或文件中读取的任何逻辑,它是作为一个模块包含在另一个程序中,还是由其他代码生成工具(如ocamlyacc )使用?
发布于 2015-09-16 04:00:19
您需要一个main函数(本质上)。您可以根据页面上的其他示例对其进行修改。
下面是我写的一个完整的例子:
{ }
rule translate = parse
| "c" { print_string (Sys.getcwd ()); translate lexbuf }
| _ as c { print_char c; translate lexbuf }
| eof { exit 0 }
{
let main () =
let lexbuf = Lexing.from_channel stdin in translate lexbuf
let () = main ()
}它似乎是按预期运作的:
$ ocamllex l.mll
4 states, 257 transitions, table size 1052 bytes
$ ocamlc -o l l.ml
$ echo c/itworks | ./l
/home/jeffsco/tryll2/itworks更新
对不起,我忘了回答你的其他问题。是的,没有main函数,原始代码可以是一个较大程序中的一个模块。它可以是用户ocamlyacc的程序,也可以不是。
https://stackoverflow.com/questions/32599182
复制相似问题