私たちが表現している場合:左結合演算子対右結合演算子
a $ b @ c
$
を@
が右結合で、左結合演算子です。 これらは同じ優先順位を持ちます。
この式はどのように解析されていますか? (a $ b) @ c
またはa $ (b @ c)
として?
私たちが表現している場合:左結合演算子対右結合演算子
a $ b @ c
$
を@
が右結合で、左結合演算子です。 これらは同じ優先順位を持ちます。
この式はどのように解析されていますか? (a $ b) @ c
またはa $ (b @ c)
として?
同じ優先順位の演算子はすべて右結合またはすべて左結合であるため、問題は発生しません。
そうですね、私はこれを聞くために酔っていたはずです。各言語は異なる優先順位を持っているので、これに関する基準はないはずです。それらはコンパイラ設計者によって決定されます。そして巧妙なデザイナーはDipstickが言ったようにやります。 –
@RobertBean、幸いにも彼らは言語デザイナーによって決定され、各言語のために標準化されています。これがコンパイラの実装者に委ねられると、移植可能なコードを書くことはできません。 –
これは素晴らしい質問です。ディップスティックは正しいが、多くの言語では、オペレータの優先順位と関連性がこのような問題を回避するために定義されているが、そのような状況が発生する可能性のある言語がある。
ハスケルはそのような言語です。独自の中置演算子とその優先順位(0〜9の整数)と結合性(左、右、非)を定義することができます。それはあなたが説明したシナリオの前提条件を簡単に作成できます:
infixl 5 $$
($$) :: Int -> Int -> Int
a $$ b = a + b
infixr 5 @@
(@@) :: Int -> Int -> Int
a @@ b = a * b
そして状況自体:
uhoh = 1 $$ 2 @@ 3
これは、このエラーメッセージで結果:もちろん
Precedence parsing error
cannot mix `$$' [infixl 5] and `@@' [infixr 5] in the same infix expression
、Haskellのこの問題を解決する唯一の方法ではありませんが、確かに合理的です。
ハスケルでの演算子解析の詳細については、セクション4.4.2のthe Haskell reportを参照してください。
実際のCまたはC++の例は、おそらくもっと明確になります。 – chris
どの言語でですか?あなた自身の?さて、そうしないでください!それは解決する単一の方法を持たないあいまいな文法です。 – Pubby
コンパイラが文法ツリーを解析する方法を決定します。<<コンパイラの原則、テクニック、およびツール>>を読むことで、多くの助けになります。 – MYMNeo