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()で遷移先の状態のインデックスを指定する。