module Genlex: sig end
このモジュールでは簡単な「標準」字句解析器を、文字のストリームからトークンのストリームにする関数として提供します。大体 Caml の字句規約に従って実装されていますが、キーワードの集合は自由に決められるようになっています。
電卓の字句解析器は以下のようにして得られます。
let lexer = make_lexer ["+";"-";"*";"/";"let";"="; "("; ")"]
対応するパーザは token stream
から、例えば int
に変換する関数だとすれば、以下のようなルールを持つことになります。
let parse_expr = parser
[< 'Int n >] -> n
| [< 'Kwd "("; n = parse_expr; 'Kwd ")" >] -> n
| [< n1 = parse_expr; n2 = parse_remainder n1 >] -> n2
and parse_remainder n1 = parser
[< 'Kwd "+"; n2 = parse_expr >] -> n1+n2
| ...
type token =
| |
Kwd of |
| |
Ident of |
| |
Int of |
| |
Float of |
| |
String of |
| |
Char of |
Int
と Float
(整数と浮動小数点小数) 、String
(ダブルクォートで囲まれた文字列リテラル) 、Char
(シングルクォートで囲まれた文字リテラル) 、Ident
(識別子 : 文字や数字やアンダースコアやクォートの列、+
、*
などのような「オペレータ文字」列) 、Kwd
(キーワード : 識別子か、(
、}
のような「特殊文字」) です。val make_lexer : string list -> char Stream.t -> token Stream.t
s
は、このリストに含まれる場合は Kwd s
として返します。そうでない場合は Ident s
として返します。特殊文字 s
は、このリストに含まれる場合は Kwd s
として返します。そうでない場合は字句解析エラー (例外 Parse_error
) を発生します。ブランクと改行はスキップされます。(*
と *)
で区切られたコメントもスキップされます。コメントは入れ子にできます。