Genlex

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2009-09-10 (木) 16:48:58

Chapter 20 標準ライブラリ

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) を発生します。ブランクと改行はスキップされます。(* と *) で区切られたコメントもスキップされます。コメントは入れ子にできます。

新規 編集 添付