Lexicale Analyse Compilerconstructie: Deel 1 Matthias Moulin 2e Master CW‐MMC 7 Oktober 2014 1 Inhoud • Situering • • • • • • • • • • • Terminologie Formele talen Reguliere expressies Ambiguïteiten Deterministische Eindige Toestandsautomaten Error handling Niet‐Deterministische Eindige Toestandsautomaten Equivalentie van NFAs en DFAs Minimalisatie van DFAs Equivalentie van REs en FAs Lexicale analyse generators • Examenvragen • Bibliografie 2 Situering Lexicaal • Gerelateerd aan woorden of de woordenschat van een taal • Staat los van de grammatica en constructie van die taal 3 Situering Source language ‐> Target language 1. Begrijpen van structuur en betekenis 2. Op een andere manier in elkaar steken/genereren (Source) (Target) Ruwweg 2 fasen 1. Analyse 1. 2. 3. Lexicale analyse Syntax analyse Semantische analyse broncode ‐> individuele woorden of tokens zinstructuur van programma parsen de betekenis van programma achterhalen 2. Synthese 4 Situering 5 Lexicale Tokens Definitie (Lexicale Token) Een sequentie van karakters die als ondeelbaar beschouwd wordt in de grammatica van de programmeertaal. ‐> programmeertaal categoriseert deze in eindige set van Tokentypes VBn: Reserved keyword voor sommige programmeertalen 6 Lexicale Tokens VBn van niet‐lexicale tokens afhankelijk van de toepassing* • Worden wel beschreven en gescand, maar worden niet doorgegeven aan de parser. (hebben geen tokentype) • De parser white space en comments in rekening laten nemen op elk mogelijk ogenblik, zou deze overmatig complex maken. *Lexical analysers lexers worden niet enkel door compilers gebruikt. Bv.: In een automatisch refactoring systeem moet commentaar ook in rekening gebracht worden. 7 Lexicale Tokens – Macro’s Macro processing Characterstream 1 Preprocessing Characterstream 2 Lexical analysis Tokens Lexical Analyser Characterstream 1 Lexical analysis + macro processing Tokens Lexical Analyser Synoniemen: Lexical Analyser Lexer 8 Lexicale Tokens VB: Returned stream: FLOAT ID(match0) LPAREN CHAR STAR ID(s) RPAREN LBRACE IF LPAREN BANG ID(strncmp) LPAREN ID(s) COMMA STRING(0.0) COMMA NUM(3) RPAREN RPAREN RETURN REAL(0.0) SEMI RBRACE EOF Semantische waarden: deze geven additionele informatie bij het tokentype 9 Lexicale Tokens gaan we specifiëren d.m.v. reguliere expressies Lexers gaan we implementeren d.m.v. deterministische eindige toestandsautomaten 10 Terminologie Een set S is een collectie van objecten De powerset van een set is set van alle subsets van . Stel ∈ en , … , zijn om het even welke objecten, dan is ( , … , ) een (geordend) ‐tuple Stel , … , zijn sets, dan is het cartesische product de set van alle ‐tuples ( , … , ) waarbij ∈ voor ∈ 1, … ⋯ 11 Formele Talen Het alfabet Σ, is een eindige set van symbolen/karakters. Een string is een eindige sequentie van symbolen uit een alfabet Σ. De lege string is (“”). De set van alle mogelijke strings over een alfabet Σ is Σ ∗ . Een taal over een alfabet Σ: ⊆ Σ ∗ . Gegeven een string en een taal , is in ? Als Σ Als Σ ∅ dan is Σ ∗ oneindig aftelbaar (alle strings over Σ) ∅ dan is Σ ∗ oneindig overaftelbaar (alle talen over Σ) 12 Formele Talen Klassen van talen Recursief‐enumereerbare talen Context‐sensitieve talen Context‐vrije talen Reguliere talen Minimale automaat om talen te herkennen Turing Machine Lineair begrensde automaat Niet‐deterministische stapelautomaat Eindige toestandsautomaat 13 Formele Talen Klassen van talen Reguliere talen Minimale automaat om talen te herkennen Eindige toestandsautomaat Definitie (Reguliere Taal) Een taal is regulier ⟺ deze taal wordt beschreven door een reguliere expressie ⟺ deze taal wordt herkend door een eindige toestandsautomaat 14 Reguliere Expressies Definitie (Reguliere Expressie) is een reguliere expressie RE als van de volgende vorm is: 1. a voor een ∈ Σ 2. 3. ∅ 4. | 5. . ∗ 6. ) ) waarbij waarbij waarbij beschrijft ∈ Σ ∗ en reguliere expressies zijn en reguliere expressies zijn eenreguliere expressie is (unie) (concatenatie) (Kleene‐ster) (notatie: 15 Reguliere Expressies . ≡ ∗ ≡ ≡ ?≡ | ≡ | 0 ∗ ≡ … ≡ a|b|c| … x y|z ≡ … ≡ABC… XYZ 9 ≡ 012 … 789 ≡ 0|1|2| … 7 8|9 . staat voor één enkel karakter behalve een nieuwe lijn “a.+” staat letterlijk voor de string a.+ Operatorprioriteiten: * . | 16 Reguliere Expressies : Te ondernemen actie voor de parser 9 { return IF; } { return ID; } { return NUM; } { return REAL; ) { /* do nothing */ } 0 0 9 ∗ 0 9 “.” 0 9 ∗ | 0 9 ∗ “.” 0 “‐‐”[a‐z]*“\n” | “ ” | “\n” | “\t” . 9 lexicale specificatie moet compleet zijn { error(); } 17 Ambiguïteiten Regel (Longest match) De langste initiële substring van de input die door een RE beschreven wordt, wordt genomen als volgende token. • Bv.: “if8” matcht als identifier Regel (Rule priority) De langste initiële substring van de input die als eerste beschreven wordt door een RE, bepaalt het tokentype. • Volgorde van RE regels is van belang • Bv.: “if”matcht als reserved word 18 Reguliere expressies zijn statisch en declaratief Hoe moeten reguliere expressies geïmplementeerd worden? Automaten zijn dynamisch en imperatief 19 Deterministische Eindige Toestandsautomaten Definitie (Deterministische Eindige Toestandsautomaat) Een deterministische eindige toestandsautomaat (DFA) is een 5‐tuple , Σ, , , waarbij 1. is een eindige set de toestanden 2. Σ is een eindige set het alfabet 3. : Σ → de transitiefunctie 4. ∈ de start/initiële toestand 5. : → de actiefunctie ∈ | ∅ de set met de accepterende/finale toestanden 20 Deterministische Eindige Toestandsautomaten Merk op dead/garbage state ∉ is niet vermeld 21 Deterministische Eindige Toestandsautomaten DFA , Σ, , , en … ∶ ∀ ∈ Σ met ∈ 1, … Dan accepteert Als er een sequentie van toestanden , , … , in bestaat die voldoet aan: 1. en 2. , voor ∈ 1, … 1 en 3. ∈ ∈ | ∅ S Dan Als herkent ∈ Σ ∗ (notatie: | 22 Mogelijke encodering van DFA via lookup tabellen • Transitiematrix ∶ Σ→ Dead state Initiële toestand • Finality array ∶ → 23 DFA ‐ Variabelen • DFApositie Longest match • Toestandsnummer van de meest recentste finale toestand (1) • Positie van de input op de meest recentste finale toestand (2) Wanneer een finale toestand bereikt wordt ‐> variabele updaten Wanneer dead state bereikt wordt ‐> token gekend (1) ‐> eindpositie gekend (2) 24 25 Error handling • lexicale specificatie moet compleet zijn . { error(); } Wanneer dead state bereikt wordt Toestandsnummer v/d meest recentste finale toestand dead state • error() Print een error message rechtstreeks vanuit de lexer. / Return ‘iets’ aan de parser (of via gedeelde datastructuur, via globale variabelen). De parser moet de juiste errorproducties hebben om de error af te handelen en eventueel van de error op de gepaste manier te recoveren. Dit heeft het voordeel alle error handling in de parser uit te voeren. 26 Niet‐Deterministische Eindige Toestandsautomaten Definitie (Niet‐Deterministische Eindige Toestandsautomaat) Een niet‐deterministische eindige toestandsautomaat (NFA) is een 5‐tuple , Σ, , , waarbij 1. is een eindige set de toestanden 2. Σ is een eindige set het alfabet 3. : Σ → ) de transitiefunctie 4. ∈ de start/initiële toestand 5. : → de actiefunctie ∈ | Notatie: Σ ∅ Σ∪ de set met de accepterende/finale toestanden 27 Niet‐Deterministische Eindige Toestandsautomaten S NFA , Σ, , , , en … ∶∀ ∈ Σ met ∈ 1, … Dan accepteert Als er een sequentie van toestanden , , … , in bestaat die voldoet aan: 1. en 2. ∈ , voor ∈ 1, … 1 en 3. ∈ ∈ | ∅ Dan Als herkent ∈ Σ ∗ (notatie: | 28 DFAs zijn gemakkelijk te implementeren als computerprogramma’s 1: Procedure NextToken() 2: While true do 3: Consumeer volgende karakter van inputstring 4: Voer default actie uit 4: Bepaal nieuwe huidige toestand op basis van transitietabel 5: If huidige toestand is dead state 6: then bepaal token en eindpositie; voer bijhorende actie uit 7: If huidige toestand is finale toestand 8: then update longest‐match variabelen NFAs zijn moeilijker te implementeren omdat computers geen goede “gok” hardware hebben Gelukkig is het altijd mogelijk om een NFA naar een equivalente DFA te converteren 29 Equivalentie van NFAs en DFAs Theorema NFAs en DFAs beschrijven dezelfde klasse van talen Lemma 1: ∀DFA :∃NFA • Bewijs: Elke DFA is ook een NFA volgens de definitie van NFAs Lemma 2: ∀NFA :∃DFA • Bewijs: zie volgende slide 30 Subsetconstructie Lemma 2: ∀ :∃ Bewijs: stel NFA , Σ, , , construeer DFA D volgt: 1. ) 2. 3. , ⋃ ∈ }) , Σ, , , , ′ met als of ⋃ ∈ of } , Notatie: | kanbereiktwordenvanuiteen ∈ via0ofmeerdere transities 31 Subsetconstructie Lemma 2: ∀ :∃ Bewijs: stel NFA , Σ, , , , Σ, construeer DFA D volgt: 5. Als ∈ ∩ ′ ∧ Anders lege actie Met ∈ | , , ′ met als ∀ ∈ ∅ ∩ : Rule Priority 32 Rule Priority Merk op dead/garbage state ∉ is niet vermeld 33 Subsetconstructie Deomzettingkanperkarakter,datgeconsumeerdwordt tijdensdelexicaleanalyse,uitgevoerdworden. ‐ Hetmanipulerenvansetsvantoestandenisduur ‐ NFAeerstomzettennaarDFA 34 Subsetconstructie ‐ Complexiteit ) ‐ Als NFA toestanden heeft, kan equivalente DFA tot 2 toestanden hebben (worst case). Hier zitten meestal veel onbereikbare (vanuit starttoestand) toestanden bij. Worst‐case # ′ Θ Σ ∗2 35 Subsetconstructie via breadth‐first transitiegraaf 1: 0 ← ; 1 ← 2:max_ _ ← 1; ←0 3: max_ _ 4: foreach ∈Σ , 5: ′ 6: if max_ _ 7: then , ← 8: else max_ _ ← max_ _ 9: max_ _ ← , ← max_ 10: 11: ← 1 1 _ 36 Minimalisatie van een DFA Minimalisatieproces: 1. Verwijder ontoegankelijke toestanden 2. Combineer “equivalente” toestanden 37 Minimalisatie van een DFA Gegeven: DFA Definieer: : , Σ, , Σ∗ → , als , , , Equivalentierelatie: ∀ ∈ Σ∗ : , , , Equivalentieklassen onder ≈: | 38 Quotiëntconstructie Stel DFA , Σ, , Definieer: DFA D/ als volgt: 1. | ∈ 2. , , 3. 4. , , Σ, , , ′ quotiënt automaat ′ Stelling:L D/ • Bewijs: zie [Clarke] Stelling: D/ heefteenminimaalaantaltoestanden 39 Minimalisatiealgoritme 1. Schrijf alle paren , met , ∈ ∧ initieel niet gemarkeerd 2. Markeer , als of andersom 3. Herhaal tot er geen wijzigingen meer gebeuren: – Als er een niet‐gemarkeerd paar , bestaat waarbij , , , is gemarkeerd voor een ∈ Σ, markeer dan , . Postconditie: ⇔ , is niet gemarkeerd • Bewijs: zie [Clarke] 40 Minimalisatiealgoritme ‐ Complexiteit Moore’s algoritme Worst‐case #iteraties 2 1 ! 2 ! 2 1 1 2 1 Θ Worst‐case #checks Σ ∗ 1 2 2 ⋯ 1 0 Θ Σ ∗ checks/paar Met #toestandenorigineleDFA 41 Minimalisatiealgoritme ‐ Complexiteit Moore’s algoritme Average‐case #checks Σ ∗ Σ ∗ log log * Hopcroft’s algoritme Worst‐case #checks Σ ∗ Average‐case #checks Σ ∗ Σ ∗ log log * Afhankelijkvanderandomdistributievandeautomatendiegebruiktwordenom deaverage‐casegedragtemodelleren. 42 Equivalentie van REs en FAs Theorema REs en FAs (DFAs, NFAs) beschrijven dezelfde klasse van talen Lemma 1: ∀RE :∃NFA • Bewijs: zie volgende slide Lemma 2: ∀DFA :∃RE • Bewijs: zie [Clarke] 43 Lemma 1: ∀RE : ∃ NFA • Bewijs: d.m.v. inductie op de structuur van R 1. R = a voor een ∈ Σ – – , , met , Σ, , , en met , ∅ voor ∧ 2. , Σ, , , , ∅ – – met 3. ∅ , Σ, , , ∅ met , ∅ – – met 4. 5. 6. met | . ) waarbij ) waarbij en en reguliere expressies zijn reguliere expressies zijn ∗ waarbij eenreguliere expressie is REs zijn gesloten onder unie, concatenatie en kleene‐star □ Merk op: Abstractie van de acties gemaakt voor 44 45 The Big Math Picture Lexicale analyse Lexicale Specificatie (o.a. REs) NFA Rule Priority DFA Minimale DFA Longest Match 46 Lexicale analyse generators Lexicale Specificatie Lexicale analyse generatie Lexical Analyse Generator Characterstream DFA Bv.: C‐Program Lexical Analyser Lexical analysis Tokens Eigenlijk is een lexicale analyse generator ook een compiler 47 Lexicale analyse generators ‐ Input Lexicale specificatie (Lex specifiek) 1. Definitie Macros en headers (onveranderd gekopieerd) 2. Regels 1 RE met bijhorende actie 3. C‐code Overige C‐code (Bv.: calls via acties) Actie communiceert tokentype (en bijhorende semantische waarden) aan Parser. 48 Lexicale analyse generators ‐ Input Lexicale specificatie (Lex specifiek) %{ #include “tokens.h” Definitie #include “errormsg.h” union {int ival; string sval; double fval; } yylval; Global variabele voor parser int charPos=1 #define ADJ (EM_tokPos=charPos, charPos+=yyleng) %} Parser gebruikt dit voor syntax error messages digits [0‐9]+ %% if [a‐z][a‐z0‐9]* {digits} ({digits}“.”[0‐9]*)|([0‐9]*“.”{digits}) (“‐‐”[a‐z]*“\n”)|(“ ”|“\n”|“\t”)+ . + Rule Priority Regels {ADJ; return IF; } {ADJ; yylval.sval=String(yytext); return ID; } {ADJ; yylval.ival=atoi(yytext); return NUM; } {ADJ; yylval.fval=atof(yytext); return REAL; } integer {ADJ; } {ADJ; EM_error(“illegal character”); } 49 Lexicale analyse generators ‐ Output • Transitietabel ‐> programma dat dit interpreteert • Een programma met (of ) statements = partiële evaluatie van het algemene programma dat een transitietabel interpreteert t.o.v. een gegeven (gegenereerde) transitietabel Vbn: C • Lex (meestal in combinatie met parsergenerator Yacc) • Flex (“fast lexical analyser”) C++ • Flex++ Java • JavaCC • SableCC 50 The Big Picture Characterstream Lexicale analyse generatie Lexicale Specificatie (o.a. REs) NFA Rule Priority Lexicale analyse DFA Minimale DFA Longest Match Tokens 51 Examenvragen • Bespreek de werking van een Lexicale Analyser en situeer deze functionele module in de architectuur van de compiler. • Wat is de functie van een Lexicale Analyser Generator en wat is het verband tussen deze generator en REs, NFAs, DFAs en Lexers? • Leg de begrippen “longest‐match” en “rule priority” uit. Waarom worden ze gebruikt in de lexicale analyse? Hoe worden ze geïmplementeerd? • Hoe verloopt de error handling in de lexicale analyse? 52 Bibliografie Andrew Appel Modern Compiler Implementation in C, Cambridge University Press, 2nd Edition, 2004 Andrew Appel Modern Compiler Implementation in Java, Cambridge University Press, 2nd Edition, 2004 Daniel P. Friedman and Mitchell Wand Essentials of programming languages, The MIT Press 3th edition, 2008 Dave Clarke Fundamentals of Computer Science, Januari 2014 53 54
© Copyright 2024 ExpyDoc