如何使用ocamllex生成的词法分析器

How to use lexer generated by ocamllex

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

我尝试通过标准输入 echo c | ./testlexer 和文件 ./testlexer input 传递内容,但都不起作用。

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

你需要一个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 用户的程序,也可能不是。