Genlexこのページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。 last mod. 2009-09-10 (木) 16:48:58
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 トークンの型です。字句クラスは 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) を発生します。ブランクと改行はスキップされます。(* と *) で区切られたコメントもスキップされます。コメントは入れ子にできます。 |