要するに、構文解析の目的で、角かっこ/引用符を追加して基本的なコード修正を試みる関数が必要でした。つまり、結果のコードは実行可能であるとは期待されていません。
いくつかの例を見てみましょう。
[1] class Aaa { $var a = "hi"; => class Aaa { $var a = "hi"; }
[2] $var a = "hi"; } => { $var a = "hi"; }
[3] class { a = "hi; function b( } => class { a = "hi; function b( }"}
[4] class { a = "hi"; function b( } => class { a = "hi"; function b() {}}
PS:上記の4番目の例は非常に複雑に見えますが、実際には非常に簡単です。エンジンがスタックと一致しない終了ブラケットトークンを見つけた場合、そのトークンの前の反対のトークンである必要があります。ご覧のとおり、これはかなりうまく機能します。
関数シグネチャとしては、次のようになります。balanceTokens($code, $bracket_tokens, $quote_tokens)
私が書いた関数はスタックを使って動作します。まあ、それは正確には機能しませんが、スタックを使用します。
function balanceTokens($code, $bracket_tokens, $quote_tokens){
$stack = array(); $last = null; $result = '';
foreach(str_split($code) as $c){
if($last==$c && in_array($c, $quote_tokens)){
// handle closing string
array_pop($stack);
}elseif(!in_array($last, $quote_tokens)){
// handle other tokens
if(isset($bracket_tokens[$c])){
// handle begining bracket
$stack[] = $c;
}elseif(($p = array_search($c, $bracket_tokens)) != false){
// handle ending bracket
$l = array_pop($stack);
if($l != $p)$result .= $p;
}elseif(isset($quote_tokens[$c])){
// handle begining quote
$stack[] = $c;
$last = $c;
}// else other token...
}
$result .= $c;
}
// perform fixes
foreach($stack as $token){
// fix ending brackets
if(isset($bracket_tokens[$token]))
$result .= $bracket_tokens[$token];
// fix begining brackets
if(in_array($token, $bracket_tokens))
$result = $token . $result;
}
return $result;
}
この関数は次のように呼び出されます。
$new_code = balanceTokens(
$old_code,
array(
'<' => '>',
'{' => '}',
'(' => ')',
'[' => ']',
),
array(
'"' => '"',
"'" => "'",
)
);
はい、それは非常に一般的であり、ハードコードされたトークンはありません。
なぜそれが機能しないのか、私には少しもわかりません...実際のところ、それが機能するかどうかさえわかりません。私はそれを書くことにあまり考えていなかったことを認めます。多分私が見ていない明らかな問題があります。