如何使用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
用户的程序,也可能不是。
我有一个从教程中提取的简单词法分析器 (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
用户的程序,也可能不是。