部分集合構成法

昨日、コンパイラⅠを立ち読みしてきました。(た、高いですからね、つ、Ⅱは持ってるんですよっ)
忘れないうちにメモを残しておきます。
集合構成法では、位置の集合を状態とし、状態と次の文字から次の状態を引けるような表を作るようです。

例えば、次のような正規表現があったとします。

[0-9]+|0x[0-9a-fA-F]+

最初の位置を、orとか考慮した上で(ε遷移と呼ぶらしい)まとめて、最初の状態とします。

(┃[0-9]+)|(┃0x[0-9a-fA-F]+)

取りうる全ての文字に対して移動先(とそこからε遷移する先)を求めます。

0   : (┃[0-9]+)|(0┃x[0-9a-fA-F]+)┃(OK)
1〜9: (┃[0-9]+)|(0x[0-9a-fA-F]+)┃(OK)
他  : (BAD)

こうして得られた状態が、未探索のパターンであれば、そこからまた同じように繰り返します。
こうしてできた表をたどってマッチングを行うわけです。
ひとつでも末尾に到達したら打ち切ると最短一致、可能性が無くなるまで繰り返すと最長一致になります。
A*?とかみたいな部分最短一致みたいなのは多分できない…かな?

誤ってたらつっこんでいただけたら幸いです。アルゴリズム関係(入門向けのソートとかで終わっているやつを除く)の本が書店から消えてて、コンパイラⅠの2ページぐらいの説明しか無かったのですよ…。

と、ところで、は、はてなのpreタグ解析、バグってませんか…?