如何使用ocamlex生成的lexer

如何使用ocamlex生成的lexer,ocaml,ocamllex,Ocaml,Ocamllex,我有一个简单的lexer,取自教程() 生成lexer OCaml并创建可执行文件后 ocamlex testlexer.mll&&ocamlc-o testlexer testlexer.ml 我试图通过stdinecho c |/testlexer和文件/testlexer input传递内容,但两者都不起作用 在生成的testlexer.ml中,我也看不到任何从stdin或文件中读取的逻辑,它是作为一个模块包含在另一个程序中,还是被另一个代码生成工具(如ocamlyacc)使用?您需要一个

我有一个简单的lexer,取自教程()

生成lexer OCaml并创建可执行文件后

ocamlex testlexer.mll&&ocamlc-o testlexer testlexer.ml

我试图通过stdin
echo c |/testlexer
和文件
/testlexer input
传递内容,但两者都不起作用


在生成的
testlexer.ml
中,我也看不到任何从stdin或文件中读取的逻辑,它是作为一个模块包含在另一个程序中,还是被另一个代码生成工具(如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

您需要一个
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

您需要一个
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

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