phcというphpコンパイラを使ってphpの構文木を取得してみたので記録しておきます。インストールに手こずりました。
phcについて
phcとはphpのコンパイラで、phpスクリプトをコンパイルして実行ファイルを作成する事ができます。例えば以下のようにコンパイルする事ができます。速くなるのかもしれませんが試していません。
% cat sample1.php < ?php echo "hello phc world\n"; ?> % phc -c sample1.php -o sample1 % ./sample1 hello phc world
コンパイルだけだとあまり使い道が思いつかないのですが、コンパイラ機能を一部解放してくれていて、読み込んだスクリプトの構文木をxmlで出力する事ができます。なのでこのツールを利用するとphpの構文木に手軽にアクセスできて便利です。例えば以下のように変換できます。
% phc --dump-xml=ast sample1.php > out.xml
% cat out.xml
< ?xml version="1.0"?>
<ast :PHP_script xmlns:AST="http://www.phpcompiler.org/phc-1.1"
xmlns:HIR="http://www.phpcompiler.org/phc-1.1"
xmlns:MIR="http://www.phpcompiler.org/phc-1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</ast><ast :Statement_list>
-- 長いので省略 --
</ast>インストール手順
- phpをenable-embedを有効にしてインストール
- phcをインストール
1. phpをenable-embedを有効にしてビルドしてインストール
あまり理解していないのですが、phcを使用するにはphpが–enable-embedというフラグが有効状態でインストールされている必要があります。このフラグはyumやapt等のパッケージ管理ツールでインストールした場合は、ほぼ無効状態なので、ソースからビルドし直します。
僕はここでハマりました。完全に正しいかどうかは解らないのですが、試行錯誤の結果、手元で動作した際のconfigureオプションを以下に書いておきます。phpのソースは最新の5.2.10を使いました。OSはCentOS 5.3になります。osxでも試してみましたが上手く行きませんでした。
% wget http://jp2.php.net/get/php-5.2.10.tar.bz2/from/jp.php.net/mirror % tar jxvf php-5.2.10.tar.bz2 % cd php-5.2.10 % ./configure \ --enable-bcmath \ --enable-embed \ --enable-cli \ --prefix=/usr \ --with-zlib-dir=/usr \ --enable-mbstring \ --enable-mbregex \ --enable-sockets \ --with-iodbc=/usr \ --with-curl=/usr \ --with-config-file-path=/etc \ --with-xmlrpc \ --with-xsl=/usr \ --without-pear \ --without-iodbc % make && make install
2. phcをインストール
phpのインストールが完了したら、phcをソースコードからインストールします。boostやその他パッケージが何かと必要になりますが、configureがエラーを吐くので、エラーに従って必要なライブラリをインストールして下さい。
% wget http://phc.googlecode.com/files/phc-0.2.0.3.tar.bz2 % tar jxvf phc-0.2.0.3.tar.bz2 % cd phc-0.2.0.3 % ./configure --includedir=/usr/include/php --with-php=/usr --disable-gc % make && make install
なお、手順1でphpが上手くインストールされていないと、configureが以下のような警告を出します。この警告が出た場合は、phc自体のインストールは出来ますが、動きませんので手順1をやり直して下さい。
******************************************************************************* * It seems the PHP embed SAPI has not been installed. * * * * You will be able to compile and run phc, but you will not be able to * * compile PHP scripts with phc. * * * * To install the PHP embed SAPI, follow the PHP installation instructions, * * but make sure to pass the --enable-embed option to the PHP configure * * script. * *******************************************************************************
まとめ
という訳で、以上でphpの構文木にアクセスする手段が出来ました。以下のようにすると標準出力に構文木を表すXMLが得られます。
% phc --dump-xml=ast (phpファイル名)
他にも幾つか出力形式が選べるようですが、詳しくはドキュメントを参照して下さいませ。
一応上記sample1.phpのXML出力を貼付けておきます。十分実用レベルの構文木が得られてると思います。
出力したXML

