- blogs:
- cles::blog
2019/05/09

PHP の内容を AST で解析する



PHP のファイルが静的解析したくなったので、ソースから AST を得る方法を調べてみました。
以前、Eclipse の ASTParser を使う話を書いたことがありましたが、それの PHP 版になります。
今回の作業にあたって、以下のスライドがとても参考になりました。
PHP は 7 になってから内部的に AST が利用されているため、以前よりも AST を得るのは簡単になっています。
既に以下のような extension が提供されているので、いずれかをインストールすれば大丈夫です。
- nikic/php-ast: Extension exposing PHP 7 abstract syntax tree
- sgolemon/astkit: Parser kit for PHP7 ASTs
今回はマニュアルが充実している前者の nikic/php-ast を入れてみることにしました。
以下、構築メモになります。
† 準備
基本的には全てマニュアルに書いてあります。
Linux の場合には pecl を使えば簡単ですが、Windows の場合には対応するバイナリを手動で入れる必要があります。
面倒なので XAMPP を使っている場合に設定を自動的に行う bat を組んでみました。
phpast_setup.bat
cd C:\xampp\php\ext
curl -s https://frippery.org/files/busybox/busybox.exe --output busybox.exe
curl https://windows.php.net/downloads/pecl/releases/ast/1.0.1/php_ast-1.0.1-7.3-ts-vc15-x64.zip --output php_ast-1.0.1-7.3-ts-vc15-x64.zip
busybox unzip php_ast-1.0.1-7.3-ts-vc15-x64.zip php_ast.dll
busybox grep extension=php_ast.dll C:\xampp\php\php.ini > nul
if %ERRORLEVEL% == 1 (
busybox sed -e "s/^;extension=xsl/;extension=xsl\n\n#php-ast\nextension=php_ast.dll/" < C:\xampp\php\php.ini > C:\xampp\php\php.ini.new
move C:\xampp\php\php.ini C:\xampp\php\php.ini.old
move C:\xampp\php\php.ini.new C:\xampp\php\php.ini
)
del busybox.exe php_ast-1.0.1-7.3-ts-vc15-x64.zip
† 動作確認
今回は以下のように結果を単純に JSON に出力するようにしてあります。
種別やフラグをデコードするためには付属の ast_stub.php, util.php の内容が参考になります。
ast_json_dump.php
<?php
$code = <<<'EOC'
<?php
$var = 42;
EOC;
echo json_encode(ast\parse_code($code, $version=50), JSON_PRETTY_PRINT);
/*
OUTPUT:
{
"kind": 132, //AST_STMT_LIST
"flags": 0,
"lineno": 1,
"children": [
{
"kind": 517, // AST_ASSIGN
"flags": 0,
"lineno": 2,
"children": {
"var": {
"kind": 256, // AST_VAR
"flags": 0,
"lineno": 2,
"children": {
"name": "var"
}
},
"expr": 42
}
}
]
}
*/
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/10954
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . Thunderbird のメッセージをスレッド化しないようにする(7075)
2 . Word で数式がグレーアウトされていて挿入できないときは(6754)
3 . Windows 10 で勝手にログアウトされないようにする(5159)
4 . Firefox でパスワードが保存されるページとされないページの違い(3909)
5 . awk で指定した n カラム目以降を出力する(3484)
2 . Word で数式がグレーアウトされていて挿入できないときは(6754)
3 . Windows 10 で勝手にログアウトされないようにする(5159)
4 . Firefox でパスワードが保存されるページとされないページの違い(3909)
5 . awk で指定した n カラム目以降を出力する(3484)
cles::blogについて
Referrers