57
A.Hamid kiloul Pr. Dr. Weber

Pr. Dr. Weber

  • Upload
    jena

  • View
    43

  • Download
    0

Embed Size (px)

DESCRIPTION

Systemprogrammierung. Pr. Dr. Weber. Compiler-Generator ANTLR. A.Hamid kiloul [email protected]. Gliederung. ANTLR. 1. Was ist ANTLR / Geschichte 2. ANTLR plugin für Eclipse / Installation - PowerPoint PPT Presentation

Citation preview

Page 1: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

Pr Dr Weber

AHamid kiloul akilo001yahoode

ANTLR

1 Was ist ANTLR Geschichte

2 ANTLR plugin fuumlr Eclipse Installation

3 ANTLR Optionen

4 Lexer Parser

5 Treeparsing

6 ANTLR Vor- und Nachteile

7Literatur

Gliederung

AHamid kiloul akilo001yahoode

ANTLRWas ist ANTLR

- ANTLR ANother Tool for Language Recognation

-ANTLR ist ein objektorientierter Parsergenerator

- ANTLR ist ein in Java geschriebener Compiler-Compiler der Scanner und Parser wahl-weise in C++ oder Java erstellt

AHamid kiloul akilo001yahoode

ANTLRGeschichte

1048710 ANTLR ist seit 1989 von Terence Parr an der Universitaumlt von San Francisco entwickelt worden 1048710 anfangs DFA - basiert1048710 bis 1990 ANTLR zweimal komplett neu geschrieben1048710 seit 1990 LL(k)1048710 danach Kleinigkeiten verbessert

AHamid kiloul akilo001yahoode

ANTLRANTLR plugin fuumlr EclipseDieses Projekt setzt wirksam Eclipse platform ein (v3 02 und v31) durch Hinzufuumlgenstuumltze fuumlr den Parser Generator ANTLR Es versorgt dem Folgenden plugins

org antlr ANTLR 276 (Beamter) Bibliothekorg antlr Doc ANTLR 276 (Beamter) Dokumentation org antlreclipsecore ANTLR Projektnatur mit Bauunternehmer org antlr eclipse ui ANTLR-bewusster Textredakteur (hat zu Akten mit Verlaumlngerung sbquog verbunden)

AHamid kiloul akilo001yahoode

ANTLRInstallationOnline-Aktualisierungen stehen zur Verfuumlgung auf httpantlreclipsesourceforgenetupdates

1 Waumlhlen Sie Softwareaktualisierungen-gt Fund und Installieren Sie vom Hilfe Menuuml

AHamid kiloul akilo001yahoode

ANTLRInstallation

2 Waumlhlen Search for new features to install und druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation3Druumlcken Sie New Remote Site

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 2: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLR

1 Was ist ANTLR Geschichte

2 ANTLR plugin fuumlr Eclipse Installation

3 ANTLR Optionen

4 Lexer Parser

5 Treeparsing

6 ANTLR Vor- und Nachteile

7Literatur

Gliederung

AHamid kiloul akilo001yahoode

ANTLRWas ist ANTLR

- ANTLR ANother Tool for Language Recognation

-ANTLR ist ein objektorientierter Parsergenerator

- ANTLR ist ein in Java geschriebener Compiler-Compiler der Scanner und Parser wahl-weise in C++ oder Java erstellt

AHamid kiloul akilo001yahoode

ANTLRGeschichte

1048710 ANTLR ist seit 1989 von Terence Parr an der Universitaumlt von San Francisco entwickelt worden 1048710 anfangs DFA - basiert1048710 bis 1990 ANTLR zweimal komplett neu geschrieben1048710 seit 1990 LL(k)1048710 danach Kleinigkeiten verbessert

AHamid kiloul akilo001yahoode

ANTLRANTLR plugin fuumlr EclipseDieses Projekt setzt wirksam Eclipse platform ein (v3 02 und v31) durch Hinzufuumlgenstuumltze fuumlr den Parser Generator ANTLR Es versorgt dem Folgenden plugins

org antlr ANTLR 276 (Beamter) Bibliothekorg antlr Doc ANTLR 276 (Beamter) Dokumentation org antlreclipsecore ANTLR Projektnatur mit Bauunternehmer org antlr eclipse ui ANTLR-bewusster Textredakteur (hat zu Akten mit Verlaumlngerung sbquog verbunden)

AHamid kiloul akilo001yahoode

ANTLRInstallationOnline-Aktualisierungen stehen zur Verfuumlgung auf httpantlreclipsesourceforgenetupdates

1 Waumlhlen Sie Softwareaktualisierungen-gt Fund und Installieren Sie vom Hilfe Menuuml

AHamid kiloul akilo001yahoode

ANTLRInstallation

2 Waumlhlen Search for new features to install und druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation3Druumlcken Sie New Remote Site

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 3: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRWas ist ANTLR

- ANTLR ANother Tool for Language Recognation

-ANTLR ist ein objektorientierter Parsergenerator

- ANTLR ist ein in Java geschriebener Compiler-Compiler der Scanner und Parser wahl-weise in C++ oder Java erstellt

AHamid kiloul akilo001yahoode

ANTLRGeschichte

1048710 ANTLR ist seit 1989 von Terence Parr an der Universitaumlt von San Francisco entwickelt worden 1048710 anfangs DFA - basiert1048710 bis 1990 ANTLR zweimal komplett neu geschrieben1048710 seit 1990 LL(k)1048710 danach Kleinigkeiten verbessert

AHamid kiloul akilo001yahoode

ANTLRANTLR plugin fuumlr EclipseDieses Projekt setzt wirksam Eclipse platform ein (v3 02 und v31) durch Hinzufuumlgenstuumltze fuumlr den Parser Generator ANTLR Es versorgt dem Folgenden plugins

org antlr ANTLR 276 (Beamter) Bibliothekorg antlr Doc ANTLR 276 (Beamter) Dokumentation org antlreclipsecore ANTLR Projektnatur mit Bauunternehmer org antlr eclipse ui ANTLR-bewusster Textredakteur (hat zu Akten mit Verlaumlngerung sbquog verbunden)

AHamid kiloul akilo001yahoode

ANTLRInstallationOnline-Aktualisierungen stehen zur Verfuumlgung auf httpantlreclipsesourceforgenetupdates

1 Waumlhlen Sie Softwareaktualisierungen-gt Fund und Installieren Sie vom Hilfe Menuuml

AHamid kiloul akilo001yahoode

ANTLRInstallation

2 Waumlhlen Search for new features to install und druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation3Druumlcken Sie New Remote Site

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 4: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRGeschichte

1048710 ANTLR ist seit 1989 von Terence Parr an der Universitaumlt von San Francisco entwickelt worden 1048710 anfangs DFA - basiert1048710 bis 1990 ANTLR zweimal komplett neu geschrieben1048710 seit 1990 LL(k)1048710 danach Kleinigkeiten verbessert

AHamid kiloul akilo001yahoode

ANTLRANTLR plugin fuumlr EclipseDieses Projekt setzt wirksam Eclipse platform ein (v3 02 und v31) durch Hinzufuumlgenstuumltze fuumlr den Parser Generator ANTLR Es versorgt dem Folgenden plugins

org antlr ANTLR 276 (Beamter) Bibliothekorg antlr Doc ANTLR 276 (Beamter) Dokumentation org antlreclipsecore ANTLR Projektnatur mit Bauunternehmer org antlr eclipse ui ANTLR-bewusster Textredakteur (hat zu Akten mit Verlaumlngerung sbquog verbunden)

AHamid kiloul akilo001yahoode

ANTLRInstallationOnline-Aktualisierungen stehen zur Verfuumlgung auf httpantlreclipsesourceforgenetupdates

1 Waumlhlen Sie Softwareaktualisierungen-gt Fund und Installieren Sie vom Hilfe Menuuml

AHamid kiloul akilo001yahoode

ANTLRInstallation

2 Waumlhlen Search for new features to install und druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation3Druumlcken Sie New Remote Site

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 5: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRANTLR plugin fuumlr EclipseDieses Projekt setzt wirksam Eclipse platform ein (v3 02 und v31) durch Hinzufuumlgenstuumltze fuumlr den Parser Generator ANTLR Es versorgt dem Folgenden plugins

org antlr ANTLR 276 (Beamter) Bibliothekorg antlr Doc ANTLR 276 (Beamter) Dokumentation org antlreclipsecore ANTLR Projektnatur mit Bauunternehmer org antlr eclipse ui ANTLR-bewusster Textredakteur (hat zu Akten mit Verlaumlngerung sbquog verbunden)

AHamid kiloul akilo001yahoode

ANTLRInstallationOnline-Aktualisierungen stehen zur Verfuumlgung auf httpantlreclipsesourceforgenetupdates

1 Waumlhlen Sie Softwareaktualisierungen-gt Fund und Installieren Sie vom Hilfe Menuuml

AHamid kiloul akilo001yahoode

ANTLRInstallation

2 Waumlhlen Search for new features to install und druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation3Druumlcken Sie New Remote Site

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 6: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInstallationOnline-Aktualisierungen stehen zur Verfuumlgung auf httpantlreclipsesourceforgenetupdates

1 Waumlhlen Sie Softwareaktualisierungen-gt Fund und Installieren Sie vom Hilfe Menuuml

AHamid kiloul akilo001yahoode

ANTLRInstallation

2 Waumlhlen Search for new features to install und druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation3Druumlcken Sie New Remote Site

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 7: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInstallation

2 Waumlhlen Search for new features to install und druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation3Druumlcken Sie New Remote Site

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 8: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInstallation3Druumlcken Sie New Remote Site

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 9: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInstallation4 Gehen Sie in ANTLR Eklipse ein (oder was fuumlr Sie moumlchten) als der Name und http antlreclipsesourceforgenetupdates fuumlr die URL-ADRESSE

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 10: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInstallation5 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 11: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInstallation6 Uumlberpruumlfen Sie die Kaumlsten neben der Version die Sie gern installieren wuumlrden und Als naumlchstes druumlcken Sie auf Next

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 12: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInstallation7 Akzeptieren Sie den Lizenzvertrag und druumlcken Sie Als naumlchstes Next

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 13: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInstallation8 Druumlcken Sie auf Finish

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 14: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 15: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLR

ANTLR Optionen

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 16: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet verschiedenste Optionen wie

1048710 Dateioptionen 1048710 Grammatikoptionen 1048710 Optionen fuumlr Regeln 1048710 sowie Kommandozeilenoptionen

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 17: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen1048710 Optionen koumlnnen direkt in den Quellcode geschrieben werden

1048710 allgemeiner Aufbau options k = 2 defaultErrorHandler = false

1048710 wo koumlnnen Optionen stehen 1048710 direkt unter dem Header in einer normalen g-Datei 1048710 in der Grammatik direkt hinter der Defintion des Parsers 1048710 in einer Regel an folgender Stelle myrule[args] returns [retval] options defaultErrorHandler=false body of rule

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 18: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 language = bdquoLanguageNameldquo 1048710 legt zu erzeugende Sprache fest 1048710 moumlglich Werte sind 1048710 Java (Java) 1048710 Cpp (C++) 1048710 Csharp (C )

1048710 k = bdquoNumberOfLookaheadldquo 1048710 bestimmt die Anzahl der Lookaheadsymbole 1048710 dh maximale Anzahl von Token die bei Alternativen durchsucht werden 1048710 auszligerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 19: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 testLiterals = false 1048710 unterdruumlckt automatische Aumlnderung des Tokentyps

1048710 buildAST = true 1048710 stellt das Interface fuumlr Treeparsing und Treewalking zur Verfuumlgung

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 20: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDatei Grammatik und Regel Optionen (Auswahl)

1048710 analyzerDebug 1048710 Debugginginformationen waumlhrend Grammatikanalyse

1048710 caseSensitive 1048710 Unterdruumlckt Unterscheidung von Groszlig- und Kleinschreibung

1048710 caseSensitiveLiterals 1048710 ignoriert Groszlig- und Kleinschreibung beim Vergleich von Token und Litralen

1048710 warnWhenFollowAmbig 1048710 liefert Exception bei leeren Alternativen

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 21: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 -o outputDir 1048710 legt den Ordner fuumlr die Ausgabedateien fest

1048710 -debug 1048710 oumlffnet den ParseView Debugger 1048710 ParseView ist separat erhaumlltich

1048710 -html 1048710 generiert eine HTML - Datei der Grammatik 1048710 Funktion ist nur fuumlr den Parser

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 22: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRKommandozeilenoptionen (Auswahl)

1048710 - docbook 1048710 wie ndashhtml nur das eine SGML ndash Datei erzeugt wird

1048710 - diagnostics 1048710 erzeugt eine Textdatei der Grammatik mit Debugging Informationen

1048710 - h | - help | -- help 1048710 Hilfe

1048710 - trace | - traceLexer | - traceParser | - traceTreeParser 1048710 Ausgabe des Trace fuumlr alle oder entsprechenden Teil

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 23: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Der LEXER ist nicht als DFA gestaltet

1048710 beide verwenden LL(k) mit k beliebig aber fest

1048710 Der PARSER versteht sich auf EBNF

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 24: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile DFA 1048710 einfach aus regulaumlren Ausdruumlcken herzustellen 1048710 kommen mit Linksrekursion klar

integer [0-9]+ real [0-9]+[0-9]|[0-9]+

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 25: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 Vorteile hand build scanner (hbs) 1048710 nicht beschraumlnkt auf die Klasse der regulaumlren Sprachen 1048710 semantische Aktionen sind moumlglich 1048710 DFAacutes bestehen aus Integertabellen (schwer zu debuggen) 1048710 guter hbs ist schneller als DFA 1048710 kommt mit UNICODE (16bit) klar

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 26: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDFA vs hand build scanner

1048710 ANTLR macht beides

1048710 regulaumlre Ausdruumlcke gut zu verstehender LEXER der maumlchtiger ist UNICODE versteht und leicht zu debuggen ist

1048710 PROBLEME 1048710 UNICODE noch nicht vollstaumlndig implementiert 1048710 Linksfaktorisierung

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 27: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRAufbau

myCompilerg

HEADER OPTIONS LEXER PARSER TREEWALKER

1048710 Reihenfolge egal1048710 g ist Konvention

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 28: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRHEADER

1048710 Aufbau header uumlbernommener code in compiler

1048710 muss Zielcode entsprechen1048710 guter Bereich fuumlr eigentlichen Compiler der Lexer Parserhellip nutzt

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 29: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRLEXER1048710 Aufbau

optionaler Zielcode class MyLexer extends Lexer options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 30: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRPARSER1048710 Aufbau

optionaler Zielcode class MyParser extends Parser options Optionen tokens optionale Tokendefinitionen optionaler klasseninterner Zielcode

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 31: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRREGELN

1048710 Tokensektion

tokens KEYWORD_VOID=void

1048710 Definition von Schluumlsselwoumlrtern

EXPR

1048710 Definition von imaginaumlren Token

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 32: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 string for == f o rlsquo

1048710 end of file EOF

1048710 Zeichen auslassen

WS ( | t | n| r )+ $setType(TokenSKIP)

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 33: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRLEXER amp PARSER

1048710 Aufbau class MyParser extends Parser idList ( ID )+ 1048710 beginnt mit Kleinbuchstabe

class MyLexer extends Lexer ID ( az )+ 1048710 beginnt mit Groszligbuchstabe

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 34: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLR

Tree Parsing mit ANTLR

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 35: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRInhalt

Einleitung 1048710 Was ist ein Treeparser 1048710 Notation 1048710 Grammatikregeln 1048710 Transformation und Operatoren 1048710 Beispiele 1048710 einfach 1048710 Ruumlckgabewert

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 36: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLREinleitung

1048710 ANTLR bietet Hilfsmittel um abstrakte Syntaxbaumlume (ASTs) zu konstruieren

1048710 Erweiterung der Grammatik notwendig 1048710 Hinzufuumlgen von Baumoperatoren 1048710 Regeln neu definieren 1048710 zusaumltzliche Aktionen ergaumlnzen

1048710 Veraumlnderung der grammatikalen Struktur der ASTs ermoumlglicht einfaches bdquoTreewalkingldquo waumlhrend der Uumlbersetzung

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 37: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRWas ist ein Tree Parser1048710 Parsing dient der Ermittlung einer grammatikalen Struktur1048710 ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen1048710 Unterschied zwischen bdquonormalemldquo Tokenparsing und Treeparsing 1048710 Testen nach dem Lookahead 1048710 neuen Regelmethoden definiert 1048710 zweidimensionale Baumstruktur1048710 ANTLR kann alle Baumlume parsen die das AST Interface implementieren1048710 Die beiden wichtigsten Funktionen sind dabei 1048710 getFirstChild ndash liefert eine Referenz auf das erste Kind 1048710 getNextSibling ndash liefert eine Referenz auf das naumlchste Kind

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 38: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 39: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRNotation

1048710 Aufbau eines Knotens 1048710 besteht aus einer Liste mit Kindern 1048710 mit bdquoetwasldquo Text (zB Wert des Variableninhaltes) 1048710 und einem Knotentyp

1048710 Somit ist jeder Knoten eines Baumes auch ein Baum

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 40: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRNotation

helliphellip

1048710 Notation wie in LISP 1048710 Einfach (A B C) 1048710 Baum mit Wurzel A und Kindern B und C

1048710 Verschachtelung (A B (C D E)) 1048710 Baum mit Wurzel A einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 41: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDie AST Definition1048710 public interface AST public int getType() Get the token type for this node public void setType(int ttype) Set the token type for this node

public String getText() Get the token text for this node public void setText(String text) Set the token text for this node

public AST getFirstChild() Get the first child of this node null if no children public void setFirstChild(AST c) Set the first child of a node

public AST getNextSibling() Get the next sibling in line after this one public void setNextSibling(AST n) Set the next sibling after this one

public void addChild(AST c) Add a (rightmost) child to this node

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 42: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume1048710 Baumgrammatiken Sammlung von EBNF Regeln

1048710 mit Aktionen sowie semantischen und syntaktischen Praumldikaten

1048710 rule alternative1 | alternative2 | | alternativen

1048710 jede alternative Produktion ist zusammengesetzt aus Elementliste 1048710 (root-token child1 child2 child n)

1048710 Beispiel Additionsbaum mit zwei Integer Kindern 1048710 (PLUS INT INT)

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 43: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRGrammatikregeln fuumlr Baumlume

1048710 man beachte 1048710 Wurzel eines Baumpatterns muss eine Tokenreferenz sein 1048710 Kinder duumlrfen auch bdquoSubrulesldquo sein

1048710 Beispiel bdquoIf then elseldquo Statement ndash bdquoelseldquo optional 1048710 (IF expr stat (stat))

1048710 Wichtig fuumlr Baumgrammatiken und Strukturen 1048710 keine exakten Matches 1048710 ausreichende Matches genuumlgen

1048710 Uumlbereinstimmung wird geliefert auch wenn Teile noch ungeparst sind 1048710 Bsp (A B) paszligt zu allen Baumlume gleicher Struktur wie (A (B C) D)

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 44: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRSyntaktische Praumldikate

1048710 Treeparsing benutzt Lookahead von k = 11048710 Moumlglichkeit unterschiedliche Baumstrukturen zu beschreiben

1048710 Ziel Beschraumlnkung durch den fixen Lookahead umgehen

1048710 Loumlsung Syntaktische Praumldikate

1048710 Beispiel Unterscheidung des unaumlren und binaumlren Minusoperators 1048710 expr ( (MINUS expr expr) ) =gt (MINUS expr expr) | (MINUS expr)

1048710 Reihenfolge beachten da zweite Alternative Teilmenge der ersten ist

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 45: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRBaumschule - Transformation

1048710 ANTLR Tree Parse unterstuumltzt buildAST Option

1048710 ohne Codetransformation wird Eingabebaum zum Ausgabebaum

1048710 jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum

1048710 getAST liefert den Ergebnisbaum der Startregel

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 46: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDer ldquoldquo Operator

1048710 Regeln koumlnnen um Suffix ldquoldquo erweitert werden 1048710 unterdruumlckt automatisches Hinzufuumlgen zum Ergebnisbaum 1048710 interne Verarbeitung findet jedoch trotzdem statt

1048710 Kann mit Regelreferenzen und Regeldefinitionen verwendet werden 1048710 Beispiel 1048710 begin INT PLUS iINT begin = (PLUS INT i)

1048710 ldquoldquo kann auch als Praumlfixoperator verwendet werden 1048710 Funktionsweise wie oben 1048710 Filtert jedoch nur die entsprechende Alternative

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 47: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

1048710 Blaumltter 1048710 jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet 1048710 ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert

1048710 Wurzeln 1048710 jeder Token mit dem Suffix ldquo^ldquo wird als Wurzelknoten behandelt 1048710 Sinn Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums 1048710 Beispiel 1048710 Eingabe a A B^ C^ 1048710 Ergebnisbaum

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 48: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRDer ldquo^ldquo Operator

helliphellip

1048710 Ergebnisbaum (C (B A))

1048710 Ergebnisbaum ohne ldquo^ldquo Liste A B C

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 49: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRBeispiel1048710 einfacher Taschenrechner mit folgender Grammatik 1048708 class CalcLexer extends Lexer WS ( | t | n | r) _ttype = TokenSKIP LPAREN ( RPAREN ) STAR PLUS + SEMI INT (09)+ 1048710 class CalcParser extends Parser options buildAST = true uses CommonAST by default expr mexpr (PLUS^ mexpr) SEMI mexpr atom (STAR^ atom) atom INT

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 50: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRBeispiel

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 51: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRBeispiel

1048710 Beispiel Eingabe 1 2 + 3

1048710 erzeugt folgenden Baum ( + ( 1 2 ) 3 )

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 52: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRBeispiel ndash mit Ruumlckgabewert1048710 Struktur muss rekursiv beschrieben werden 1048710 class CalcTreeWalker extends TreeParser expr (PLUS expr expr) | (STAR expr expr) | INT 1048708 class CalcTreeWalker extends TreeParser expr returns [float r] float ab r=0 (PLUS a = expr b = expr) r = a + b | (STAR a = expr b =e xpr) r = a b | i INT r =(float) IntegerparseInt(igetText())

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 53: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLR

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 54: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRErwaumlhnenswert

1048710 was ANTLR nicht bietet 1048710 Referenzknoten die nichts weiter tun als auf andere Knoten zu zeigen

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 55: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLR

+ Vorteilhaft ist bei ANTLR dass die Grammatik auf Mehrdeutigkeiten unendliche Rekursionen ud gl gepruumlft werden Zudem wird durch die Verwendung der Praumldikate das Problem des LL(1) Konflikts beim rekursiven Abstieg geloumlst

- Ein Nachteil von ANTLR ist dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 langsamer ist als von rdquo handgeschriebenenldquo

ANTLR Vor- und Nachteile

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 56: Pr. Dr. Weber

AHamid kiloul akilo001yahoode

ANTLRLiteratur amp Link

- Compiler Construction with ANTLR and Java - Tools for building tools Dr Dobbs Journal March 1999

- Parr TJQuong RW ANTLR A Predicated-LL(k) Parser Generator SOFTWAREmdashPRACTICE AND EXPERIENCE VOL 25(7) 789ndash810(JULY1995)

- httpwwwantlrorg

- httpwwwddjcomdocumentss=905ddj9903h9903hhtm

AHamid kiloul akilo001yahoode

Page 57: Pr. Dr. Weber

AHamid kiloul akilo001yahoode