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ブックが推奨する方法で構築されています。最初のステップで基本的な表現があり、演算子の各レベルが次々に来ています。
この優先順位のジャンプを処理する方法はありますか?