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

时间:2015-09-16 03:16:17

标签: ocaml 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中的任何逻辑用于从stdin或文件读取,是否意味着将其作为模块包含在另一个程序中或者由ocamlyacc等其他代码生成工具使用?

1 个答案:

答案 0 :(得分:3)

您需要一个data = 0 for (i=0; i < 8; ++i) { data = (data << 8) | bytes[i]; // bytes is already UInt8 * so no need to mask it } 功能(实质上)。您可以从该页面上的其他示例进行调整。

以下是我写完的一个完整示例:

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的程序,也可以不是。