lex - Eine Einführung

Ähnliche Dokumente
4 Lexikalische Analyse und Parsing

Grundlagen der Informatik Vorlesungsskript

Inhalte der Vorlesung. 4. Der Scanner-Generator lex. 4. Der Scanner-Generator lex. 4.1 lex: Grundlagen

Ein- und Ausgabeumlenkung

Lexikalische Programmanalyse der Scanner

Formale Sprachen und Automaten

Grundlagen der Programmierung

Programmieren in C/C++ und MATLAB

Schreibweise in IGOR: 6.02E-23

Einstieg in die Informatik mit Java

Variablen und Datentypen

Einstieg in die Informatik mit Java

GI Vektoren

Strings. Daten aus Dateien einlesen und in Dateien speichern.

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Lexikalische Analyse, Tokenizer, Scanner

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 2. Spezifikation Schrittweise Verfeinerung

01 Einführung in PHP. Einführung in PHP 1/13 PHP in Aktion

Variablen in MATLAB. Unterschiede zur Mathematik: Symbolisches und numerisches Rechnen. Skriptdateien. for-schleifen.

Grundlagen der Programmierung

Die Programmiersprache C

Brainfuck Interpreter für ZX81

Induktive Definition

Institut für Computational Science Prof. Dr. H. Hinterberger. Praxismodul 1. Einführung in die Programmierung Erste Programme

Praktikum zu Einführung in die Informatik für LogWings und WiMas Wintersemester 2013/14

Vorbereitung zu den Flex- bzw. JLex-Übungen

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Ein- und Ausgabe (I/O)

Trainingsmanagement Gutschein Management. Beschreibung

Übersicht Shell-Scripten

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift

4 Schleifen und Dateien

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Übungen zu C++ Kapitel 1

Fachhochschule Südwestfalen Wir geben Impulse. Kontrollstrukturen und Schleifen in Octave

Benutzung der Manpage, Shell Teil 3

FACHHOCHSCHULE MANNHEIM

Grundlagen der Informatik

Interpreter - Gliederung

Programmsteuerung mit PHP - if/else, elseif,switch

Syntax der Sprache PASCAL

+ C - Formatierte Eingabe mit scanf()

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Kommandozeileneingabe. Einführung in Perl Kommandozeileneingabe etc. Kommandozeileneingabe Optionen. Kommandozeileneingabe Bsp (1)

Übung 4: Schreiben eines Shell-Skripts

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans

Einführung in AWK. Holger Jakobs Vorstellung des Programms 1

Informatik I Übung, Woche 40

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Reguläre Ausdrücke. Felix Döring, Felix Wittwer 14. November Python-Kurs

Einführung in die C-Programmierung

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

NICHT TRIVIAL: MAKROVARIABLEN - GLOBAL ODER LOKAL

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Grundlagen der Fortran Sprache

9 Compilerbau-Werkzeuge

System.out.println("TEXT");

Programmieren in C/C++ und MATLAB

3 Die Grundrechenarten

Linux II. Reguläre Ausdrücke Editoren Scripting. 2 Linux II. Linux I II III Res WN/TT NLTK XML Weka E Reguläre Ausdrücke Editoren Scripting

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Javakurs für Anfänger

Java: Eine kurze Einführung an Beispielen

Zeiger, Arrays und Strings in C und C++

Einstieg in die Informatik mit Java

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Wertebereich und Genauigkeit der Zahlendarstellung

Einführung in die Informatik I (autip)

+ C - Array (Vektoren, Felder)

Anweisungsblöcke (dazu zählen auch Programme) werden in geschweifte Klammern eingeschlossen.

Zahlenraten: Ein Spiel in Java.

Lineare Algebra mit dem Statistikprogramm R

Übungspaket 12 Der Datentyp char

EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 14/15

Annehmende Schleife do while

Praktikum zur Vorlesung Einführung in die Programmierung WS 14/15 Blatt 3

Einführung in die Programmierung 1

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Aufgabenblatt 4 IT-Security Angewandte Informatik WS 2016/17

Empfehlenswerte Referenzen

Repetitorium Informatik (Java)

4. Einfache Programmstrukturen in C Einfache Programmstrukturen in C

C. Ortseifen: Reguläre Ausdrücke

Informatik I. Informatik I. 6.1 Programme. 6.2 Programme schreiben. 6.3 Programme starten. 6.4 Programme entwickeln. 6.1 Programme.

Arzu Sanli Ibrahim Canakci

Übungspaket 23 Mehrdimensionale Arrays

Einführung in die Programmierung für Computerlinguisten

Prinzipien der Softwareentwicklung S. Strahringer

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Transkript:

lex - Eine Einführung Axel Kohnert 9th May 2005 Abstract lex ist ein Unixprogramm, welches die Erstellung eines C-programms für die lexikalische Analyse unterstützt. Dazu kann man Aktionen definieren, die beim Erkennen von regulären Ausdrücken in der Eingabe ausgeführt werden. Diese Aktionen werden in C-Syntax definiert. 1 Syntax eines lex-programms 1.1 Aufruf von lex Ein lex-programm, steht üblicherweise in einem file mit der Endung.l, dieser file, z.b. bsp.l, wird mit dem Kommando lex bsp.l in den file lex.yy.c kompiliert, und diesen kann man mit dem Kommando cc lex.yy.c -ll in den ausführbaren file a.out übersetzen. Mit dem Aufruf make bsp wird automatische aus dem file bsp.l ein ausführbarer file bsp erzeugt. Dies gilt nicht auf allen UNIX systemen, manchmal muß man dafür dem make etwas nachhelfen, indem man die Umwandlungsregel explizit angibt (siehe Anhang) 1.2 Syntax Das kleinste zulässige lex-programm, besteht aus der Zeile es kopiert die Standardeingabe auf die Standardausgabe, dies ist das default-verhalten des lexikalischen Analyse programms, falls kein regulärer Ausdruck gematcht wurde. Die allgemeine Syntax ist folgende: {Definitionen} {Regeln} {Unterprogramme} Wie schon obiges Beispiel gezeigt hat, sind alle Teile bis auf das erste optional. 1

1.3 Regeln Regeln, die im zweiten Teil des lex-programms definiert werden, bestehen aus zwei Teilen, der erste Teil ist ein regulärer Ausdruck, der zweite Teil eine Aktion (in C- Syntax), die bei Erkennen des regulären Ausdrucks ausgeführt werden soll. Dazu ein Beispiel integer printf("token:int\n"); dieses Programm kopiert Standardeingabe auf Standardausgabe, erstetzt dabei jedoch die Zeichenkette integer durch den angegebenen Text. 1.4 reguläre Ausdrücke Zur Definition von regulären Ausdrücken im Regelteil hat man mehrere Sonderzeichen zur Verfügung, diese sind " \ [ ] ^ -?. * ( ) $ / { } %, > will man diese Zeichen ohne ihre Sonderbedeutung verwenden, so müssen sie mit \ maskiert werden. Dazu ein Beispiel %{ int i=0; %} \? printf("bereits %d Fragezeichen\n",++i); in diesem Beispiel sehen wir auch schon die Einführung von Variablen. Dazu später mehr. Der Teil zwischen von lex erstellten C Programms eingefügt. Nun ein Aufstellung der regulären Ausdrücke mit Sonderzeichen 1. [xya] steht für das Zeichen x oder y oder a. 2. [a-z] steht für alle Zeichen zwischen a und z. Es geht auch [a-za-z] um z.b. alle Buchstaben zu matchen. 3. [ˆa-z] steht für alle Zeichen außer a bis z. 4.. steht für alle Zeichen außer \n. 5. Man kann zeichen auch durch die oktale Darstellung ansprechen, so steht \40 für ein blamk. 6. ab?c matcht auf ac oder abc (0 oder 1-malige Wiederholung) 7. ab* 0 mal oder öfter 8. ab+ 1 mal oder öfter 9. ab{1,5} 1 mal bis maximal 5 mal 2

10. (ab cd+)? man kann klammern, steht für oder und gilt für die gesamten Ausdrücke d.h. der Ausdruck matcht auf ab, cd, cdd, cddd... Nicht jedoch auf abd. 11. ab/cd matcht auf ab, aber nur wenn es von cd gefolgt wird. 12. ab$ matcht auf ab am Zeilenende. 13. ˆab matcht auf ab am Zeilenanfang. 2 Aktionen In diesem Abschnitt schauen wir uns noch weitere Möglichkeiten für die Definition von Aktionen an. 2.1 globale C-Variablen Aktionen werden ausgeführt, wenn ein gelesener String matcht, auf diesen String kann man mit der globalen Variable char * yytext; zugreifen. Die Länge des Strings steht in der Varibale int yyleng; hierzu ein Beispiel, das Programm soll Namen erkennen, ihre Anzahl und die Gesamtzahl der verwendeten Buchstaben speichern. Alle integer-zahlen der Eingabe sollen außerdem addiert werden. %{ int buchstaben=0, namen=0, summe=0; %} [a-za-z]+{namen++; buchstaben += yyleng;} [1-9][0-9]*summe+= atoi(yytext); 2.2 Wie matcht lex? Dies geschieht nach zwei Regeln 1. Der längste match wird genommen. 2. Falls zwei gleichlang sind, so wird der zuerst definierte genommen. Hierzu ein Beispiel: integer [a-z]+ printf("token:int"); printf("identifier:%s",yytext); wird nun das wort integerwert gelesen, so wird dies als identifier genommen, wird hingegen integer gelesen, so word dies als token erkannt. Dies ist auch das gewünschte Verhalten. 3

2.3 Definitionen Im Beispiel sahen man bereits, daß zwischen %{ und %} C-source eingegeben werden kann. Ferner können Macro-definitionen für den lex-code vorgenommen werden, dies geschieht durch Zeilen der Form: Name Bedeutung die Definition name wird dann in regulären Ausdrücken des Regelteil durch {name} angesprochen. Obiges Beispiel hätte man auch so schreiben können: D integer I [a-z]+ {D} printf("token:int"); {I} printf("identifier:%s",yytext); 2.4 weitere Variablen und Routinen Neben den beiden Variablen yytext, yyleng gibt es noch weitere Variablen und Routinen. int yylineno, die aktuelle Zeilennummer. ECHO, dies Macro ist äquivalent zu printf("%s",yytext). int yymore(), eine Funktion, die den nächsten match sucht und das Ergebnis an yytext anhängt und auch die zugehörigen Aktionen durchführt. int yyless(int n), eine Funktion die Zeichen in die Eingabe zurückschreibt, sodaß yytext nur noch n Zeichen lang ist. int yywrap(), diese Funktion wird ganz am Ende der lexikalischen Analyse durchgeführt. Der Benutzer kann sie auch umschreiben, was im Unterprogrammteil geschieht. char input(), int output(char c), int unput(char c), dies sind die I/O routinen von lex, zum Lesen des nächsten Zeichens, zur Ausgabe eines Zeichens, zum Zurückgeben eines Zeichens in die Eingabe. Ein Beispiel zur Verwendung der Routinen: =-[a-za-z] { printf("1"); yyless(yyleng-1); } [a-za-z] printf("2"); - printf("3"); = printf("4"); 4

bei der Eingabe von =-a erfolgt die Ausgabe 1 und das a wird in die Eingabe zurückgeschrieben, nun wird der nächste Match gesucht, und beginnend beim a wird das a gematcht und eine 2 ausgegeben. 3 Rest 3.1 Bewertung von lex Vorteile: Nur ein Durchlauf durch den Text Zeit zum Erkennen eines Tokens proportional zur Länge des Tokens Leicht zu ändern Nachteile: Fehlermeldungen nicht dokumentiert Namenskonflikte bei der Verknüpfung von mehreren mit lex erstellten Programmen nicht alle Konstanten von lex können geändert werden Manchmal große Tabellen 3.2 Literatur 1. Heckhoff H. LEX, unix/mail (1985/1) p. 62-68 2. Lesk M., Schmidt E. LEX - A Lexical-Analyser Generator, Computer Science Technical Report 39 (1975) 3. Schreiner Axel Professor Schreiners UNIX Sprechstunde, Hanser Verlag München 1987 5