在第 12 章 Lexer 和解析器生成器中,我无法编译以下示例:
{
type token = EOL | INT of int | PLUS
module Make (M : sig
type 'a t
val return: 'a -> 'a t
val bind: 'a t -> ('a -> 'b t) -> 'b t
val fail : string -> 'a t
(* Set up lexbuf *)
val on_refill : Lexing.lexbuf -> unit t
end)
= struct
let refill_handler k lexbuf arg =
M.bind (M.on_refill lexbuf) (fun () -> k lexbuf arg)
}
refill {refill_handler}
rule token = parse
| [' ' '\t']
{ token lexbuf }
| '\n'
{ M.return EOL }
| ['0'-'9']+ as i
{ M.return (INT (int_of_string i)) }
| '+'
{ M.return PLUS }
| _
{ M.fail "unexpected character" }
{
end
}
我也不明白 Make 模块是如何工作的,以及它来自哪里。注意:我目前使用的是 4.02.1 ocaml 编译器。