ANTLR 3.4でPHP5パーサーを作成しました。これはほぼ準備ができていますが、PHPのトリッキーな機能の1つを処理できません。私の問題は、代入演算子の優先順位にあります。PHPのマニュアルにあるように、割り当ての優先順位はリストのほぼ最後にあります。and、、およびのみがリストの後ろxorにあります。or,
しかし、このマニュアルページには次のような注記があります。
他のほとんど
=の演算子よりも優先順位は低くなりますが、PHPでは次のような式を使用できます。if (!$a = foo())この場合、の戻り値foo()はになり$aます。
メモの小さな例は私のパーサーにとって問題ではありません。これは、割り当てルールの特殊なケースとして処理できます。
しかし、もっと複雑なコードがあります。例:
if ($a && $b = func()) {}
私のパーサーはここで失敗します。これは、パーサーが最初に認識$a && $bし、残りの条件を処理できないためです。これは、&&がよりも優先順位が高いためです=。の右側に角かっこを入れた場合&&:
if ($a && ($b = func())) {}
このようにして、パーサーは構造をよく認識します。
演算子は、ANTLRブックが推奨する方法で構築されています。最初のステップで基本的な表現があり、演算子の各レベルが次々に来ています。
この優先順位のジャンプを処理する方法はありますか?
