Module Genlex


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 string
| Ident of string
| Int of int
| Float of float
| String of string
| Char of char
トークンの型です。字句クラスは IntFloat (整数と浮動小数点小数) 、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) を発生します。ブランクと改行はスキップされます。(**) で区切られたコメントもスキップされます。コメントは入れ子にできます。