Transcript Folie 1
Pr. Dr. Weber A.Hamid kiloul [email protected] Gliederung ANTLR 1. Was ist ANTLR / Geschichte 2. ANTLR plugin für Eclipse / Installation 3. ANTLR Optionen 4. Lexer / Parser 5. Treeparsing 6. ANTLR: Vor- und Nachteile 7.Literatur A.Hamid kiloul [email protected] Was ist ANTLR ? 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. A.Hamid kiloul [email protected] Geschichte ANTLR ANTLR ist seit 1989 von Terence Parr an der Universität von San Francisco entwickelt worden. anfangs DFA - basiert bis 1990 ANTLR zweimal komplett neu geschrieben seit 1990 LL(k) danach Kleinigkeiten verbessert A.Hamid kiloul [email protected] ANTLR plugin für Eclipse ANTLR Dieses Projekt setzt wirksam Eclipse platform ein (v3. 02 und v3.1) durch Hinzufügenstütze für den Parser Generator ANTLR. Es versorgt dem Folgenden plugins: org. antlr ANTLR 2.7.6 (Beamter) Bibliothek org. antlr. Doc ANTLR 2.7.6 (Beamter) Dokumentation org. antlr.eclipse.core. ANTLR Projektnatur mit Bauunternehmer org. antlr. eclipse. ui ANTLR-bewusster Textredakteur (hat zu Akten mit Verlängerung ‚*.g' verbunden) A.Hamid kiloul [email protected] Installation ANTLR Online-Aktualisierungen stehen zur Verfügung auf http://antlreclipse.sourceforge.net/updates/. 1. Wählen Sie Softwareaktualisierungen-> Fund und Installieren Sie vom Hilfe Menü. A.Hamid kiloul [email protected] Installation ANTLR 2. Wählen Search for new features to install und drücken Sie auf Next. A.Hamid kiloul [email protected] Installation ANTLR 3.Drücken Sie New Remote Site... A.Hamid kiloul [email protected] Installation ANTLR 4. Gehen Sie "in ANTLR Eklipse" ein (oder was für Sie möchten) als der Name, und "http: // antlreclipse.sourceforge.net/updates/" für die URL-ADRESSE. A.Hamid kiloul [email protected] Installation ANTLR 5. Drücken Sie auf Finish A.Hamid kiloul [email protected] Installation ANTLR 6. Überprüfen Sie die Kästen neben der Version, die Sie gern installieren würden und Als nächstes drücken Sie auf Next A.Hamid kiloul [email protected] Installation ANTLR 7. Akzeptieren Sie den Lizenzvertrag und drücken Sie Als nächstes Next A.Hamid kiloul [email protected] Installation ANTLR 8. Drücken Sie auf Finish A.Hamid kiloul [email protected] ANTLR A.Hamid kiloul [email protected] ANTLR ANTLR Optionen A.Hamid kiloul [email protected] Einleitung ANTLR ANTLR bietet verschiedenste Optionen, wie Dateioptionen Grammatikoptionen Optionen für Regeln sowie Kommandozeilenoptionen A.Hamid kiloul [email protected] Datei, Grammatik und Regel Optionen Optionen ANTLR können direkt in den Quellcode geschrieben werden allgemeiner Aufbau options { k = 2 ; defaultErrorHandler = false ; } wo können Optionen stehen: direkt unter dem Header in einer normalen .g-Datei in der Grammatik direkt hinter der Defintion des Parsers in einer Regel an folgender Stelle: myrule[args] returns [retval] options { defaultErrorHandler=false; } : // body of rule... A.Hamid kiloul [email protected] Datei, Grammatik und Regel Optionen (Auswahl) ANTLR language = „LanguageName“ ; legt zu erzeugende Sprache fest möglich Werte sind: Java (Java) Cpp (C++) Csharp (C# ) k = „NumberOfLookahead“ ; bestimmt die Anzahl der Lookaheadsymbole d.h. maximale Anzahl von Token die bei Alternativen durchsucht werden außerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht A.Hamid kiloul [email protected] Datei, Grammatik und Regel Optionen (Auswahl) ANTLR testLiterals = false ; unterdrückt automatische Änderung des Tokentyps buildAST = true ; stellt das Interface für Treeparsing und Treewalking zur Verfügung A.Hamid kiloul [email protected] Datei, Grammatik und Regel Optionen (Auswahl) ANTLR analyzerDebug Debugginginformationen während Grammatikanalyse caseSensitive Unterdrückt Unterscheidung von Groß- und Kleinschreibung caseSensitiveLiterals ignoriert Groß- und Kleinschreibung beim Vergleich von Token und Litralen warnWhenFollowAmbig liefert Exception bei leeren Alternativen A.Hamid kiloul [email protected] Kommandozeilenoptionen (Auswahl) ANTLR -o outputDir legt den Ordner für die Ausgabedateien fest -debug öffnet den ParseView Debugger ParseView ist separat erhältich -html generiert eine HTML - Datei der Grammatik Funktion ist nur für den Parser A.Hamid kiloul [email protected] Kommandozeilenoptionen (Auswahl) ANTLR - docbook wie –html, nur das eine SGML – Datei erzeugt wird - diagnostics erzeugt eine Textdatei der Grammatik mit Debugging Informationen - h | - help | -- help Hilfe - trace | - traceLexer | - traceParser | - traceTreeParser Ausgabe des Trace für alle oder entsprechenden Teil A.Hamid kiloul [email protected] LEXER & PARSER ANTLR Der LEXER ist nicht als DFA gestaltet. beide verwenden LL(k) mit k beliebig aber fest. Der PARSER versteht sich auf EBNF. A.Hamid kiloul [email protected] DFA vs. hand build scanner ANTLR Vorteile DFA einfach aus regulären Ausdrücken herzustellen kommen mit Linksrekursion klar: integer : real : A.Hamid kiloul "[0-9]+" ; "[0-9]+{.[0-9]*}|.[0-9]+" ; [email protected] DFA vs. hand build scanner ANTLR Vorteile hand build scanner (hbs) nicht beschränkt auf die Klasse der regulären Sprachen semantische Aktionen sind möglich DFA´s bestehen aus Integertabellen (schwer zu debuggen) guter hbs ist schneller als DFA kommt mit UNICODE (16bit) klar A.Hamid kiloul [email protected] DFA vs. hand build scanner ANTLR ANTLR macht beides reguläre Ausdrücke gut zu verstehender LEXER, der mächtiger ist, UNICODE versteht und leicht zu debuggen ist PROBLEME: UNICODE noch nicht vollständig implementiert Linksfaktorisierung A.Hamid kiloul [email protected] Aufbau ANTLR myCompiler.g HEADER OPTIONS LEXER PARSER TREEWALKER Reihenfolge egal *.g ist Konvention A.Hamid kiloul [email protected] HEADER ANTLR Aufbau: header { ...übernommener code in compiler... } muss Zielcode entsprechen guter Bereich für eigentlichen Compiler der Lexer, Parser… nutzt A.Hamid kiloul [email protected] LEXER ANTLR Aufbau: { ...optionaler Zielcode... } class MyLexer extends Lexer; options { ...Optionen... } tokens { ...optionale Tokendefinitionen... } { ...optionaler klasseninterner Zielcode... } A.Hamid kiloul [email protected] PARSER ANTLR Aufbau: { ...optionaler Zielcode... } class MyParser extends Parser; options { ...Optionen... } tokens { ...optionale Tokendefinitionen... } { ...optionaler klasseninterner Zielcode... } A.Hamid kiloul [email protected] REGELN ANTLR Tokensektion: tokens { KEYWORD_VOID="void"; Definition von Schlüsselwörtern EXPR; Definition von imaginären Token } A.Hamid kiloul [email protected] LEXER & PARSER ANTLR string "for" == 'f' 'o' 'r‘ end of file EOF Zeichen auslassen: WS : ( ' ' | '\t' | '\n'| '\r' )+ { $setType(Token.SKIP); }; A.Hamid kiloul [email protected] LEXER & PARSER ANTLR Aufbau: class MyParser extends Parser; idList : ( ID )+; beginnt mit Kleinbuchstabe class MyLexer extends Lexer; ID : ( 'a'..'z' )+ ; beginnt A.Hamid kiloul mit Großbuchstabe [email protected] ANTLR Tree Parsing mit ANTLR A.Hamid kiloul [email protected] Inhalt ANTLR Einleitung Was ist ein Treeparser Notation Grammatikregeln Transformation und Operatoren Beispiele einfach Rückgabewert A.Hamid kiloul [email protected] Einleitung ANTLR ANTLR bietet Hilfsmittel um abstrakte Syntaxbäume (ASTs) zu konstruieren Erweiterung der Grammatik notwendig Hinzufügen von Baumoperatoren Regeln neu definieren zusätzliche Aktionen ergänzen Veränderung der grammatikalen Struktur der ASTs ermöglicht einfaches „Treewalking“ während der Übersetzung A.Hamid kiloul [email protected] Was ist ein Tree Parser ANTLR Parsing dient der Ermittlung einer grammatikalen Struktur ANTLR sieht Baum als Eingabe von Knoten in zwei Dimensionen Unterschied zwischen „normalem“ Tokenparsing und Treeparsing: Testen nach dem Lookahead neuen Regelmethoden definiert zweidimensionale Baumstruktur ANTLR kann alle Bäume parsen, die das AST Interface implementieren Die beiden wichtigsten Funktionen sind dabei getFirstChild – liefert eine Referenz auf das erste Kind getNextSibling – liefert eine Referenz auf das nächste Kind A.Hamid kiloul [email protected] Notation ANTLR Aufbau eines Knotens besteht aus einer Liste mit Kindern mit „etwas“ Text (z.B. Wert des Variableninhaltes) und einem Knotentyp Somit ist jeder Knoten eines Baumes auch ein Baum Notation wie in LISP Einfach: #(A B C) Baum mit Wurzel A und Kindern B und C A.Hamid kiloul [email protected] Notation ANTLR Aufbau eines Knotens besteht aus einer Liste mit Kindern mit „etwas“ Text (z.B. Wert des Variableninhaltes) und einem Knotentyp Somit ist jeder Knoten eines Baumes auch ein Baum Notation wie in LISP Einfach: #(A B C) Baum mit Wurzel A und Kindern B und C A.Hamid kiloul [email protected] Notation ANTLR …… Notation wie in LISP Einfach: #(A B C) Baum mit Wurzel A und Kindern B und C Verschachtelung: #(A B #(C D E)) Baum mit Wurzel A, einem Kind B und einem Unterbaum mit C als Wurzel und D sowie E als Kindern A.Hamid kiloul [email protected] Die AST Definition ANTLR public interface AST { public int getType(); public void setType(int ttype); /** Get the token type for this node */ /** Set the token type for this node */ public String getText(); public void setText(String text); /** Get the token text for this node */ /**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 */ } A.Hamid kiloul [email protected] Grammatikregeln für Bäume ANTLR Baumgrammatiken Sammlung von EBNF Regeln mit Aktionen sowie semantischen und syntaktischen Prädikaten rule: alternative1 | alternative2 | ... | alternativen ; jede alternative Produktion ist zusammengesetzt aus Elementliste: # (root-token child1 child2 ... child n) Beispiel: Additionsbaum mit zwei Integer Kindern: A.Hamid kiloul # (PLUS INT INT) [email protected] Grammatikregeln für Bäume ANTLR man beachte: Wurzel eines Baumpatterns muss eine Tokenreferenz sein Kinder dürfen auch „Subrules“ sein Beispiel „If then else“ Statement – „else“ optional # (IF expr stat (stat)?) Wichtig für Baumgrammatiken und Strukturen: keine exakten Matches ausreichende Matches genügen Übereinstimmung wird geliefert auch wenn Teile noch ungeparst sind Bsp.: # (A B) # paßt zu allen Bäume gleicher Struktur, wie # (A # (B C) D) A.Hamid kiloul [email protected] Syntaktische Prädikate ANTLR Treeparsing benutzt Lookahead von k = 1 Möglichkeit unterschiedliche Baumstrukturen zu beschreiben Ziel: Beschränkung durch den fixen Lookahead umgehen Lösung: Syntaktische Prädikate Beispiel: Unterscheidung des unären und binären Minusoperators: expr: ( # (MINUS expr expr) ) => #(MINUS expr expr) | # (MINUS expr) ... ; Reihenfolge beachten, da zweite Alternative Teilmenge der ersten ist A.Hamid kiloul [email protected] Baumschule - Transformation ANTLR ANTLR Tree Parse unterstützt buildAST Option ohne Codetransformation wird Eingabebaum zum Ausgabebaum jede Regel hat implizit einen (automatisch definierten) Ergebnisbaum getAST liefert den Ergebnisbaum der Startregel A.Hamid kiloul [email protected] Der “!“ Operator ANTLR Regeln können um Suffix “!“ erweitert werden unterdrückt automatisches Hinzufügen zum Ergebnisbaum interne Verarbeitung findet jedoch trotzdem statt Kann mit Regelreferenzen und Regeldefinitionen verwendet werden Beispiel: begin! : INT PLUS i:INT { #begin = #(PLUS INT i); } ; “!“ kann auch als Präfixoperator verwendet werden Funktionsweise wie oben Filtert jedoch nur die entsprechende Alternative A.Hamid kiloul [email protected] Der “^“ Operator ANTLR Blätter jeder Tokenreferenz sowie jedem Tokenbereich wird ein Blatt zugeordnet ohne Suffixe wird Tokenliste erzeugt und der Baum kopiert Wurzeln jeder Token mit dem Suffix “^“ wird als Wurzelknoten behandelt Sinn: Token ist Operatorknoten und gleichzeitig auch Wurzel eines neuen Teilbaums Beispiel: Eingabe: a : A B^ C^ ; Ergebnisbaum: ?? A.Hamid kiloul [email protected] Der “^“ Operator ANTLR …… Ergebnisbaum: #(C #(B A)) Ergebnisbaum ohne “^“: Liste A B C A.Hamid kiloul [email protected] Beispiel ANTLR einfacher Taschenrechner mit folgender Grammatik class CalcLexer extends Lexer; WS : (' ' | '\t' | '\n' | '\r') { _ttype = Token.SKIP; } ; LPAREN : '(' ; RPAREN : ')' ; STAR: '*' ; PLUS: '+' ; SEMI: ';' ; INT : ('0'..'9')+ ; class CalcParser extends Parser; options { buildAST = true; / uses CommonAST by default } expr : mexpr (PLUS^ mexpr)* SEMI! ; mexpr : atom (STAR^ atom)* ; atom: INT ; A.Hamid kiloul [email protected] Beispiel A.Hamid kiloul ANTLR [email protected] Beispiel ANTLR Beispiel: Eingabe 1 * 2 + 3 erzeugt folgenden Baum: A.Hamid kiloul # ( + ( * 1 2 ) 3 ) [email protected] Beispiel – mit Rückgabewert Struktur ANTLR muss rekursiv beschrieben werden: class CalcTreeWalker extends TreeParser; expr : # (PLUS expr expr) | # (STAR expr expr) | INT ; class CalcTreeWalker extends TreeParser; expr returns [float r] { float a,b; r=0; } : # (PLUS a = expr b = expr) {r = a + b ;} | # (STAR a = expr b =e xpr) {r = a * b ;} | i : INT {r =(float) Integer.parseInt(i.getText());} ; A.Hamid kiloul [email protected] ANTLR A.Hamid kiloul [email protected] Erwähnenswert ANTLR was ANTLR nicht bietet: Referenzknoten, die nichts weiter tun, als auf andere Knoten zu zeigen A.Hamid kiloul [email protected] ANTLR: Vor- und Nachteile ANTLR + Vorteilhaft ist bei ANTLR, dass die Grammatik auf Mehrdeutigkeiten, unendliche Rekursionen ud gl. geprüft werden. Zudem wird durch die Verwendung der Prädikate das Problem des LL(1) Konflikts beim rekursiven Abstieg gelöst. - Ein Nachteil von ANTLR ist, dass die Verarbeitungsgeschwindigkeit von automatisch generierten Parsern und Scannern um bis zu 20 % langsamer ist als von ” handgeschriebenen“. A.Hamid kiloul [email protected] Literatur & Link ANTLR - Compiler Construction with ANTLR and Java - Tools for building tools; Dr. Dobb's Journal March 1999; - Parr, T.J./Quong, R.W.: ANTLR: A Predicated-LL(k) Parser Generator; SOFTWARE—PRACTICE AND EXPERIENCE, VOL. 25(7), 789–810(JULY1995) - http://www.antlr.org - http://www.ddj.com/documents/s=905/ddj9903h/9903h.htm A.Hamid kiloul [email protected] A.Hamid kiloul [email protected]