Zur Themenübersicht     

Aufgaben von Scanner, Parser und Codierer

Noch einmal: Sprachanalyse:

Um eine Sprache zu analysieren, sind mehrere Schritte nötig. Diese werden im folgenden beschrieben und auf Scanner und Parser verteilt. 

1.1 lexikalische Analyse als Aufgabe des Scanners

Wir gehen davon aus, dass der Quelltext z.B. eines Aufsatzes oder eben eines Logo-, Java- oder Pascalprogrammes als Folge von (ASCII-)-Zeichen vorliegt. Mit dieser Zeichenfolge setzt sich der Scanner auseinander.

In der Menge aller möglichen Zeichenfolgen interessiert man sich für diejenigen, die gewissen lexikalischen Bedingungen genügen (etwa die in einem Duden). Damit beschäftigt sich die lexikalische Analyse.

Deutsche Sprache: Mini-Logo

"hallo" 
ist lexikalisch richtig

"a234sadf&%" 
ist lexikalisch falsch.

"VW" 
ist lexikalisch richtig

"vorwaerts" 
ist lexikalisch falsch 

 

Der Scanner hat die Aufgabe, aus dem Zeichenstrom die lexikalisch richtigen Ausdrücke herauszusuchen. Während falsche lexikalische Ausdrücke bei den meisten Scannern zu Fehlermeldungen führen, haben wir uns - fürs erste - dazu entschlossen, diese einfach zu überlesen. 

Die Folge lexikalisch sinnvoller Ausdrücke wird dann z.B. in einem Array oder besser in einer dynamische Datenstruktur gespeichert.  Um dem Parser (s.u.) die weiteren Aufgaben zu vereinfachen, ist es sinnvoll, den Typ des lexikalischen Ausdrucks (Befehl, Zahl, Sonderzeichen) gleich mit zu speichern.  Die Zusammenfassung von lexikalischem Ausdruck und Typ des Ausdrucks nennen wir ein Token. 

Also: Der Scanner erkennt die lexikalisch sinnvollen Ausdrücke einer (Programmier-) Sprache und speichert sie mit dem jeweiligen Typ in einer Tokenfolge, die er dem Parser zur weiteren Bearbeitung übergibt.

 

1.2 syntaktische Analyse als Aufgabe des Parsers

Im Deutschen kann eine Folge lexikalisch richtiger Zeichenreihen, also eine Folge von "Worten" einen "Satz" bilden, wenn die Wortfolge gewissen grammatikalischen Regeln entspricht:

"Paul bist keiner Stuhl hallo" 
ist lexikalisch korrekt aber syntaktischer Unsinn, 
weil dieser Satz nicht der deutschen Grammatik entspricht.
"Paul sitzt grüne Fische"
 ist syntaktisch (also grammatikalisch) richtig (aber semantischer Unsinn)

 

Ebenso stellen in Mini-Logo Tokenfolgen ein richtiges Logo-Programm dar, wenn sie den Regeln der Logo-Syntax entsprechen

Aufgabe des Parsers ist es, festzustellen, ob die Folge lexikalisch richtiger Ausdrücke, welche der Scanner geliefert hat, der Syntax der jeweiligen Programmiersprache entspricht. Ferner bearbeitet der Parser die Tokenfolge weiter zur Vorbereitung der Codierung des Programmtextes.

 

1.3 semantische Analyse

Wie schon bemerkt, ist der Satz "Paul sitzt grüne Fische" syntaktisch korrekt aber semantisch falsch. Einfacher ausgedrückt: er macht keinen Sinn. Um den  Sinn von Sätzen erkennen zu können, müssen die Worte in ihrem Kontext erfasst werden. Ähnliche Probleme stellen sich auch bei Programmiersprachen. So müssen z.B. Variable, genauer Variablenbezeichner,  erst deklariert werden, bevor sie benutzt werden können.  Hier verlassen wir den Bereich der kontextfreien Sprachen. Eine genauere Behandlung dieser Probleme ist im schulischen Rahmen kaum möglich.  Wir werden allerdings an einem Beispiel später auch auf einfache semantische Fragen eingehen.

Unser Mini-Logo ist allerdings (noch) so einfach, dass syntaktisch korrekte Programme auch immer semantisch korrekt sind.

1.4. Ausführen des Programmes als Aufgabe des Codierers

Aufgabe des Codierers ist es, ein syntaktisch (und semantisch) korrektes Programm in eine Befehlsfolge einer Zielsprache (meist eine Maschinensprache, oder wie bei JAVA eine Zwischensprache) zu übersetzen. Geschieht dies für die gesamte Befehlsfolge des Quellprogrammes, bilden Scanner, Parser und Codierer einen sog. Compiler. Werden die Teilbefehle des Quellprogrammes sofort ausgeführt, spricht man von einem Interpreter

Wir werden im Folgenden einen Interpreter schreiben, der die Mini-Logo-Befehle in Befehle unserer in der 12.1 entwickelten  Turtle umsetzt.