0

我有一个从教程中提取的简单词法分析器(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

我尝试通过 stdinecho c | ./testlexer和 file传递内容./testlexer input,但都不起作用。

我也没有看到生成testlexer.ml的用于从标准输入或文件读取的任何逻辑,它是要作为模块包含在另一个程序中还是由另一个代码生成工具(如 ocamlyacc)使用?

4

1 回答 1

3

你需要一个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不是。

于 2015-09-16T04:00:19.607 回答