Prioritäten
Prioritätstabellen
Ein komplexer Ausdruck kann auf unterschiedliche Weise in Teilausdrücke zerlegt werden. So kann man den Ausdruck 1 / 2 / 3 als ( 1 / 2 )/ 3 oder als 1 /( 2 / 3 ) auffassen. Jedoch ist nur die erste Interpretation richtig. Man sagt dafür auch der Divisionsoperator "/" sei linksassoziativ.
Wenn in einem Ausdruck unterschiedliche Operatoren auftauchen, dann kann es vorkommen, daß einer davon eine höhere Bindungskraft hat und dadurch die Assoziativität irrelevant wird. So ist der Ausdruck 1 + 2 · 3 beispielsweise immer als 1 +( 2 · 3 ) zu lesen und nie als ( 1 + 2 )· 3, weil der Multiplikationsoperator "·" höhere Priorität hat als der Additionsoperator. (Man sagt auch „Punktrechnung geht vor Strichrechnung.“)
Für eine Programmiersprache faßt man Assoziativität und Priorität der Operatoren oft in einer Tabelle zusammen. Für den bekannten Fall von Punktrechnung und Strichrechnung sieht solch eine Tabelle beispielsweise folgendermaßen aus. Das "L" kennzeichnet Linksassoziativität, und Operatoren mit stärkerer Bindungskraft stehen weiter oben. Operatoren innerhalb einer Zeile haben die gleiche Priorität (dann ist die Assoziativität zu berücksichtigen).
Priorität und Assoziativität einiger OperatorenL * / Multiplikation, Division
L + - Addition, Subtraktion
Produktionen
Die Interpretation eines Ausdrucks wird innerhalb einer Grammatik durch Produktionen festgelegt, die ebenfalls Assoziativität und Priorität klarstellen können. Dazu sei folgendes Beispiel gegeben,
- 〈primary-expression〉 ::=
- "1" | "2" | "3".
- 〈multiplicative-expression〉 ::=
- 〈primary-expression〉 |
〈multiplicative-expression〉 "*" 〈primary-expression〉 |
〈multiplicative-expression〉 "/" 〈primary-expression〉. - 〈expression〉 ::=
- 〈multiplicative-expression〉 |
〈expression〉 "+" 〈multiplicative-expression〉 |
〈expression〉 "-" 〈multiplicative-expression〉.
Angesichts dieser Regeln kann man den Ausdruck "1 + 2 * 3" nur als 〈expression〉 "+" 〈multiplicative-expression〉 lesen, aber nicht als 〈multiplicative-expression〉 "*" 〈primary-expression〉, weil der Text "1 + 2" keine 〈multiplicative-expression〉 ist. So ist der Vorrang der Punktrechnung bereits durch die Produktionen klargestellt, ohne daß er einer zusätzlichen Festlegung bedarf. Daher ist eine Prioritätstabelle keine notwendige zusätzliche Angabe zu einer Grammatik, sondern nur eine übersichtliche Darstellung von Informationen, die aber ohnehin schon in der Grammatik einer Sprache enthalten sind. Eine Prioritätstabelle kann auch nicht immer alle zur eindeutigen Interpretation eines Ausdrucks notwendigen Festlegungen der Grammatik darstellen, in bestimmten Sprachen muß zur Interpretation von Ausdrücken mit ternären Operatoren beispielsweise die Grammatik herangezogen werden.
Übungsaufgabe Wie bringen die Produktionen die Linksassoziativität zum Ausdruck?
Fragen und Antworten
Zu dieser Lektion wurden folgende Fragen gestellt.
- ¿ Was bedeutet das fragezeichen in der Zeile: "...beispielsweise in dem Falle des C++-Ausdrucks "a = b < c ? d = e : f = g..." oder hab ich da nicht aufgepasst?
- In einem früher in dieser Lektion enthaltenen Absatz wurde der ternäre ?:-Operator verwendet, dessen Bedeutung in dieser Lektion nicht behandelt werden sollte. Da die Verwendung dieses Operators aber möglicherweise vorausgreift, habe ich den betreffenden Absatz inzwischen aus dieser Lektion entfernt.