日記
PHPのparser (15:58)Edit

RubyでPHPのパーサーを書くのは面倒くさそうだけど、PHPが存在する環境では、PHPのtokenizerをそのまま使うようにすれば、PHPに対応するのも簡単そうだなー。ひとまずPHPでparseした結果を適当なフォーマットで出力するコードだけ書いてみた。

<?php
function tokenize($source) {
$tokens = token_get_all($source);
$parsed = '';
$result = '';
foreach ($tokens as $token) {
if (is_array($token)) {
$type = $token[0];
$text = $token[1];
} else {
$type = 0;  //literal?
$text = $token;
}
echo 'LINE: '.count(explode("\n", $parsed)).' LENGTH: '.strlen($parsed).' TYPE: '.$type.' TEXT: '.$text."\0";
$parsed .= $text;
}
}
if (isset($argv[1])) {
$source_file = $argv[1];
if (file_exists($source_file)) {
$source = file_get_contents($source_file);
} else {
die('FILE NOT EXISTS: '.$source_file);
}
} else {
$source = '';
$fp = fopen('php://stdin', 'r');
if ($fp) {
while (!feof($fp)) {
$source .= fread($fp, 4096);
}
fclose($fp);
}
}
tokenize($source);
?>

あとは、PHPのtypeで必要なものをgonzuiのtypeに読み替えたりしつつ、Ruby側でこの出力を取り込んでいけばいいのかな。あるいはPHPでRubyのソースコードを出力して、そのままevalさせたりとかできるんだろうか?

ただ、Rubyがわからなくてlangscan以下のディレクトリを見ても、何をやってるのかよくわからない。一回ちゃんとRubyのお勉強をしないと、いろいろ不都合(やりたいことがすぐにできない)が多いなー。

Published At2005-01-31 00:00Updated At2005-01-31 00:00