Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Quelltext in Tokens zerlegen (Lexer)

Nach dieser Lektion: Ich kann Quelltext in Tokens zerlegen.

Lektion, 50 Min.9 BefehleLab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Ein Komma, das niemand erwartet hat

Im Lager eines Versandhändlers tippt ein Mitarbeiter 2,5 + 1 in ein kleines Rechenwerkzeug. Es meldet nur einen Syntaxfehler.

Für ihn ist das eine normale Zahl mit Komma. Das Werkzeug kennt das Komma aber gar nicht. Schon bevor die Grammatik geprüft wird, scheitert ein Teil des Programms am einzelnen Zeichen. Dieser Teil heißt Lexer.

Am Ende dieser Lektion

Notiz

Ich kann Quelltext in Tokens zerlegen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Tokenein Wort eines Programms, zusammen mit seiner ArtZAHL 12
Lexerder Teil eines Compilers, der Tokens bildet
Mustereine Regel, wie eine Art von Token aussieht[0-9]+
Längste Übereinstimmungso viele Zeichen nehmen, wie das Muster erlaubt
Schlüsselwortein Wort, das die Sprache für sich reserviertif
Lexergeneratorein Werkzeug, das aus Mustern einen Lexer schreibtflex

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Token hat eine Art und einen Text

Der Lexer ist der erste Teil des eigentlichen Compilers. Er liest die Zeichen von links nach rechts und gibt Tokens aus.

Jedes Token hat eine Art, etwa ZAHL oder NAME, und den Text, aus dem es entstand. Leerzeichen und Kommentare werden zu keinem Token. Sie zeigen nur, wo ein Token endet und das nächste beginnt.

Beispiel: rabatt = preis * 3

ZeichenArtText
r a b a t tNAMErabatt
=OP=
p r e i sNAMEpreis
*OP*
3ZAHL3
Die vier LeerzeichenKein TokenÜbersprungen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Lexer in zwanzig Zeilen

Code: python
# Ein kleiner Lexer: Zahlen und die vier Rechenzeichen.
text = "15 + 4*20"
tokens = []
i = 0
while i < len(text):
    zeichen = text[i]
    if zeichen == " ":
        i = i + 1
    elif zeichen.isdigit():
        anfang = i
        # Weiterlesen, solange Ziffern kommen: die laengste Uebereinstimmung.
        while i < len(text) and text[i].isdigit():
            i = i + 1
        tokens.append(["ZAHL", text[anfang:i]])
    elif zeichen in "+-*/":
        tokens.append(["OP", zeichen])
        i = i + 1
    else:
        tokens.append(["FEHLER", zeichen])
        i = i + 1
print(tokens)
# Aendern Sie text in "2,5 * 4" und fuehren Sie erneut aus.

flex schreibt den Lexer für Sie

Einen Lexer für eine echte Sprache von Hand zu schreiben dauert lange. Ein Lexergenerator wie flex schreibt ihn aus einer Liste von Mustern.

In calc.l steht in jeder Zeile ein Muster und dahinter, was bei einem Treffer passiert. [0-9]+ heißt: eine oder mehr Ziffern. Die Aktion macht aus dem Text eine Zahl und gibt dem Parser das Token NUMBER. Die Befehle zeigen die Regeln und bauen den Rechner neu.

In den Ordner compiler wechseln

Befehl
cd ~/compiler

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Regeln, die ein Token liefern

Befehl
grep -n "return" calc.l

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Alles entfernen, was make gebaut hat

Befehl
make clean

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Rechner neu bauen

Befehl
make

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Wie lang ist der Lexer von flex?

Befehl
wc -l lex.yy.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Zeichen, die der Lexer kennt oder nicht

Jeder Befehl unten schickt eine Zeile in den Rechner. Achten Sie darauf, welche Meldung vom Lexer kommt und welche vom Parser.

Die letzte Regel des Lexers ist ein einzelner Punkt. Er passt auf jedes Zeichen, das keine andere Regel nimmt. Dann gibt der Lexer unexpected character aus und bildet kein Token. Der Parser sieht nur den Rest.

Viel zu viele Leerzeichen

Befehl
echo "  8   *   5" | ./calc

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine Zahl mit Dezimalkomma

Befehl
echo "2,5 + 1" | ./calc

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Buchstabe direkt an einer Zahl

Befehl
echo "2 + 3y" | ./calc

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Nullen am Anfang

Befehl
echo "0010 * 2" | ./calc

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, ein Lexer gibt für jedes Zeichen ein Token aus. Dann wäre 0010 vier Zahlen. Ein Lexer nimmt aber die längste Übereinstimmung: Er liest weiter, solange das Muster noch passt. Deshalb ist 0010 eine einzige Zahl, und zeiger ist ein Name, nicht das Schlüsselwort zeige und ein r.

Weiterführend

Erweitern Sie Ihren Tokenizer um Dezimalzahlen mit Komma. 2,5 soll ein einziges Token ZAHL mit dem Text 2,5 werden. Ein Komma ohne Ziffer danach bleibt ein FEHLER.

Schreiben Sie zuerst drei eigene Tests. Erklären Sie dann, warum eine Sprache mit diesem Komma keine Kommas mehr zwischen Argumenten wie in max(2,5) trennen kann.

Über dieses Lab und seinen Quellcode: Lab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.