どのプログラミング言語の教科書でも、その言語の各演算子がどのように左結合性または右結合性を持っているかについて常に説明されています。結合性は、オペランドの数に関係なく、すべての演算子の基本的なプロパティのようです。また、結合性を他の演算子に割り当てる方法に関係なく、任意の結合性を任意の演算子に割り当てることができるように思えます。
しかし、なぜそうなるのでしょうか?おそらく、例の方が良いでしょう。架空のプログラミング言語を設計したいとします。この任意の方法でこれらの演算子に結合性を割り当てることは有効ですか (すべて同じ優先順位を持つ):
unary operator:
! right associative
binary operators:
+ left associative
- right associative
* left associative
/ right associative
! + - * / は、すべて同じ優先順位を持つ 5 つの演算子です。
はいの場合、2+2!3+5*6/3-5!3!3-3*2 のような式は、仮説パーサーによってどのように括弧で囲まれますか? なぜ。
編集:
最初の例 (2+2!3+5*6/3-5!3!3-3*2) は正しくありません。おそらく単項演算子を忘れて、このように言えば、上記の方法のように、同じ優先順位の異なる結合性を持つ演算子を割り当てることができますか? はいの場合、たとえば 2+3-4*5/3+2 はどのように評価されますか? ほとんどのプログラミング言語は、同じ優先順位を持つ演算子に同じ結合性を割り当てるように見えるためです。しかし、OPERATOR ASSOCIATIVITY については、優先順位のプロパティではなく、個々の演算子のプロパティであるかのように常に話します。