Lex (Software)

Lex ist ein Computerprogramm, das lexikalische Analysatoren ("Scanner" oder "lexers") erzeugt. Lex wird mit dem yacc parser Generator allgemein verwendet. Lex, der ursprünglich von Mike Lesk und Eric Schmidt geschrieben ist, und hat 1975 beschrieben, ist der lexikalische Standardgenerator von Analysator auf vielen Systemen von Unix, und ein Werkzeug, das sein Verhalten ausstellt, wird als ein Teil des POSIX Standards angegeben.

Lex liest einen Eingangsstrom, der den lexikalischen Analysator und Produktionsquellcode angibt, der den lexer auf der C Programmiersprache durchführt.

Obwohl traditionell Eigentumssoftware, Versionen von Lex, der auf dem Original AT&T Code gestützt ist, als offene Quelle, als ein Teil von Systemen wie OpenSolaris und Plan 9 von Glockenlaboratorien verfügbar sind. Eine andere populäre offene Quellversion von Lex ist, beugen der "schnelle lexikalische Analysator".

Struktur einer Datei von Lex

Die Struktur einer Datei von Lex ist dieser einer yacc Datei absichtlich ähnlich; Dateien werden in drei Abteilungen geteilt, die durch Linien getrennt sind, die nur zwei Prozent Zeichen wie folgt enthalten:

Definitionsabteilung

%%

Regel-Abteilung

%%

C codieren Abteilung

  • Die Definitionsabteilung definiert Makros und importiert in C geschriebene Kopfball-Dateien. Es ist auch möglich, jeden C-Code hier zu schreiben, der wortwörtlich in die erzeugte Quelldatei kopiert wird.
  • Die Regel-Abteilung vereinigt regelmäßige Ausdruck-Muster mit C Behauptungen. Wenn der lexer Text im Eingang sieht, der ein gegebenes Muster vergleicht, wird es den verbundenen C-Code durchführen.
  • Die C-Codeabteilung enthält C Behauptungen und Funktionen, die wortwörtlich zur erzeugten Quelldatei kopiert werden. Diese Behauptungen enthalten vermutlich Code, der durch die Regeln in der Regel-Abteilung genannt ist. In großen Programmen ist es günstiger, diesen Code in eine getrennte Datei zu legen, die in während der Übersetzung verbunden ist.

Beispiel einer Datei von Lex

Der folgende ist ein Beispiel Datei von Lex für die beugen Version von Lex. Es erkennt Reihen von Zahlen (ganze Zahlen) im Eingang an, und druckt sie einfach aus.

% {\

/* C codieren, um wortwörtlich * / kopiert zu werden

  1. einschließen

% }\

/* Das erzählt beugen, um nur eine Eingangsdatei * / zu lesen

%option noyywrap

%%

/ ***-Regel-Abteilung *** /

/* [0-9] + vergleicht eine Reihe von einer oder mehr Ziffern * /

[0-9] + {\

/* yytext ist eine Schnur, die den verglichenen Text enthält. * /

printf ("Hat eine ganze Zahl gesehen: %s\n", yytext);

}\

. | \n {Ignorieren/* alle anderen Charaktere. */}\

%%

/ *** C Codeabteilung *** /

int Haupt(Leere)

{\

/* Nennen Sie den lexer, dann hören Sie auf. * /

yylex ;

kehren Sie 0 zurück;

} </pre>

Wenn dieser Eingang gegeben wird, um zu beugen, wird er in eine C Datei, lex.yy.c umgewandelt. Das kann in einen rechtskräftigen kompiliert werden, der zusammenpasst und Produktionsreihen von ganzen Zahlen. Zum Beispiel, in Anbetracht des Eingangs:

abc123z.!&*2gj6

das Programm wird drucken:

Hat

eine ganze Zahl gesehen: 123

Hat

eine ganze Zahl gesehen: 2

Hat

eine ganze Zahl gesehen: 6

Verwendender Lex mit anderen Programmierwerkzeugen

Verwendender Lex mit parser Generatoren

Lex und parser Generatoren, wie Yacc oder Bison, werden zusammen allgemein verwendet. Generatoren von Parser verwenden eine formelle Grammatik, um einen Eingangsstrom, etwas grammatisch zu analysieren, was Lex verwendende einfache regelmäßige Ausdrücke nicht tun kann (Lex wird auf einfache Zustandsautomaten beschränkt).

Es ist normalerweise vorzuziehend, (Yacc-erzeugt zu haben, zu sagen), parser gefüttert zu werden ein Scheinstrom, wie eingegeben, anstatt es zu haben, verbrauchen den Eingangscharakter-Strom direkt. Lex wird häufig verwendet, um solch einen Scheinstrom zu erzeugen.

Syntaxanalyse von Scannerless bezieht sich darauf, wo ein parser den Eingangscharakter-Strom direkt ohne einen verschiedenen lexer verbraucht.

Lex und macht

machen Sie ist ein Dienstprogramm, das verwendet werden kann, um Programme aufrechtzuerhalten, die Lex einbeziehen. Machen Sie nimmt an, dass eine Datei, die eine Erweiterung dessen hat, eine Quelldatei von Lex ist. Das Machen inneren Makros kann verwendet werden, um anzugeben, dass Optionen von Lex, automatisch dadurch angerufen zu werden, machen.

Siehe auch

  • Beugen Sie lexikalischen Analysator
  • Yacc
  • Ragel
  • Quex
  • Vergleich von parser Generatoren

Links


Pandulf Masca / Die Stadtgemeinde Runnymede
Impressum & Datenschutz