Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

lex - Scanner erstellen

&pagelevel(4)&pagelevel

(generate programs for lexical tasks)


lex erzeugt ein C-Programm aus einer Datei, die den „lex-Quelltext“ enthält, den Sie für das vorliegende Problem entwickelt haben. Ein lex-Quelltext besteht aus höchstens drei Abschnitten: Definitionen, Regeln und Benutzerfunktionen. Die Regeln geben an, welche Muster in einem Eingabetext gesucht und welche Aktionen ausgeführt werden sollen, wenn ein Muster gefunden wurde. Sie müssen angegeben werden. Die Definitionen und Benutzerfunktionen sind optional.

lex erzeugt eine Datei mit dem Namen lex.yy.c. Wenn lex.yy.c mit der Lex-Bibliothek übersetzt und gebunden wird, kopiert es die Eingabe auf die Ausgabe, es sei denn, ein in der Datei angegebenes Muster wird gefunden. In diesem Fall wird der entsprechende Programmtext ausgeführt. Das Muster, für das eine Übereinstimmung gefunden wurde, befindet sich in yytext[], einem externen Zeichenfeld. Die Prüfung auf Übereinstimmung wird in der Reihenfolge der Suchmuster in der Eingabedatei durchgeführt.


Syntax


lex[ -ctvnV][ -Q[y|n]][ datei ...]

-c

steht für die Verwendung von C-Aktionen und ist der Standard

-t

das Programm wird in die Datei lex.yy.c, nicht auf Standardausgabe geschrieben

-v

liefert eine zweizeilige Statistik-Zusammenfassung

-n

verhindert Ausdrucken der Zusammenfassung von -v

-V

gibt Versionsinformationen auf die Standard-Fehlerausgabe aus

-Q[y|n]

legt fest, ob Versionsinformationen an die Ausgabedatei lex.yy.c ausgegeben werden sollen. y|n steht für eine ja/nein-Angabe in der jeweils eingestellten Sprachumgebung. In einer englischsprachigen Umgebung geben Sie -Qy an, um Versionsinformationen in die Datei lex.yy.c zu schreiben und -Qn um keine Versionsinformationen auszugeben. In einer deutschsprachigen Umgebung müssen Sie beispielsweise -Qj oder -Qn angeben. Standardmäßig werden keine Versionsinformationen ausgegeben.

datei

Eingabedatei. Mehrere Dateien werden wie eine Einzeldatei behandelt.

datei nicht angegeben
Wenn keine Datei angegeben wird, wird die Standardeingabe verwendet.


Bestimmte Standard-Tabellengrößen sind für einige Benutzer zu klein. Die Tabellengrößen für den erzeugten endlichen Automaten können im Definitionsabschnitt gesetzt werden:

%p nAnzahl der Positionen ist n (Standard 2500)
%n nAnzahl der Zustände (Standard 500)
%e nAnzahl der Knoten des Syntaxbaums ist n (1000)
%a nAnzahl der Übergänge ist n (2000)
%k nAnzahl der gepackten Zeichenklassen ist n (2500)
%o nGröße des Ausgabefelds ist n (3000)

Die Verwendung einer oder mehrerer Größen zieht automatisch die Option -v nach sich, wenn die Option -n nicht verwendet wird.


Der Regelteil der Datei beginnt mit dem Begrenzungssymbol %%. Sie können im Regelteil lokale Variablen für yylex() vereinbaren. Alle Zeilen im Regelteil, die mit einem Leerzeichen oder Tabulator beginnen und vor der ersten Regel stehen, werden an den Anfang der Funktion yylex() kopiert, direkt hinter die erste geöffnete Klammer.

Jede Regel besteht aus einem regulären Ausdruck, der ein aufzufindendes Muster beschreibt, und Aktionen, die ausgeführt werden sollen, wenn das Muster gefunden wird. Eingabetext, der keinem aufzufindenden Muster entspricht, wird von lex unverändert an die Ausgabedatei weitergegeben.

Ein regulärer Ausdruck besteht aus Textzeichen mit oder ohne zusätzliche Operatoren.


Folgende Operatoren können bei lex verwendet werden:

\xx
"xy"xy, auch wenn x und/oder y lex-Operatoren sind (außer \)
[xy]x oder y
[x-z]x, y oder z
[^x]jedes Zeichen außer x
.jedes Zeichen außer Neue-Zeile-Zeichen
^xx am Zeilenanfang
<y>xx wenn lex sich im Startzustand y befindet
x$x am Ende einer Zeile
x?x einmal oder keinmal
x*leere Zeichenkette oder mehrfaches Vorkommen von x
x+ein- oder mehrfaches Vorkommen von x
x{m,n}m bis n Vorkommen von x
xx|yyxx oder yy
x |die Aktion von x ist auch die Aktion für die nächste Regel
(x)x
x/yx wenn y folgt
{xx}Ersetzung für xx aus dem Definitionsteil


Im Aktionsteil einer Regel können spezielle Aufgaben durchgeführt werden. Folgende Makros werden dafür von lex zur Verfügung gestellt:

input()

ein weiteres Zeichen wird vom Eingabestrom gelesen

unput()

ein Zeichen wird für einen späteren Lesevorgang zurückgestellt

output()

ein Zeichen wird in den Ausgabestrom geschrieben


Sie können diese Makros umdefinieren, wenn Sie die Ein-/Ausgabe selbst steuern möchten. Achten Sie dabei aber auf Konsistenz.

Abgesehen vom Abspeichern gefundener Muster in yytext[] gibt es weitere Möglichkeiten, mit lex-Funktionen die gefundenen Textmuster zu bearbeiten: 

yymore()

Neu erkannte Zeichen werden an die bereits in yytext[] befindlichen angehängt (normalerweise wird yytext[] mit den nächsten gefundenen Zeichen überschrieben).

yyless( n )

Nur die ersten n Zeichen in yytext[] werden berücksichtigt.

REJECT

Zeichenketten, die sich überlappen oder die zum Teil in einer anderen Zeichenkette enthalten sind, werden verarbeitet. REJECT springt direkt zur nächsten Regel, ohne den Inhalt von yytext[] zu ändern.

Hinweis

Wird mit c89 [5] ein lex-Programm gebunden, muss als Bibliotheksparameter -ll angegeben werden.

Internationale Umgebung

Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos lex:

LANG

Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden.

LC_ALL

Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen.

LC_COLLATE

Bestimmt in regulären Ausdrücken die Bedeutung von Zeichenbereichen, Äquivalenzklassen und Zeicheneinheiten.

LC_CTYPE

Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten und Eingabedateien) sowie die Einteilung der Zeichen in Groß- und Kleinbuchstaben und deren Übereinstimmung.

LC_MESSAGES

Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden.

NLSPATH

Legt den Pfad der Meldungsdateien für LC_MESSAGES fest.

Siehe auch

yacc