Lex (software)
Originalautor (en) | Mike Lesk, Eric Schmidt |
---|---|
Erstveröffentlichung | 1975 |
Repository | |
Geschrieben in | C |
Betriebssystem | Unix, Unix-artig, Plan 9 |
Plattform | Plattformübergreifend |
Typ | Befehl |
Lizenz | Plan 9: MIT -Lizenz |
Lex ist ein Computer Programm das erzeugt Lexikalanalysatoren ("Scanner" oder "Lexer").[1][2]
Lex wird üblicherweise mit dem verwendet yacc Parser -Generator. Lex, ursprünglich geschrieben von Mike Lesk und Eric Schmidt[3] und 1975 beschrieben,[4][5] ist der Standard Lexikalanalysator Generator für viele Unix Systeme, und ein äquivalentes Tool wird als Teil der angegeben Posix Standard.[6]
Lex liest einen Eingang Strom Angabe des lexikalischen Analysators und schreibt schreibt Quellcode Dies implementiert den lexikalischen Analysator in der C Programmiersprache.
Zusätzlich zu C könnten einige alte Versionen von Lex auch einen Lexer in erzeugen Ratte.[7]
Open Source
Obwohl ursprünglich als proprietäre Software verteilt, sind einige Versionen von Lex jetzt Open Source. Open-Source-Versionen von Lex, basierend auf dem ursprünglichen proprietären Code, werden jetzt mit Open-Source-Betriebssystemen wie verteilt OpenSolaris und Plan 9 von Bell Labs. Eine beliebte Open-Source-Version von Lex, genannt biegen, oder der "schnelle lexikalische Analysator", wird nicht aus proprietärer Codierung abgeleitet.
Struktur einer LEX -Datei
Die Struktur einer LEX -Datei ähnelt absichtlich der einer YACC -Datei: Dateien werden in drei Abschnitte unterteilt, die durch Zeilen getrennt sind, die nur zwei Prozentzeichen enthalten, wie folgt:
- Das Definitionen Abschnitt definiert Makros und Importe Header -Dateien geschrieben in C. Es ist auch möglich, einen C -Code hier zu schreiben, der wörtlich in die generierte Quelldatei kopiert wird.
- Das Regeln Abschnitt Mitarbeiter regulären Ausdruck Muster mit c Aussagen. Wenn der Lexer Text in der Eingabe sieht, die mit einem bestimmten Muster übereinstimmt, wird der zugehörige C -Code ausgeführt.
- Das C Code Abschnitt enthält C -Aussagen und Funktionen das werden wörtlich in die generierte Quelldatei kopiert. Diese Aussagen enthalten vermutlich Code, die nach den Regeln im Abschnitt Regeln aufgerufen wurden. In großen Programmen ist es bequemer, diesen Code in eine separate Datei zu platzieren, die in AT verknüpft ist kompilieren Zeit.
Beispiel einer LEX -Datei
Das Folgende ist eine Beispiel -LEX -Datei für die biegen Version von Lex. Es erkennt Zahlenzeichenfolgen (positive Ganzzahlen) in der Eingabe und druckt sie einfach aus.
/*** Definition Abschnitt ***/ %{ / * C -Code, der wörtlich kopiert werden soll */ #enthalten %} %% /*** Regeln Abschnitt ***/ / * [0-9]+ stimmt mit einer Zeichenfolge von einer oder mehreren Ziffern */überein [0-9]+ { /* yytext ist eine Zeichenfolge, die den übereinstimmenden Text enthält. */ printf("Ich habe eine Ganzzahl gesehen: %s\n", yytext); } .|\n { /* Ignorieren Sie alle anderen Zeichen. */ } %% /*** c Code Abschnitt ***/ int hauptsächlich(Leere) { /* Rufen Sie den Lexer an und beenden Sie dann. */ yjlex(); Rückkehr 0; }
Wenn dieser Eingang zugegeben wird biegen
, es wird in eine C -Datei konvertiert, lex.yy.c
. Dies kann in eine ausführbare Datei zusammengestellt werden, die Zapfen von Ganzzahlen übereinstimmt und ausgibt. Zum Beispiel bei der Eingabe:
ABC123Z.! &*2GJ6
Das Programm druckt:
Ich habe eine Ganzzahl gesehen: 123 sah eine Ganzzahl: 2 sah eine Ganzzahl: 6
Verwenden von Lex mit anderen Programmierwerkzeugen
Verwenden Sie Lex mit Parser -Generatoren
Lex- und Parser -Generatoren, wie z. Yacc oder Bison, werden üblicherweise zusammen verwendet. Parser -Generatoren verwenden a formelle Grammatik Um einen Eingabestream zu analysieren, kann Lex nicht einfach mit einfachem tun können Reguläre Ausdrücke, wie Lex auf einfache beschränkt ist Finite State Automata.[Klarstellung erforderlich]
Es ist in der Regel vorzuziehen, einen Parser, der zum Beispiel von YACC erzeugt wird, einen Tokenstrom (einen "Token-Stream") als Eingabe akzeptieren, anstatt einen Zeichenstrom (einen "Zeichenstrom") direkt verarbeiten zu müssen . Lex wird oft verwendet, um einen solchen Token-Stream zu produzieren.
Scannerloser Parsen Bezieht sich auf das Parsen des Eingangszeichenstreams direkt ohne eindeutiges Lexer.
Lex und machen
machen ist ein Versorgungsunternehmen, mit dem Programme mit Lex aufrechterhalten werden können. Machen Sie an, dass eine Datei mit einer Erweiterung von .l
ist eine Lex -Quelldatei. Das interne Makro machen Lflags
Kann verwendet werden, um die LEX -Optionen zu spezifizieren, die automatisch durch Make aufgerufen werden sollen.[8]
Siehe auch
Verweise
- ^ Levine, John R.; Mason, Tony; Brown, Doug (1992). Lex & Yacc (2 ed.). O'Reilly. pp.1–2. ISBN 1-56592-000-7.
- ^ Levine, John (August 2009). Flex & Bison. O'Reilly Media. p. 304. ISBN 978-0-596-15597-1.
- ^ Lesk, M.E.; Schmidt, E. "Lex - ein Lexikalanalysatorgenerator". Abgerufen 16. August, 2010.
- ^ Lesk, M.E.; Schmidt, E. (21. Juli 1975). "Lex - ein Lexikalanalysatorgenerator" (PDF). UNIX Time Sharing System: UNIX Programmer's Manual, Seventh Edition, Band 2B. glockenlabs.com. Abgerufen 20. Dezember, 2011.
- ^ Lesk, M. E. (Oktober 1975). "Lex - ein Lexikalanalysatorgenerator". Comp. Sci. Technik. Rep. Nr. 39. Murray Hill, New Jersey: Bell Laboratories.
- ^ Die offenen Gruppenbasisspezifikationen Ausgabe 7, 2018 Ausgabe § Shell & Dienstprogramme § Dienstprogramme § Lex
- ^ John R. Levine; John Mason; Doug Brown (1992). Lex & Yacc. O'Reilly.
- ^ "machen". Die offenen Gruppenbasisspezifikationen. Die IEEE und die offene Gruppe (6). 2004. IEEE STD 1003.1, 2004 Ausgabe.
Externe Links
- Verwenden von Flex und Bison bei macworld.com
- Solaris 10 Benutzerbefehle Referenz Handbuch - -
- Plan 9 Programmierhandbuch, Volume 1 - -