pr. dr. weber
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 PresentationTRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
AHamid kiloul akilo001yahoode