• Keine Ergebnisse gefunden

2. Lexikalische Analyse

N/A
N/A
Protected

Academic year: 2021

Aktie "2. Lexikalische Analyse"

Copied!
12
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

2. Lexikalische Analyse

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 2

Inhalte der Vorlesung

1.Einführung

2.Lexikalische Analyse 3.Der Textstrom-Editor sed

4.Der Scanner-Generator lex (2 Termine)

5.Syntaxanalyse und der Parser-Generator yacc (3 T.) 6.Semantische Analyse

7.Transformation und Code-Erzeugung (?) 8.Übersetzungssteuerung mit make

2. Lexikalische Analyse

2.1 Einleitung

2.2 Beschreiben von Lexemen: reguläre Ausdrücke 2.3 Erkennen von Lexemen: endliche Automaten 2.4 Fehlerbehandlung

2.5 Transformation von Lexemen 2.6 Symboltabellenverwaltung

Lexikalische Analyse

position := initial + rate * 60

position := initial + rate * 60

Bezeichner :=

(Zuweisungs- symbol)

+

(Addit.- Symbol)

Bezeichner Bezeichner *

(Mult.- Symbol)

Zahl

“position“ “initial“ “rate“ 60

Gruppierung der Eingabezeichen in Lexeme

– Leerzeichen werden entfernt Zuordnung Lexem Symbol

– Symbole (Token): Bezeichner, := , + , * , Zahl, ...

Symbol hat z.T. Wert als Attribut

(2)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 5

Struktur der lexikalischen Analyse

1.Erkennung

Gruppierung in Lexeme 2.Transformation

effiziente Codierung als Zahlen insbesondere der Bezeichner

ist Grundstruktur vieler Phasen Analyse Synthese

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 6

Die Begriffe Symbol, Lexem, Muster

Begriff Beispiele Symbol Bezeichner Lexem

Muster ein Buchstabe, gefolgt von Buchstaben und Ziffern position, initial, rate

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 7

Lexikalische vs. syntaktische Analyse

lexikalische und syntaktische Struktur könnten zusammen beschrieben werden Trennung aber sinnvoll

– die Phasen werden einfacher

Beispiel: Leerraumbehandlung nur im Lexer Sprachdefinition wird übersichtlicher

– effizienter

– Einkapselung möglicher Änderungen Eingabealphabet

Beispiel: ASCII vs. Unicode

Beispiel: Sprache Z mit LaTeX- und Email-Markup

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 8

2. Lexikalische Analyse

2.1 Einleitung

2.2 Beschreiben von Lexemen: reguläre Ausdrücke 2.3 Erkennen von Lexemen: endliche Automaten 2.4 Fehlerbehandlung

2.5 Transformation von Lexemen

2.6 Symboltabellenverwaltung

(3)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 9

Definition reguläre Ausdrücke

über einem Alphabet 1. ist regulärer Ausdruck 2.sei a ∈ , dann:

a ist regulärer Ausdruck

3.seien r, s reguläre Ausdrücke, dann:

a) (r)|(s) ist regulärer Ausdruck b) (r)(s) ist regulärer Ausdruck c) (r)* ist regulärer Ausdruck d) (r) ist regulärer Ausdruck

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 10

Vermeidung von Klammern

Konventionen:

– *: höchste Priorität, links-assoziativ

– Konkatenation: zweithöchste Priorität, links-assoziativ

– |: niedrigste Priorität, links-assoziativ Beispiele:

– (a)|((b)*(c)) ist äquivalent zu a|b*c

– ((a)(b))(c) ist äquivalent zu abc

– ((a)*)* ist äquivalent zu a**

Bezeichnete reguläre Sprachen

seien , a, r, s obige reguläre Ausdrücke, dann:

1. bezeichnet { } 2.a bezeichnet {a}

3.bezeichnen r, s die Sprachen L(r), L(s), dann:

a) (r)|(s) bezeichnet L(r) ∪ L(s) b) (r)(s) bezeichnet L(r)L(s) c) (r)* bezeichnet (L(r))*

d) (r) bezeichnet L(r)

leeres Wort Einzelzeichen

Alternative Konkatenation optionale Wiederholung zusätzliche Klammerung

Beispiele für reguläre Ausdrücke und die bezeichneten Sprachen

L(a|b) = {a, b}

L((a|b)(a|b)) = {aa, ab, ba, bb}

L(a*) = { , a, aa, aaa, ...}

(4)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 13

Reguläre Definitionen

Namen für häufig benötigte Ausdrücke

– d

1

r

1

d

2

r

2

...

– Beispiele:

buchstabe A | B | ... | Z | a | b | ... | z ziffer 0 | 1 | ... | 9

rechte Seite:

regulärer Ausdruck oder vorher definierter Name

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 14

Abkürzungen

(r) + : ein- oder mehrmaliges Auftreten

– gleiche Priorität und Assoziativität wie (r)*

– Definiert durch: r* = r + | und r+ = rr*

(r)?: null- oder einmaliges Auftreten

– gleiche Priorität und Assoziativität wie (r)*

– Definiert durch: r? = r | [abc]: Zeichenklassen

– a, b, c, ...: beliebig viele Symbole des Alphabets

– Definiert durch: [abc] = a | b | c

– weitere Abkürzung: [a-z] = a | b | ... | z

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 15

Beispiele für Abkürzungen

L((hallo) + ) = {hallo, hallohallo, hallohallohallo, ...}

L(hunde?) = {hund, hunde}

die Menge aller Bezeichner in C:

[A-Za-z_][A-Za-z0-9_]*

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 16

2. Lexikalische Analyse

2.1 Einleitung

2.2 Beschreiben von Lexemen: reguläre Ausdrücke 2.3 Erkennen von Lexemen: endliche Automaten 2.4 Fehlerbehandlung

2.5 Transformation von Lexemen

2.6 Symboltabellenverwaltung

(5)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 17

Definition: Endlicher Automat

A = (S, , move, s 0, F) mit

– endliche Zustandsmenge S

– (endliches) Eingabealphabet

– Transitionsrelation move (S x x S)

– ein Startzustand s0 S

– Menge von akzeptierenden Zuständen F S

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 18

Äquivalenz regulärer Ausdrücke und endlicher Automaten

die Sprache jedes regulären Ausdrucks kann von einem endlichen Automaten erkannt werden

– auch Umkehrung gilt:

die Sprache eines endlichen Automaten kann mit einem regulären Ausdruck beschrieben werden

– Automat: im allgemeinen nicht deterministisch

jeder nichtdeterministische endliche Automat kann in einen deterministischen übersetzt werden Folgerung:

für jeden regulären Ausdruck kann automatisch ein effizienter erkennender Automat erzeugt werden

Erkennen einer Sprache mit einem endlichen Automaten

Wort ist in Sprache genau dann, wenn:

es gibt einen Pfad im Automaten

vom Anfangszustand zu einem Endzustand, an dessen Kanten die Zeichen des Wortes stehen

Beispiel: Erkennen einer Sprache mit einem endlichen Automaten

1 a 2 b 3

5 a

3 c 4 d

endlicher Automat:

akzeptierte Sprache:

{ab, acd}

(6)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 21

Umwandlung regulärer Ausdrücke in endliche Automaten

1.schreibe gesamten regulären Ausdruck an die einzige Kante des folgenden Automaten:

2.falls eine Kante mit mehr als einem einzelnen Zeichen beschriftet ist,

führe dort eine Graphersetzung (s.u.) mit dem äußersten regulären Operator aus

3.falls keine solche Kante da, terminiere, sonst gehe zu 2.

1 r 2

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 22

Graphersetzungen

1 r | s 2 ⇒ 1 2

r

s

1 r s 2 ⇒ 1 r 3 s 2

1 ( r ) 2

1 r 2

1 r * 2

1 3 r 4 2

1 r ? 2

1 r 2

1 r

+

2

1 3 r 4 2

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 23

Beispiel einer Umwandlung

1 (ab)*|c 2

1 (ab)*

c 2

1 3 ab 4 2

c

1 3 a

2 4

c

5 b

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 24

Implementierung eines nichtdet. endl. Automaten

Problem:

– von jedem Zustand ggf. viele Wege möglich Lösungsidee:

– Menge von möglichen Zuständen statt nur ein Zustand

– aufpassen bei -Kanten!

– Details im Drachenbuch

(7)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 25

Umwandlung nichtdeterministischer in deterministische Automaten

nichtdet. Automaten:

Zeitbedarf: O(|e| x |r|) Platzbedarf: O(|r|) det. Automaten:

Zeitbedarf: O(|e|) (plus Zeit zum Umwandeln, nur 1x) Platzbedarf: O(2 |r| )

Idee: Potenzmengenkonstruktion NEA DEA

– gleiches Alphabet

– Menge von mögl. NEA-Zuständen 1 DEA-Zustand

– geeignete DEA-Transitionen

|r|: Länge d. regulären Ausdrucks

|e|: Länge der Eingabe

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 26

Operationen für die Potenzmengenkonstruktion

-Hülle(s)

– Menge der NEA-Zustände,

die von s aus allein über -Kanten erreichbar sind -Hülle(T)

– Menge der NEA-Zustände,

die von einem s T aus allein über -Kanten erreichbar sind move(T,a)

– Menge der NEA-Zustände,

die von einem s T aus über eine a-Kante erreichbar sind

s: NEA-Zustand

T: Menge von NEA-Zuständen a: Eingabezeichen

Konstruktion eines DEA aus einem NEA

1.erzeuge den Startzustand des DEA und benenne ihn mit T 0 , T 0 = -Hülle(s 0 )

2.nimm einen unmarkierten Zustand T des DEA 3.markiere T

4.Für alle Eingabezeichen a:

4.1 U := -Hülle(move(T,a))

4.2 falls nötig, erzeuge den DEA-Zustand U 4.3 erzeuge eine Transition von T mit a nach U 5.Wenn es unmarkierte Zustände gibt, gehe zu 2.,

sonst terminiere

Akzeptierende Zustände des DEA

ein Zustand T des DEA ist akzeptierend,

falls mindestens einer der NEA-Zustände s T

akzeptierend ist

(8)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 29

Beispiel einer DEA-Konstruktion

NEA:

resultierender DEA (in 5 Schritten konstruieren):

{1,2,3}

1 3 a 4 2

c

5 b

a 5

2 c

{2,3,4}

b a

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 30

Implementierung eines

deterministischen endl. Automaten

Programmcode, Standard-Muster tabellengesteuert

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 31

Implementierung durch Programmcode

state=S0; term=0;

while ((state!=FAIL)&& !term) { switch (state) {

case S0:

switch (nextChar()) {

case 'a': state=S7; break;

/* ... */

default: state=FAIL; break;

} case S1:

switch (nextChar()) {

case 'a': state=S9; break;

/* ... */

case EOF: term=1; break;

default: state=FAIL; break;

} /* ... */

} } if (term)

... akzeptiert else

... akzeptiert nicht

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 32

Implementierung, tabellengesteuert

state=S0;

while ((state!=FAIL)) {

if ((c=nextChar())==EOF) break;

state=transTab[state][c];

}

if ((state!=FAIL)&&(acceptTab[state])) ... akzeptiert

else

... akzeptiert nicht

(9)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 33

Anpassung für Lexemerkennung

Termination nicht am Eingabeende, sondern sobald ein Lexem erkannt neuer Aufruf für nächstes Lexem

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 34

Mehrdeutigkeiten

Probleme:

– “:“ und “=“ oder “:=“ ?

– “/“ und “*“ oder “/*“?

Lösung: längstes Präfix (longest match)

– Termination erst, wenn nächstes Zeichen nirgends mehr paßt

– Bedingung: in der Syntax dürfen z.B. “:“ und “=“

nicht aufeinander folgen

Mehrdeutigkeiten (2)

Problem: “1.23456“ und “1..10“

– Zahl: [0-9] + (.[0-9] + (E(+|-)?[0-9] + )?)?

– wegen „longest match“ wird “1“ in “1..10“

nicht erkannt

am akzeptierenden Zustand vorbeigelaufen Lösung: Vorschau (lookahead)

– bei Termination rücksetzen auf letzten akzeptierenden Zustand

– ab da gelesene Zeichen müssen zurückgelegt werden oben: max. 1 Zeichen

Fortran: viele Zeichen

Erkennung der Schlüsselworte

1.für jedes Schlüsselwort ein regulärer Ausdruck 2.Schlüsselworte als Bezeichner erkannt,

später aussortiert

sehr sinnvoll: reservierte Schlüsselworte Bezeichner Schlüsselworte

Negativbeispiel PL/I:

IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;

(10)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 37

2. Lexikalische Analyse

2.1 Einleitung

2.2 Beschreiben von Lexemen: reguläre Ausdrücke 2.3 Erkennen von Lexemen: endliche Automaten 2.4 Fehlerbehandlung

2.5 Transformation von Lexemen 2.6 Symboltabellenverwaltung

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 38

Fehlerbehandlung

nur wenige Fehler lexikalisch erkennbar

– Beispiel: rechter Begrenzer fehlt String, Kommentar, ...

mögliche Recovery-Strategien:

jeweils ein Zeichen wird

– überlesen

Beispiel: „panische“ Fortsetzung

bis wieder gültiges Zeichen

einfachste Strategie – eingefügt

fehlendes Zeichen

– ausgetauscht

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 39

2. Lexikalische Analyse

2.1 Einleitung

2.2 Beschreiben von Lexemen: reguläre Ausdrücke 2.3 Erkennen von Lexemen: endliche Automaten 2.4 Fehlerbehandlung

2.5 Transformation von Lexemen 2.6 Symboltabellenverwaltung

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 40

Transformation von Lexemen (Sieben, Screening)

Transformationsregeln

– Layout, Kommentar:

unterdrücken

– Pragmat:

unterdrücken + Zustand des Übersetzers ändern

Beispiel: #include “file.h“

– Trennsymbol, Operator:

als Symbol kodieren

Beispiele: ; und + – Literal:

als Symbol kodieren + in internen Wert umrechnen

– Bezeichner:

als Symbol kodieren + eindeutig verschlüsseln

(11)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 41

2. Lexikalische Analyse

2.1 Einleitung

2.2 Beschreiben von Lexemen: reguläre Ausdrücke 2.3 Erkennen von Lexemen: endliche Automaten 2.4 Fehlerbehandlung

2.5 Transformation von Lexemen 2.6 Symboltabellenverwaltung

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 42

Symboltabellenverwaltung

sammelt und speichert die Attribute der Bezeichner

– Typ

– Gültigkeitsbereich

– bei Prozedurnamen: Anzahl & Typen der Argumente, ...

– Details zum Speicherbereich (bei Codeerzeugung)

– ...

Nr. Name Typ ...

1 position real ...

2 initial real ...

3 rate real ...

4 ... ...

Anforderungen an die Symboltabellenverwaltung

effizientes Einfügen von Bezeichnern in Tabelle effizientes Suchen von Bezeichnern in Tabelle

– effizientes Vergleichen von Bezeichnern

effizientes Setzen von Attributen für Bezeichner effizientes Lesen von Attributen für Bezeichner

Einfügen und Suchen von Bezeichnern

Bezeichner werden als Zahl verschlüsselt

– effizienter Gleichheitstest

– Abbildungen als Felder implementierbar effizient

Verfahren: Streuspeicher (Hashing)

– Tabelleneinträge willkürlich, aber deterministisch und möglichst gleichmäßig in „Eimer“ verteilen

– Standardverfahren

siehe Standard-C-Library: hcreate() , hsearch() siehe Vorlesung „Praktische Informatik 2“

siehe Drachenbuch, Kap 7.6

(12)

Übersetzergenerierung – Lexikalische Analyse Jan Bredereke, Universität Bremen 45

Inhalte der Vorlesung

1.Einführung

2.Lexikalische Analyse 3.Der Textstrom-Editor sed

4.Der Scanner-Generator lex (2 Termine)

5.Syntaxanalyse und der Parser-Generator yacc (3 T.) 6.Semantische Analyse

7.Transformation und Code-Erzeugung (?)

8.Übersetzungssteuerung mit make

Referenzen

ÄHNLICHE DOKUMENTE

Bei Eingabe von schlauer soll der FST beispielsweise Adj + Komp (für Komparativ) ausgeben, bei Eingabe von feinsten etwa Adj + Sup (für Superlativ). 2) Erstellen Sie einen

• Satz: Jeder nichtdeterministische endliche Automat kann in einen äqui-valenten deterministischen endlichen Automaten transformiert werden... Copyright 2004 Bernd Brügge

Wir definieren die Semantik einer MSO[<]-Formel als eine Relation | = zwischen W¨ortern und Formeln, w | = ϕ ist dabei zu lesen als “das Wort w erf¨ ult die Formel ϕ”..

das syntaktische Terminalsymbol des Parsers, definiert durch den Endzustand der lexikalischen Analyse oder vordefiniert für reservierte Bezeichner,

Hinweis: Für die lexikalische Analyse wird in der Regel eine Stringtabelle nicht unbedingt benötigt, sie dient als „Gedächtnis“...

Behandlung nicht allein durch lexikalische Analyse m¨ oglich. Vorgehen

Für unbeschränkte Petri-Spiele konnte durch eine Reduktion gezeigt werden, dass die Frage nach der Existenz einer gewinnenden Strategie

Abstract: Der Artikel beschreibt, wie endliche Automaten für Software-Protokolle aus dem Quelltext gewonnen und durch Transformationen für die Weiterverarbeitung und den