3

どのプログラミング言語の教科書でも、その言語の各演算子がどのように左結合性または右結合性を持っているかについて常に説明されています。結合性は、オペランドの数に関係なく、すべての演算子の基本的なプロパティのようです。また、結合性を他の演算子に割り当てる方法に関係なく、任意の結合性を任意の演算子に割り当てることができるように思えます。

しかし、なぜそうなるのでしょうか?おそらく、例の方が良いでしょう。架空のプログラミング言語を設計したいとします。この任意の方法でこれらの演算子に結合性を割り当てることは有効ですか (すべて同じ優先順位を持つ):

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 については、優先順位のプロパティではなく、個々の演算子のプロパティであるかのように常に話します。

4

2 に答える 2

5

結合性が何を意味するかを思い出してみましょう。任意の演算子を例にとります@。誰もが知っているように、その結​​合性は、形式の式のあいまいさを解消するa @ b @ c規則@です(a @ b) @ c。右連想の場合、a @ (b @ c). また、関連付けられていない場合もあり、その場合a @ b @ cは構文エラーです。

@たとえばとという 2 つの異なる演算子がある場合はどうなる#でしょうか。一方の優先順位が他方よりも高い場合、これ以上言うことはありません。結合性が行う作業はありません。優先順位が明確化を処理します。ただし、それらが同等の優先順位である場合、それを支援するために結合性が必要です。次の 3 つの簡単なケースがあります。

  • 両方の演算子が結合されている場合は、a @ b # cを意味し(a @ b) # cます。
  • 両方の演算子が右結合の場合、a @ b # cを意味しa @ (b # c)ます。
  • 両方の演算子が関連付けられていない場合a @ b @ cは、構文エラーになります。

残りのケースでは、演算子は結合性について同意しません。どのオペレーターの選択が優先されますか? おそらく、そのような結合優先規則を考案することもできますが、課す最も自然な規則は、大文字と小文字の構文エラーを宣言することだと思います。結局のところ、2 つの演算子の優先順位が等しい場合、一方が他方よりも結合性を優先するのはなぜでしょうか?

私が与えた自然なルールの下では、あなたの例の式は構文エラーです。

これで、同じ優先順位の演算子に異なる結合性を割り当てることができます。ただし、これは、構文エラーである同じ優先順位の演算子の組み合わせ (例のように!) があることを意味します。ほとんどの言語設計者は、それを避け、同じ優​​先順位のすべての演算子に同じ結合性を割り当てることを好むようです。そうすれば、すべての組み合わせが有効になります。それはただの美学だと思います。

于 2012-07-29T20:27:18.460 に答える
1

何らかの形で結合性を定義する必要があり、ほとんどの言語は結合性 (および優先順位) を「自然に」割り当てて、一般的な数学の規則に一致させることを選択します。

ただし、注目すべき例外があります。APL には厳密な右から左への結合性があり、すべての演算子の優先順位は同じです。

于 2012-07-28T11:26:03.617 に答える