*wieder ins Blaue schieß*
Du arbeitest immer mit Abschnitten von deinem gesamten Quellcode. Wenn du jetzt diese Abschnitte weiter zerlegst, so gehst du die Liste der Elementdefinitionen so lange durch, bis eine Definition auf deinen Abschnitt passt.
Beispiel:
|
Quellcode
|
1
2
3
4
5
6
|
Ausdruck := Summand + Summand
Ausdruck := Faktor * Faktor
Ausdruck := [+|-] Konstante
...
Summand := Ausdruck
Faktor := Ausdruck
|
Wenn du jetzt den Abschnitt "3+5" auswertest, gehst du die Liste durch
1. passt
Damit hast du dann Summand + Summand => der erste Summand ist 3, der zweite 5.
Wenn du "2*3+5" auswertest, gehst du wieder durch die Liste:
1. passt
D.h. der erste Summand ist "2*3", der zweite "5"
Nun gehts weiter: suche "2*3" in der Liste
1. passt nicht
2. passt => Faktor1 ist "2", Faktor2 ist "3".
2, 3 und 5 sind nun alle Konstanten und lassen sich nicht weiter auflösen.
Wenn du nun die Berechnung durchführen willst, so gehst du rückwärts vor und setzt alles wieder ein:
Summand(Faktor(2) * Faktor(3)) + Summand(5)
Hier sieht man jetzt sehr schon an der Klammersetzung, dass zuerst 2*3 ausgerechnet wird und erst _danach_ 5 draufaddiert wird.
Jetzt drehen wir das Beispiel mal um und nehmen folgende Liste an:
|
Quellcode
|
1
2
3
4
5
6
|
Ausdruck := Faktor * Faktor
Ausdruck := Summand + Summand
Ausdruck := [+|-] Konstante
...
Summand := Ausdruck
Faktor := Ausdruck
|
Wenn wir "2*3+5" nun wieder zerlegen, wird daraus Faktor(2) * Faktor(Summe(2+5)). Wie man sehr schon sieht, entspricht das "2*(3+5)", obwohl die mathematischen Rechenregeln eigentlich "(2*3)+5" vorschreiben würden.
Deswegen kann man in der Sprachtheorie Operatoren mit in den Ausdrücken definieren, wobei die Operatoren mit der niedrigsten Priorität immer ganz oben landen. Denn bei der eigentlichen Berechnung wird es von unten aufgerollt und die als ersten "gematchten" Operatoren werden als letztes ausgeführt.
In den meisten anständigen C++-Büchern (C++ Primer
) Findest du eine (lange) Liste der Operatorprioritäten der Sprache selber, zusammen mit der Assoziativit und so weiter.
Als Alternative zur Infixnotation gibt es noch die
Präfixnotation (die du spätestens mit funktionalen Sprachen kennen lernen wirst) - die hat damit weniger Probleme, da die Reihenfolge direkt durch die Definition vorgegeben ist.
MfG