Parser Der Teil eines Compilers, der prüft, ob die Folge der Token einen gültigen Satz der Sprache bildet. Unterscheidung nach der Strategie in TopDown.

Slides:



Advertisements
Ähnliche Präsentationen
Vorlesung Compilertechnik Sommersemester 2009
Advertisements

Vorlesung Compilertechnik Sommersemester 2008
Vorlesung Compilertechnik Sommersemester 2008
6. Regelbasierte Systeme
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Rekursionen Erstellt von J. Rudolf im November 2001 /
Martin Schneider, Folien von Prof. H.-P. Gumm
8. Formale Sprachen und Grammatiken
10. Grundlagen imperativer Programmiersprachen
Imperative Programmierung
Kapitel 4 Syntaktische Analyse: LR Parsing.
1 Computergestützte Verifikation Probleme bei der Softwareverifikation 1.komplexe Datentypen und Expressions 2.Pointer und dynamische Datenstrukturen.
Parser generieren Yet Another Compiler – Compiler YACC.
Parser - Verfahren: Rekursiver Abstieg
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Vorlesung Informatik 3 Einführung in die Theoretische Informatik (12 – Kellerautomaten, PDA) Prof. Dr. Th. Ottmann.
Union-Find-Strukturen
M a r c – o l i v e r p a h l Informatik II – Kapitel 18 Übersetzung Zusammenfassung des Kapitel 18 Küchlin, Weber, Vorversion Einführung in die Informatik,
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Katja Losemann Chris Schwiegelshohn
Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Von der Sprache zum Programm
LL(1) Grammatiken Simple LL(1) ohne ε-Regeln verschiedene Produktionen, so gilt LL(1) ohne ε-Regeln verschiedene Produktionen, so gilt LL(1) mit ε-Regeln.
Visualisierung funktionaler Programme
Einführung in das Programmieren mit JavaScript Mag. Andreas Starzer weloveIT – EDV Dienstleistungen.
Übungsaufgabe 1 (Teil A)
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Debugging in Lua Universität zu Köln Re-usable Content in 3D und Simulationssystemen Prof. Dr. Manfred Thaller Referent: Artur Wilke.
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Einführung in die Programmiersprache C 4
Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen
Entwurf und Implementierung eines Scanner-Generatorsystems
Arduino Kurs Abend 2.
Grundlagen Wissenschaftlichen Arbeitens Hilal Tekoglu
Automaten, formale Sprachen und Berechenbarkeit II SoSe 2004 Prof. W. Brauer Teil 1: Wiederholung (Vor allem Folien von Priv.-Doz. Dr. Kindler vom WS 2001/02.
Städtisches Gymnasium Beverungen Friedel Berlage
Einführung in PHP.
Einführung in PHP 5.
Dieser nicht Fehler finden Algorithmus enthält einfach einen gravierenden welcher zu ist.
MODULA-2.
BMEVIEEA100 Grundlagen der Programmierung
PHP: Operatoren und Kontrollstrukturen
Programmieren in C Grundlagen C 2
Codebaumanalyse Was geschieht in der Methode Codebaum.decodiere, wenn als Parameter der Code 001 übergeben wird? Gib die Zeilennummern der durchlaufenen.
Informatik Formale Sprachen 1.2 Grammatiken formaler Sprachen
Agenda Motivation und Einordnung Syntaxgerichtete Übersetzung
A) Erklären Sie den Datentyp char. b) Erklären Sie den Datentyp Struct c) Erklären Sie die Wirkungsweise des Operators & bei Anwendung im Zusammenhang.
7. Formale Sprachen und Grammatiken
Inhalt Einordnung und Funktion der lexikalische Analyse Grundlagen
Programmierkurs JavaUE 4 Anweisungen und ProgrammeDietrich BolesSeite 1 Programmierkurs Java Dr. Dietrich Boles Teil Imperative Programmierung Unterrichtseinheit.
Extended Pascal ( Erweitreung von Pascal) Name: Mehmet CELIK Matr :
The Programming Language Pascal
Extended Pascal Erweiterung von Pascal shadi Behzadipour shadi Shadi behzadipour.
 Am Ende der letzten Stunde hatten wir über die Grenzen unserer Automaten-Modell gesprochen. Dr. Lars Ettelt2  Tipp: Parkhaus.  Einfahrt erst wenn.
Inhalte der Übungen 1.Grundlagen, Ein- und Ausgabe 2.Kontrollstrukturen (Projekt 1) 3.Funktionen 4.Zeiger, Felder (Projekt 2) 5.Strings, Strukturen 6.Fileverarbeitung.
Namensliste Teil der semantischen Aktionen
Compiler/Interpreter
Codegenerierung Code wird nacheinander für jede Prozedur gesondert erzeugt. Code wird innerhalb von Block für statement generiert. Ist der Code für eine.
Tabellengesteuerte Verfahren
Gliederung 0. Motivation und Einordnung 1. Endliche Automaten
Unterschiedliche Kontrollstrukturen
Unterschiedliche Arten von Kontrollstrukturen
1. Die rekursive Datenstruktur Liste 1.5 Das Entwurfsmuster Kompositum
GRUNDLAGEN WISSENSCHAFTLICHEN ARBEITENS MODULA-2 SONAY SUBAYAZ
1. Die rekursive Datenstruktur Liste 1
Schleifen Datenfelder (Arrays) Verzweigungen
The Programming Language Pascal
 Präsentation transkript:

Parser Der Teil eines Compilers, der prüft, ob die Folge der Token einen gültigen Satz der Sprache bildet. Unterscheidung nach der Strategie in TopDown oder ButtomUp Parser. Unterscheidung nach der Arbeitsweise LL- oder LR-Parser. LL: von links lesend, das am weitesten links stehende Nichtterminal ersetzend. LR: von links lesend, das am weitesten rechts stehende Nichtterminal ersetzend.

Kellerautomat Parser basieren auf Kellerautomaten. Vorstellbar als eine Menge von Automaten, die sich gegenseitig aufrufen, wie Funktionen. Der Zustand des aufrufenden Automaten wird gewissermaßen im Stack konserviert. Kellerautomaten schalten in Abhängigkeit der nächsten k Eingabesymbole und dem obersten Stackelement und ihrem aktuellen Zustand. Der Stack ergibt sich bei vielen Verfahren implizit aus dem call-stack, zB. Beim Verfahren des rekursiven Abstiegs.

Ausgangspunkt ist immer die Grammatik der zugrunde liegenden Sprache. Grammatik und Parser hängen eng zusammen, LL(1) Parser verarbeiten LL(1) Grammatiken. Zur Analyse wird k Zeichen vorausgeschaut, um eine Alternative sicher zu erkennen, Bei LL(1) Grammatiken ist k=1. LL Grammatiken müssen linksrekursionsfrei sein. Durch geeignete Umformungen können Linksrekursionen beseitigt werden. Je nach Verfahren werden weitere Umformungen nötig (BNF->EBNF, EBNF->BNF, (E)BNF->Graphen).

LL(1) Grammatik Eine Klasse von Grammatiken Jeder Ableitungsschritt wird eindeutig durch das nächste Eingabesymbol bestimmt, Lookahead=1. Linksrekursionen sind nicht erlaubt. First: die terminalen Anfänge aller Zeichenketten, die aus einem NT hergeleitet werden können müssen verschieden sein. Kann auch ε hergeleitet werden, so müssen zusätzlich alle auf das NT folgen könnenden terminalen Anfänge betrachtet werden und müssen ebenfalls unterschiedlich sein.

programm = block '.' block = [“CONST“ ident=num{“,“ ident=num}“;“] ['VAR' ident { ',' ident } ';' ] {'PROCEDURE' ident ';' block ';' } statement statement = [ident ':=' expression | 'CALL' ident | '?' ident | '!' expression | 'BEGIN' statement { ';' statement } 'END' | 'IF' condition THEN statement | 'WHILE' condition DO statement] condition = 'ODD' expression | expression ( '=' | '#' | '<' | '<=' | '>' | '>=' ) expression expression =['+' | '-'] term {('+' | '-') term } term =faktor { ('*'|'/') faktor } factor =ident | number | '(' expression ')'

First / Follow

programm block '.'

block '=' 'CONST' ident numeral ',' 'VAR' ';' 'PROCEDURE' block statement ','

statement ident ':=' Expression 'IF' condition 'THEN' statement 'WHILE' 'DO' 'BEGIN' 'END' ';' 'CALL' '?' '!' expression

expr '-' term '-' term '+' term '+' Variante 1 Variante 2 Variante 3

term Variante 1 Variante 2 factor '*' '/' Variante 3 factor '*' '/'

factor numeral '(' expression ')' ident

condition 'odd' expression '=' '<' '#' '<=' '>' '>='

Beispielbetrachtung var a,b; begin ?a;?b; b:=10+a*b; !b end. Begin bei programm Aufruf von block Test auf 'CONST' → negativ Test auf 'VAR' → positiv Test auf ident → positiv Test auf ',' → positiv Test auf ',' → negativ Test auf ';' → positiv Test auf 'PROCEDURE' → negativ Aufruf statement Test auf ident → negativ Test auf 'IF' → negativ Test auf 'WHILE' → negativ Test auf 'BEGIN' → positiv Test auf 'CALL' → negativ . . . Test auf '.' → postiv var a,b; begin ?a;?b; b:=10+a*b; !b end.

Vorzüge / Nachteile Graphen sind ein direktes Abbild der Regeln der EBNF Alternativen werden sofort am Beginn des Grafen sackgassenfrei erkannt. Protokolliert man die akzeptierten Bögen, so ergibt sich der Parsebaum. Der hier entstehende Parsebaum hat keine schöne Struktur.

Variante 1 Variante 2

Block Alternative Graphen ab s. 31 ConstDeclList VarDeclList ProcDecl Statement ConstDeclList:: VarDeclList:: ProcDecl:: 'CONST' ';' ',' ConstDecl Alternative Graphen ab s. 31 'VAR' ';' VarDecl ',' ';' ident block 'PROCEDURE'

Vorzüge / Nachteile Es entsteht ein sehr gut lesbarer Syntaxbaum. Alternativen werden nicht sofort erkannt. Es entstehen Sackgassen. Wird eine Sackgassse erkannt, bevor ein Token verarbeitet wurde, ist ein Backtracking bis zur nächsten Alternative möglich. Gelangt die Analyse in eine Sackgasse nachdem ein Token in dem aktuellen Graphen verarbeitet worden ist, so liegt ein Syntaxfehler vor.

Implementation von Graphen Ein Graph kann als Array von Bogenbeschreibungen implementiert werden. Jede Bogenbeschreibung hat dabei ihren Index im Array und beinhaltet den Index des Folgebogens, wenn der Bogen akzeptiert wird und den Index eines Alternativbogens, falls vorhanden, wenn der Bogen nicht akzeptiert wird. Die Akzeptanz eines Bogens ist abhängig von der Bogenbewertung und dem aktuellen Morphem.

Struktur eines Bogens Bogentyp Bogenbeschreibung Symbol Morphemcode Adresse/Index Graph Aktion Index Folgebogen Index Alternativbogen typedef struct BOGEN { tBg BgD; union BGX unsigned long X; int S; tMC M; tIdxGr G; } BgX; int (*fx)(void); int iNext; int iAlt; }tBog; typedef enum BOGEN_DESC {BgNl= 0, // NIL BgSy= 1, // Symbol BgMo= 2, // Morphem BgGr= 4, // Graph BgEn= 8, // Graphende }tBg;

Beispiel Factor numeral '(' expression ')' ident typedef unsigned long ul; tBog gFact[]= { /* 0*/ {BgMo,{(ul)mcIdent}, NULL, 5, 1},/*(0)---ident--->(E)*/ /* 1*/ {BgMo,{(ul)mcNumb }, NULL, 5, 2},/* +---number--->(E)*/ /* 2*/ {BgSy,{(ul)'(' }, NULL, 3, 0},/*(+)----'('---->(3)*/ /* 3*/ {BgGr,{(ul)gExpr }, NULL, 4, 0},/*(1)---express->(4)*/ /* 4*/ {BgSy,{(ul)')' }, NULL, 5, 0},/*(0)----')'---->(E)*/ /* 5*/ {BgEn,{(ul)0 }, NULL, 0, 0} /*(E)--------(ENDE) */ }; numeral '(' expression ')' ident

Arbeitsschritte zum Erstellen der Graphen numeral '(' expression ')' ident 1 2 3 4 5 Graphen ausdrucken Bögen nummerieren Bogenbeschreibungen zusammenstellen Bogen 1 ist Altenativbogen zu Bogen1 und Bogen 2 ist Altenativebogen zu Bogen 1 tBog gFact[]= { /* 0*/ {BgMo,{(ul)mcIdent}, NULL, 5, 1}, /* 1*/ {BgMo,{(ul)mcNumb }, NULL, 5, 2}, /* 2*/ {BgSy,{(ul)'(' }, NULL, 3, 0}, /* 3*/ {BgGr,{(ul)gExpr }, NULL, 4, 0}, /* 4*/ {BgSy,{(ul)')' }, NULL, 5, 0}, /* 5*/ {BgEn,{(ul)0 }, NULL, 0, 0} };

Hinweise zur Umsetzung von Graphen Bei alternativen Bögen ist die Reihenfolge unerheblich, außer bei Vorhandensein von nil-Bögen, diese müssen immer als letzte Alternative angegeben werden. Index als Kommentar mitführen Wenn der Bogen mit dem Index 0 nirgends als Alternativbogen auftaucht, kann die Angabe von 0 als Index auf Alternativbogen als Flag „keine Alternative vorhanden“ genutzt werden. Andere Möglichkeiten das Vorhandensein von Alternativen zu steuern bestehen in dem Indexwert -1 für kein Alternativbogen, oder im Definieren eines Bit im Beschreibungsbyte des Bogens (Bogentyp)

Succsess && pBog->Fx Success=True Success=False Success=parse(G) Exit Success NextToken pBog->BgD == BgNl BgSy BgMo BgGr BgEn n Token.val pBog->S Token.typ pBog->M Succsess && pBog->Fx != NULL pBog=pBog->iNext+pGraph Success ? pBog=pBog->iAlt+pGraph success=pBog->Fx(); pBog->iAlt != Exit no Success BgSy || BGMo

int pars(tBog* pGraph) { tBog* pBog=pGraph; int succ=0; if (Morph.MC==mcEmpty)Lex(); while(1) switch(pBog->BgD) case BgNl:succ=1; break; case BgSy:succ=(Morph.Val.Symb==pBog->BgX.S);break; case BgMo:succ=(Morph.MC==(tMC)pBog->BgX.M); break; case BgGr:succ=pars(pBog->BgX.G); break; case BgEn:return 1; /* Ende erreichet - Erfolg */ } if (succ && pBog->fx!=NULL) succ=pBog->fx(); if (!succ)/* Alternativbogen probieren */ if (pBog->iAlt != 0) pBog=pGraph+pBog->iAlt; else return FAIL; else /* Morphem formal akzeptiert */ if (pBog->BgD & BgSy || pBog->BgD & BgMo) Lex(); pBog=pGraph+pBog->iNext; }/* while */

Generierung des Parsebaums Baum ergibt sich als Logbuch des Parsens Baum besteht aus Listen Listenelement beschreibt einen akzeptiertenBogen Enthielt der Bogen ein Metasymbol (Graph), wird eine neue Liste angelegt Bei erfolgreicher Kompilierung erfolgt die Ausgabe das Baumes in XML

TreeItem *pItem=NULL; if (Morph.MC==mcEmpty)Lex(); while(1) Aufruf: InsertHead(pTree,crItem((pl=CreateList()),"Programm","MetaSymb",0)); if (pars(gProg,pl)==1) int pars(tBog* pGraph,tList* pList) { int verarbMorph=0; tBog* pBog=pGraph; int succ; tList* pl=NULL; TreeItem *pItem=NULL; if (Morph.MC==mcEmpty)Lex(); while(1) . . . }

switch(pBog->BgD & (BgNl+BgSy+BgMo+BgGr+BgEn)) { case BgNl:succ=1; break; case BgSy:succ=(Morph.Val.Symb==pBog->BgX.S); if (succ) InsertTail(pList,crItem(NULL,(crStr(Morph.vBuf)),"Symbol",Morph.PosLine)); case BgMo:succ=(Morph.MC==(tMC)pBog->BgX.M); InsertTail(pList,crItem(NULL,(crStr(Morph.vBuf)),"Morph",Morph.PosLine)); case BgGr: pl=CreateList(); pItem=crItem((pl),crStr(StrGr[pBog->BgX.G]),"MetaSymb",Morph.PosLine); InsertTail(pList,pItem); succ=pars(vGr[pBog->BgX.G],pl); if (succ!=OK) {DeleteList(pl); free(pItem->Descr);free(pItem); GetLast(pList); RemoveItem(pList);} case BgEn:return 1; /* Ende erreichet - Erfolg */ }

if (succ && pBog->fx!=NULL) succ=pBog->fx(); /* Alternativbogen probieren */ { if (pBog->iAlt != 0) pBog=pGraph+pBog->iAlt; } /* Graph nicht erfolgreich verlassen */ else if (verarbMorph) return ERROR; /* Syntaxfehler */ else //printf("go back\n"); while(pItem=GetFirst(pList)){free(pItem->Descr);free(pItem); RemoveItem(pList);} return FAIL; /* vielleicht gibt es noch Alternat. */ else /* Morphem formal akzeptiert */ if (pBog->BgD & BgSy || pBog->BgD & BgMo) verarbMorph=1; Lex(); pBog=pGraph+pBog->iNext;

ConstDeclList:: ConstDeclList:: ConstDecl:: VarDeclList:: VarDecl:: ident “CONST“ “;“ ConstDecl “,“ “=“ numeral “var“ VarDecl ConstDecl:: VarDeclList:: VarDecl::

ProcDecl:: Block:: “;“ “procedure“ ident Block ConstDeclList VarDeclList ProcDecl Statement

Statement:: AssignmentStmt:: AssignmentStatement ConditionalStatement ident “:=“ Expression AssignmentStatement ConditionalStatement LoopStatement CompoundStatement ProcedureCall InputStatement OutputStatement AssignmentStmt::

ConditionalStmnt:: LoopStmnt:: CompoundStmnt:: ProcedureCall:: “if“ Condition “then“ Statement “while“ “do“ “begin“ “;“ “end“ “call“ ident “?“ “!“ Expression LoopStmnt:: CompoundStmnt:: ProcedureCall:: InputStmnt:: OutputStmnt::

'.' 'CONST' 'VAR' 'PROCEDURE' programm statement block factor ident ':=' expression 'IF' condition 'THEN' statement 'WHILE' 'DO' 'BEGIN 'END' ';' 'CALL' '?' '!' block 'CONST' ident '=' numeral ';' 'VAR' 'PROCEDURE' block statement ',' factor numeral '(' expression ')' ident expression '-' term '+' term condition condition 'odd' expression '='|'#'|'<'|'>' '<='|'>=' factor '*' '/'