Spezielle Zeichenkombinationen
Neben dem schon behandelten Vorzeichenoperator »-« gibt es auch noch einen Operator »--«. Dieser Doppelminus-Operator »--« gilt als eine einzige lexikalische Einheit und wird geschrieben, indem an einer Stelle, an der ein Operator stehen kann, zwei Minuszeichen direkt hintereinander geschrieben werden. Diese beiden Zeichen gelten dann nicht als eine Abfolge zweier Vorzeichen (zwei lexikalische Einheiten), sie sind zu einer einzigen lexikalische Einheit, dem Doppelminus-Operator »--«, verschmolzen.
Zwei Vorzeichenoperatoren »-« (zwei lexikalische Einheiten), die direkt hintereinander stehen sollen, müssen durch Leerraum getrennt werden, damit sie nicht zum Doppelminus-Operator »--« (eine lexikalische Einheit) verschmelzen.
Zur Trennung zweier Vorzeichenoperatoren kann beispielsweise ein Leerzeichen verwendet werden.
- Zwei mit einem Leerzeichen getrennte Vorzeichenoperatoren
- -
Die Bedeutung des Doppelminus-Operators »--« wird erst später behandelt werden, da er vorerst nicht benötigt wird. Wo zwei Vorzeichen hintereinander vorkommen können, wird in der nächsten Lektion gezeigt werden.
Das hier für »-« Gesagte gilt auch für den Operator »+« entsprechend.
Es gibt zwar auch noch einige andere Zeichenkombinationen mit spezieller Bedeutung, aber diese werden nie getrennt benötigt, so daß man sie sich nicht merken muß. Die Vorzeichenoperator stellen also eine Ausnahme dar.
Unter einem Sonderzeichen verstehen wir hier ein Zeichen, das weder Buchstabe noch Ziffer, Leerzeichen oder Zeilenende ist. Beispielsweise sind »*« und »,« Sonderzeichen.
Man kann grundsätzlich davon ausgeben, daß Sonderzeichen nicht mit Leerraum voneinander getrennt werden müssen. Nur zwei gleiche direkt aufeinanderfolgende Vorzeichen müssen mit Leerraum voneinander getrennt werden, aber diese kommen in der Praxis nicht vor.
Zufällig verbessert ein Leerzeichen zwischen zwei Minuszeichen die Lesbarkeit nicht nur für die Implementation der Programmiersprache, sondern auch für Menschen, da zwei direkt aufeinanderfolgenden Minuszeichen manchmal wie ein einziger langer Gedankenstrich aussehen können.
Syntaxdiagramme
Das folgende Syntaxdiagramm bringt zunächst zum Ausdruck, daß eine Vorzeichenfolge aus aus optionalem Leerraum, der lexikalischen Einheit »-«, optionalem Leerraum, der lexikalischen Einheit »-« und wieder aus optionalem Leerraum bestehend darf.
Damit nicht die lexikalische Einheit »--« entsteht, ist bei der Anwendung des folgenden Syntaxdiagramms Leerraum für den mittleren Pfeil einzusetzen. Obwohl ein Pfeil im Syntaxdiagramm meistens optionalen Leerraum angibt, ist der Leerraum in diesem speziellen Fall also obligatorisch.
- Syntaxdiagramm
Vorzeichenfolge
.-. .-.
--->( - )--->( - )--->
'-' '-'
Ob Leerraum obligatorisch (notwendig) oder optional (entbehrlich) ist, kann nicht an den Syntaxdiagrammen alleine abgelesen werden! Vielmehr muß man sich noch zusätzlich merken, daß Leerraum verwendet werden muß, wenn sonst eine lexikalische Einheit wie »--« entstehen würde, die in dem betreffenden Fall nicht gewünscht wird.
Nicht jedes Programm, das nach den Syntaxdiagrammen korrekt aufgebaut, ist auch ein korrektes Programm. Es sind auch noch weitere Regeln zu beachten, wie beispielsweise:
- Trennung lexikalischer Einheiten, die nicht zu einer einzigen lexikalischen Einheit verschmelzen sollen, und
- Typregeln.
Einige weitere solcher Regeln werden im Verlauf des Kurses noch vorgestellt werden.
Andere Kombinationen lexikalischer Einheiten
In »-65« ist vergleichsweise kein Leerraum nach dem Minuszeichen »-« nötig, weil »-65« nicht als einzige lexikalische Einheit interpretierbar ist. Daher ist es hier auch ohne Leerzeichen klar, daß es sich bei dem Text um eine Abfolge zweier lexikalischer Einheiten handeln muß. Es wäre aber auch die Schreibweise »- 65« mit Leerraum erlaubt.
Operatoren
Nachdem wir zuvor einen Operator als ein Zeichen definiert hatten, welches in bestimmter Weise mit Literalen verbunden werden kann, um damit einen bestimmten Wert anzugeben, müssen wir Operatoren nun etwas allgemeiner definieren, weil wir jetzt schon vom Operator »--« gehört haben, der zwar eine lexikalische Einheit, aber kein Zeichen ist:
Definition: Ein Operator ist eine lexikalische Einheit, die mit Ausdrücken verbunden werden kann, um damit einen neuen Ausdruck zu ergeben.
Gieriges Verzehren *
Wenn an einer Stelle ein Zeichen zu der vor ihm stehenden lexikalischen Einheit hinzugezählt werden kann, so wird dies auch getan, selbst wenn es ebenfalls möglich wäre, das Zeichen als Beginn einer neuen lexikalischen Einheit anzusehen. So gilt »22« als eine lexikalische Einheit, obwohl die beiden »2« isoliert betrachtet auch jeweils eine lexikalische Einheit darstellen, weswegen »22« auch als Folge zweier lexikalischer Einheiten angesehen werden könnte.
Beim Lesen von Quelltext zerlegt die Implementation einer Programmiersprache den Quelltext zunächst in lexikalische Einheiten. Den Teil der Implementation, welcher dafür zuständig ist, nennen wir hier den lexikalischen Leser.
Wenn der lexikalische Leser einer Implementation der Programmiersprache beim Lesen von Programmen eine Zeichenfolge gefunden hat, welche der Anfang einer lexikalischen Einheit sein kann, und das nächste Zeichen mit dieser Zeichenfolge zusammen den Anfang einer lexikalischen Einheit bilden kann, dann wird jenes nächste Zeichen verwendet, um den bisherigen Anfang zu verlängern. Kurz gesagt versucht der lexikalische Analysator die lexikalischen Einheiten durch „gieriges Verzehren“ von Zeichen so lang wie möglich zu machen, er versucht so viele Zeichen wie möglich an eine einmal begonnene lexikalische Einheit anzuhängen.
Beispielsweise liest der lexikalische Leser zunächst das Zeichen »-«. Dies kann der Anfang einer lexikalischen Einheit sein. Wenn nun ein weiteres »-« gelesen wird, dann wird dies zu dem Anfang hinzugefügt, weil es auch eine lexikalische Einheit gibt, die mit »--« beginnt (nämlich die lexikalische Einheit »--« selber), und es entsteht »--«. Wenn nun noch ein Minus gelesen wird, so kann dies nicht mehr hinzugefügt werden, da »---« kein Anfang einer lexikalischen Einheit mehr sein kann (es gibt keine lexikalische Einheit »---« und keine lexikalische Einheit, die mit »---« beginnt). Daher ist damit die erste lexikalische Einheit »--« erkannt und abgeschlossen, und das neue »-« wird als Anfang einer neuen lexikalischen Einheit behandelt.
- Zerlegung in lexikalische Einheiten
Eingabe Zerlegung in lexikalische Einheiten
65 65
-65 - 65
--65 -- 65
---65 -- - 65
----65 -- -- 65
-----65 -- -- - 65
Der lexikalische Analysator arbeitet also unabhängig von der Syntax der Sprache und nimmt daher keine Rücksicht darauf, daß bei dieser Art der Analyse manchmal eine Folge lexikalischer Einheiten entsteht, die syntaktisch fehlerhaft ist, und durch eine andere Vorgehensweise eine Folge lexikalischer Einheiten gebildet werden könnte, die syntaktisch korrekt ist.