lex(1) lex(1)
NAME
lex - Scanner erstellen
SYNTAX
lex [-ctV] [-n|-v] [-Q[o]] [--] [Datei]
BESCHREIBUNG
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 sol-
len, wenn ein Muster gefunden wurde. Sie müssen angegeben werden. Die
Definitionen und Benutzerfunktionen sind optional. Damit ergibt sich
folgender Aufbau für die lex-Quelldatei:
Definitionen
[%%
Regeln]
[%%
Benutzerfunktionen]
Mehrere Dateien werden wie eine Einzeldatei behandelt. Wenn keine
Datei oder - als Dateiname angegeben wird, wird die Standardeingabe
verwendet.
lex erzeugt eine Datei mit dem Namen lex.yy.c. Wenn lex.yy.c mit der
Lex-Bibliothek übersetzt und gebunden wird, kopiert das erzeugte Pro-
gramm die Standard-Eingabe auf die Standard-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 Übe-
reinstimmung gefunden wurde, befindet sich in der Variablen yytext.
Die Prüfung auf Übereinstimmung wird in der Reihenfolge der Suchmuster
in der Eingabedatei durchgeführt.
OPTIONEN
-c Steht für die Verwendung von C-Aktionen (im Gegensatz zu ande-
ren Programmiersprachen, wie z. B. Fortran) und ist der Stan-
dard.
-t Das Programm wird auf die Standard-Ausgabe, nicht in die Datei
lex.yy.c geschrieben.
-v Liefert eine zweizeilige Statistik-Zusammenfassung.
-n Verhindert Ausdrucken der Statistik-Zusammenfassung. Wurden
keine Tabellengrößen definiert und ist -v nicht angegeben, wird
implizit -n angenommen.
-V Gibt Versionsinformationen auf die Standard-Fehlerausgabe aus.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
lex(1) lex(1)
-Q[o] Legt fest, ob Versionsinformationen an die Ausgabedatei
lex.yy.c ausgegeben werden sollen.
o 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.
-- Ende der Optionenliste. Die Angabe ist nötig, wenn Datei mit -
beginnt.
Definitionen
Im Definitionsteil können Ersetzungen definiert werden. Sie werden in
folgender Form angegeben und müssen am Zeilenanfang stehen:
name subsitute Die Zeichenkette substitute ersetzt {name},
wenn dieser im Regelteil vorkommt.
Der Typ von yytext kann im Definitionsabschnitt deklariert werden:
%array yytext ist vom Typ Zeichen-Array
%pointer yytext ist vom Typ String-Pointer
Außerdem definieren Sie hier Startzustände von lex:
%sname bzw. %Sname einfacher Startzustand
%xname bzw. %Xname exklusiver Startzustand
Befindet sich der erstellte Scanner in einem exklusiven Zustand, werden nur
Muster berücksichtigt, die für diesen Zustand angegeben wurden. Einfache
Zustände berücksichtigen dagegen auch alle Muster ohne Zustandsangabe.
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 n Anzahl der Positionen ist n (Standard 2500)
%n n Anzahl der Zustände
%e n Anzahl der Knoten des Syntaxbaums ist n (1000)
%a n Anzahl der Übergänge ist n (2000)
%k n Anzahl der gepackten Zeichenklassen ist n (2500)
%o n Größ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.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
lex(1) lex(1)
Regeln
Der Regelteil der Datei beginnt mit dem Begrenzungssymbol %%. Sie kön-
nen im Regelteil lokale Variablen für yylex() vereinbaren: Alle Zeilen
im Regelteil, die mit einem Leerzeichen oder Tabulator beginnen oder
in %{ und %} eingeschlossen sind und vor der ersten Regel stehen, wer-
den an den Anfang der Funktion yylex() kopiert, direkt hinter die
erste geöffnete Klammer.
Jede Regel besteht aus einem regulären Ausdruck, der ein aufzufinden-
des 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 wei-
tergegeben.
lex unterstützt erweiterte reguläre Ausdrücke [siehe expressions(5)]
mit folgenden Ausnahmen bzw. Erweiterungen:
"xy" xy, auch wenn x und/oder y lex-Operatoren sind (außer
\)
^x x am Zeilenanfang (nur zu Beginn eines Musters)
<y>x bzw. <y1,y2,...>x
x wenn lex sich im Zustand y bzw. in einem der Zustände
y1, y2 usw. befindet
x$ x am Ende einer Zeile (nur am Ende eines Musters)
x/y x wenn y folgt
{xx} Ersetzung für xx aus dem Definitionsteil
\oktal Zeichen mit dem oktalen Code oktal
\xhexadezimal Zeichen mit dem hexadezimalen Code hexadezimal
\zeichen das Zeichen zeichen, außer \zeichen ist eine der fol-
genden Escape-Sequenzen: \\, \a, \b, \f, \n, \r, \t, \v
Die Priorität, in der reguläre Ausdrücke ausgewertet werden, weicht in
einigen Punkten von der Standard-Reihenfolge ab. Die folgende Tabelle
ist nach fallender Priorität sortiert:
Klassen/Zeicheneinheiten [==] [::] [..]
entwertete Zeichen \zeichen
Klammer-Ausdrücke [ ]
Ausdrücke in "" "..."
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
lex(1) lex(1)
Gruppierung ( )
Definitionen {name}
Wiederholung * + ?
Konkatenierung xy
Intervalle {m,n}
oder |
Im Aktionsteil einer Regel können spezielle Aufgaben durchgeführt wer-
den. 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ück-
gestellt
output() ein Zeichen wird in den Ausgabestrom geschrieben
echo yytext 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 bear-
beiten:
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ücksich-
tigt.
REJECT Zeichenketten, die sich überlappen oder die zum Teil in
einer anderen Zeichenkette enthalten sind, werden ver-
arbeitet. REJECT springt direkt zur nächsten Regel,
ohne den Inhalt von yytext zu ändern.
INTERNATIONALE UMGEBUNG
Die Sprache der Meldungstexte und ja/nein-Angaben werden durch die
Umgebungsvariablen LCALL, LCMESSAGES oder LANG bestimmt.
In der Standardeinstellung verhält sich das System so, als wäre es
nicht internationalisiert, d. h. die Meldungstexte erscheinen in eng-
lischer Sprache und ja/nein-Angaben müssen ebenfalls in englischer
Sprache (y oder n) eingegeben werden. Wenn Sie die Sprachumgebung
ändern wollen, müssen Sie eine dieser Variablen entsprechend setzen.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
lex(1) lex(1)
In regulären Ausdrücken bestimmt die Umgebungsvariable LCCOLLATE die
Bedeutung von Zeichenbereichen, Äquivalenzklassen und Zeicheneinhei-
ten, die Umgebungsvariable LCCTYPE bestimmt die Bedeutung von Zei-
chenklassen. Wenn diese Variablen nicht gesetzt sind, wird dier Wert
von LANG verwendet. Ist auch LANG nicht oder als leere Zeichenkette
definiert, verhält sich das System so, als wäre es nicht internationa-
lisiert.
Ausführliche Informationen zu den Abhängigkeiten der Umgebungsvaria-
blen und zur Internationalisierung im allgemeinen finden Sie im Hand-
buch "Leitfaden für Programmierer: Internationalisierung - Lokalisie-
rung". Zur Einstellung der Benutzerumgebung siehe auch environ(5).
SIEHE AUCH
yacc(1), expressions(5).
Kapitel "lex" in "Leitfaden und Werkzeuge für die Programmierung mit
C".
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98