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.
Ein tatsächliches C oder C++ Beispiel wäre wahrscheinlich klarer. – chris
In welcher Sprache? Dein eigenes? Tja, mach das dann nicht! Es ist eine mehrdeutige Grammatik, die keine einzige Lösung hat. – Pubby
Es wird vom Compiler bestimmt, wie man den Grammatikbaum analysiert.Lesen << Compilers Prinzipien, Techniken und Werkzeuge >> wird Ihnen viel helfen. – MYMNeo