phpLex
http://d.hatena.ne.jp/maru_cc/20080316/1205690507
gettextで国際化指定しているところを抜き出すのに
パーサーとか考えていたらこんなのがあるのを知ったので、ちょっとみてみた。
参考になったので補足分を追記してみる。
「%%」で区切られて大きく3つのブロックになっている。
userCode %% userDeclare %% userRules
- userCode部
そのまま作成されるPHPの先頭に記述される。 主に定数定義やinclude時に行う処理を記述することになると思われる。 重要なのは状態のトークン定義だと思われる。 userDeclare部の%stateで指定される状態名を前から順にシーケンシャルに番号を振っておく必要があるように思われる。 「YYINITIAL」は内部的に必ず指定されていて「0」になる。
- userDeclare部
解析時に内部使用する値を指定する部分。以下が指定できる。 %{ : クラスコード指定開始。%} までの部分がクラス名の直下に記述される。 (2バイト目以降に文字がないと無視されるっぽい。空白は無視される?) %} : クラスコード指定終了。 %/ : コメント %char : 内部で「$this->yychar」が宣言される。 %class : 生成されるPHPクラス名を指定する。 %eof{ : ? %eof} : ? %eofval{ : ? %eofval} : ? %function : メインメソッド名を指定。指定しない場合は「yylex」 %full : ASCII文字をすべて使う? %integer : 現在使用していない %intwrap : 現在使用していない %init{ : 初期化処理指定開始。%init} までの部分がコンストラクタの最後に記述される。 %init} : 初期化処理指定終了。 %implements : 現在使用していない %ignorecase : 大文字小文字を無視するかどうか %ignore_token : メインメソッドの返値を指定 %line : 内部で「$this->yyline」が宣言される。 %public : 現在使用していない %state : 状態名を指定する。カンマ区切りで複数指定可。 %type : 現在使用していない %unicode : 現在使用していない %yyeof : 現在使用していない %namespace : 現在使用していない %で始まっていないものは「正規表現マクロ」となる。
- userRules部
指定した状態で正規表現に合致した場合の処理を記述する。 <状態名> 正規表現 {処理内容} 状態名:userDeclare部の%stateで指定されている状態名 正規表現: userDeclare部の「正規表現マクロ」を指定する場合は「{」「}」で囲む。解析時にuserDeclare部の正規表現に置換される。 文字列は「"」で囲む? 状態の遷移:状態を移行する場合は、$this->yybegin()で遷移先の状態のインデックスを指定する。