11

Wenn wir einen Ausdruck haben:Links assoziative Operatoren vs rechten assoziative Operatoren

a $ b @ c 

$ ist eine links assoziativen Operator ist @ rechtsassoziativ. Sie haben die gleiche Priorität.

Wie wird dieser Ausdruck analysiert? Als (a $ b) @ c oder als a $ (b @ c)?

+1

Ein tatsächliches C oder C++ Beispiel wäre wahrscheinlich klarer. – chris

+1

In welcher Sprache? Dein eigenes? Tja, mach das dann nicht! Es ist eine mehrdeutige Grammatik, die keine einzige Lösung hat. – Pubby

+0

Es wird vom Compiler bestimmt, wie man den Grammatikbaum analysiert.Lesen << Compilers Prinzipien, Techniken und Werkzeuge >> wird Ihnen viel helfen. – MYMNeo

Antwort

6

Operatoren mit der gleichen Priorität sind alle entweder rechts assoziativ oder alle links assoziativ, so dass das Problem nicht auftritt.

+1

Richtig, ich hätte betrunken sein sollen, um das zu fragen. Da jede Sprache unterschiedliche Präzedenzfälle hat, sollte es keine Standards dafür geben. Sie werden von den Compiler-Designern entschieden. Und ein cleverer Designer würde Do wie Dipstick gesagt haben. –

+3

@RobertBean, glücklicherweise werden sie von Sprachdesignern entschieden und sind für jede Sprache standardisiert. Wenn dies dem Compiler-Implementor überlassen würde, könnten Sie niemals portablen Code schreiben. –

10

Dies ist eine ausgezeichnete Frage. Während der Dipstick korrekt ist, dass in vielen Sprachen Operator-Präzedenzfälle und Assoziativitäten definiert sind, um ein solches Problem zu vermeiden, gibt es Sprachen, in denen eine solche Situation auftreten kann.

Haskell ist eine solche Sprache. Es erlaubt Ihnen, Ihre eigenen Infix-Operatoren und ihre Präzedenz (ganze Zahl von 0 bis 9) und Assoziativität (links, rechts, nicht) zu definieren. Es ist einfach, die Voraussetzungen für das Szenario erstellen Sie beschrieben:

infixl 5 $$ 
($$) :: Int -> Int -> Int 
a $$ b = a + b 

infixr 5 @@ 
(@@) :: Int -> Int -> Int 
a @@ b = a * b 

Und dann die Situation selbst:

uhoh = 1 $$ 2 @@ 3 

Dies führt zu dieser Fehlermeldung:

Precedence parsing error 
    cannot mix `$$' [infixl 5] and `@@' [infixr 5] in the same infix expression 

Natürlich Haskells Lösung - mit einem Parse-Fehler abgebrochen - ist nicht der einzige Weg, um mit diesem Problem umzugehen, aber es ist sicherlich ein vernünftiger.

Weitere Informationen zum Parsing von Operatoren in Haskell finden Sie in Abschnitt 4.4.2 von the Haskell report.