3db888d590340f3cfc901edde1adb602.ppt
- Количество слайдов: 57
Pr. Dr. Weber A. Hamid kiloul akilo 001@yahoo. de
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 akilo 001@yahoo. de
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 akilo 001@yahoo. de
Geschichte ANTLR ist seit 1989 von Terence Parr an der Universität von San Francisco entwickelt worden. anfangs DFA - basiert 1990 ANTLR zweimal komplett neu bis geschrieben 1990 LL(k) seit danach Kleinigkeiten verbessert A. Hamid kiloul akilo 001@yahoo. de
ANTLR plugin für Eclipse ANTLR Dieses Projekt setzt wirksam Eclipse platform ein (v 3. 02 und v 3. 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 akilo 001@yahoo. de
Installation ANTLR Online-Aktualisierungen stehen zur Verfügung auf http: //antlreclipse. sourceforge. net/updates/. 1. Wählen Sie Softwareaktualisierungen-> Fund Installieren Sie vom Hilfe Menü. A. Hamid kiloul akilo 001@yahoo. de
Installation ANTLR 2. Wählen Search for new features to install und drücken Sie auf Next. A. Hamid kiloul akilo 001@yahoo. de
Installation ANTLR 3. Drücken Sie New Remote Site. . . A. Hamid kiloul akilo 001@yahoo. de
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 akilo 001@yahoo. de
Installation ANTLR 5. Drücken Sie auf Finish A. Hamid kiloul akilo 001@yahoo. de
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 akilo 001@yahoo. de
Installation ANTLR 7. Akzeptieren Sie den Lizenzvertrag und drücken Sie Als nächstes Next A. Hamid kiloul akilo 001@yahoo. de
Installation ANTLR 8. Drücken Sie auf Finish A. Hamid kiloul akilo 001@yahoo. de
ANTLR A. Hamid kiloul akilo 001@yahoo. de
ANTLR Optionen A. Hamid kiloul akilo 001@yahoo. de
Einleitung ANTLR bietet verschiedenste Optionen, wie Dateioptionen Grammatikoptionen Optionen für Regeln sowie Kommandozeilenoptionen A. Hamid kiloul akilo 001@yahoo. de
Datei, Grammatik und Regel Optionen ANTLR können direkt in den Quellcode geschrieben werden allgemeiner Aufbau options { k = 2 ; default. Error. Handler = false ; } können Optionen stehen: wo direkt unter dem Header in einer normalen. g-Datei der Grammatik direkt hinter der Defintion des Parsers in einer Regel an folgender Stelle: in myrule[args] returns [retval] options { default. Error. Handler=false; } : // body of rule. . . A. Hamid kiloul akilo 001@yahoo. de
Datei, Grammatik und Regel Optionen (Auswahl) ANTLR language = „Language. Name“ ; zu erzeugende Sprache fest legt möglich Werte sind: Java (Java) Cpp (C++) Csharp (C# ) „Number. Of. Lookahead“ ; k= bestimmt die Anzahl der Lookaheadsymbole maximale Anzahl von Token die bei Alternativen durchsucht d. h. werden außerdem wird nach Ausstiegsbedingungen bei EBNF Konstrukten gesucht A. Hamid kiloul akilo 001@yahoo. de
Datei, Grammatik und Regel Optionen (Auswahl) ANTLR test. Literals = false ; unterdrückt automatische Änderung des Tokentyps build. AST = true ; das Interface für Treeparsing und Treewalking zur stellt Verfügung A. Hamid kiloul akilo 001@yahoo. de
Datei, Grammatik und Regel Optionen (Auswahl) ANTLR analyzer. Debugginginformationen während Grammatikanalyse case. Sensitive Unterdrückt Unterscheidung von Groß- und Kleinschreibung case. Sensitive. Literals ignoriert Groß- und Kleinschreibung beim Vergleich von Token und Litralen warn. When. Follow. Ambig liefert Exception bei leeren Alternativen A. Hamid kiloul akilo 001@yahoo. de
Kommandozeilenoptionen (Auswahl) ANTLR output. Dir -o den Ordner für die Ausgabedateien fest legt -debug öffnet den Parse. View Debugger Parse. View ist separat erhältich -html generiert eine HTML - Datei der Grammatik Funktion ist nur für den Parser A. Hamid kiloul akilo 001@yahoo. de
Kommandozeilenoptionen (Auswahl) ANTLR - docbook –html, nur das eine SGML – Datei erzeugt wird wie - diagnostics erzeugt eine Textdatei der Grammatik mit Debugging Informationen | - help | -- help -h Hilfe - trace | - trace. Lexer | - trace. Parser | - trace. Tree. Parser Ausgabe des Trace für alle oder entsprechenden Teil A. Hamid kiloul akilo 001@yahoo. de
LEXER & PARSER ANTLR LEXER ist nicht als DFA gestaltet. Der beide verwenden LL(k) mit k beliebig aber fest. PARSER versteht sich auf EBNF. Der A. Hamid kiloul akilo 001@yahoo. de
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]+" ; akilo 001@yahoo. de
DFA vs. hand build scanner ANTLR Vorteile hand build scanner (hbs) beschränkt auf die Klasse der regulären Sprachen nicht semantische Aktionen sind möglich DFA´s bestehen aus Integertabellen (schwer zu debuggen) hbs ist schneller als DFA guter kommt mit UNICODE (16 bit) klar A. Hamid kiloul akilo 001@yahoo. de
DFA vs. hand build scanner 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 akilo 001@yahoo. de
Aufbau ANTLR my. Compiler. g HEADER OPTIONS LEXER PARSER TREEWALKER Reihenfolge egal ist Konvention *. g A. Hamid kiloul akilo 001@yahoo. de
HEADER ANTLR Aufbau: header {. . . übernommener code in compiler. . . } muss Zielcode entsprechen Bereich für eigentlichen Compiler der Lexer, guter Parser… nutzt A. Hamid kiloul akilo 001@yahoo. de
LEXER ANTLR Aufbau: {. . . optionaler Zielcode. . . } class My. Lexer extends Lexer; options {. . . Optionen. . . } tokens {. . . optionale Tokendefinitionen. . . } {. . . optionaler klasseninterner Zielcode. . . } A. Hamid kiloul akilo 001@yahoo. de
PARSER ANTLR Aufbau: {. . . optionaler Zielcode. . . } class My. Parser extends Parser; options {. . . Optionen. . . } tokens {. . . optionale Tokendefinitionen. . . } {. . . optionaler klasseninterner Zielcode. . . } A. Hamid kiloul akilo 001@yahoo. de
REGELN ANTLR Tokensektion: tokens { KEYWORD_VOID="void"; Definition von Schlüsselwörtern EXPR; Definition von imaginären Token } A. Hamid kiloul akilo 001@yahoo. de
LEXER & PARSER ANTLR string "for" == 'f' 'o' 'r‘ of file end EOF Zeichen auslassen: WS : ( ' ' | 't' | 'n'| 'r' )+ { $set. Type(Token. SKIP); }; A. Hamid kiloul akilo 001@yahoo. de
LEXER & PARSER ANTLR Aufbau: class My. Parser extends Parser; id. List : ( ID )+; beginnt mit Kleinbuchstabe class My. Lexer extends Lexer; ID : ( 'a'. . 'z' )+ ; beginnt A. Hamid kiloul mit Großbuchstabe akilo 001@yahoo. de
ANTLR Tree Parsing mit ANTLR A. Hamid kiloul akilo 001@yahoo. de
Inhalt ANTLR Einleitung ist ein Treeparser Was Notation Grammatikregeln Transformation und Operatoren Beispiele einfach Rückgabewert A. Hamid kiloul akilo 001@yahoo. de
Einleitung 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 akilo 001@yahoo. de
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 beiden wichtigsten Funktionen sind dabei Die get. First. Child – liefert eine Referenz auf das erste Kind get. Next. Sibling – liefert eine Referenz auf das nächste Kind A. Hamid kiloul akilo 001@yahoo. de
Notation ANTLR Aufbau eines Knotens besteht aus einer Liste mit Kindern „etwas“ Text (z. B. Wert des Variableninhaltes) mit einem Knotentyp und 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 akilo 001@yahoo. de
Notation ANTLR Aufbau eines Knotens besteht aus einer Liste mit Kindern „etwas“ Text (z. B. Wert des Variableninhaltes) mit einem Knotentyp und 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 akilo 001@yahoo. de
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 akilo 001@yahoo. de
Die AST Definition ANTLR public interface AST { public int get. Type(); public void set. Type(int ttype); /** Get the token type for this node */ /** Set the token type for this node */ public String get. Text(); public void set. Text(String text); /** Get the token text for this node */ /**Set the token text for this node */ public AST get. First. Child(); /** Get the first child of this node; null if no children */ public void set. First. Child(AST c); /** Set the first child of a node. */ public AST get. Next. Sibling(); /** Get the next sibling in line after this one */ public void set. Next. Sibling(AST n); /** Set the next sibling after this one. */ public void add. Child(AST c); /**Add a (rightmost) child to this node */ } A. Hamid kiloul akilo 001@yahoo. de
Grammatikregeln für Bäume ANTLR Baumgrammatiken Sammlung von EBNF Regeln Aktionen sowie semantischen und syntaktischen Prädikaten mit rule: alternative 1 | alternative 2 |. . . | alternativen ; alternative Produktion ist zusammengesetzt aus Elementliste: jede (root-token child 1 child 2. . . child n) # Beispiel: Additionsbaum mit zwei Integer Kindern: A. Hamid kiloul # (PLUS INT) akilo 001@yahoo. de
Grammatikregeln für Bäume ANTLR beachte: man 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 akilo 001@yahoo. de
Syntaktische Prädikate ANTLR Treeparsing benutzt Lookahead von k = 1 Möglichkeit unterschiedliche Baumstrukturen zu beschreiben Beschränkung durch den fixen Lookahead umgehen Ziel: Lösung: Syntaktische Prädikate Beispiel: Unterscheidung des unären und binären Minusoperators: expr: ( # (MINUS expr) ) => #(MINUS expr) | # (MINUS expr). . . ; Reihenfolge beachten, da zweite Alternative Teilmenge der ersten ist A. Hamid kiloul akilo 001@yahoo. de
Baumschule - Transformation ANTLR Tree Parse unterstützt build. AST Option Codetransformation wird Eingabebaum zum Ausgabebaum ohne Regel hat implizit einen (automatisch definierten) jede Ergebnisbaum get. AST liefert den Ergebnisbaum der Startregel A. Hamid kiloul akilo 001@yahoo. de
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 akilo 001@yahoo. de
Der “^“ Operator ANTLR Blätter Tokenreferenz sowie jedem Tokenbereich wird ein Blatt jeder zugeordnet Suffixe wird Tokenliste erzeugt und der Baum kopiert ohne Wurzeln Token mit dem Suffix “^“ wird als Wurzelknoten behandelt jeder Token ist Operatorknoten und gleichzeitig auch Wurzel Sinn: eines neuen Teilbaums Beispiel: Eingabe: a : A B^ C^ ; Ergebnisbaum: ? ? A. Hamid kiloul akilo 001@yahoo. de
Der “^“ Operator ANTLR …… Ergebnisbaum: #(C #(B A)) Ergebnisbaum ohne “^“: Liste A B C A. Hamid kiloul akilo 001@yahoo. de
Beispiel ANTLR einfacher Taschenrechner mit folgender Grammatik class Calc. Lexer extends Lexer; WS : (' ' | 't' | 'n' | 'r') { _ttype = Token. SKIP; } ; LPAREN : '(' ; RPAREN : ')' ; STAR: '*' ; PLUS: '+' ; SEMI: '; ' ; INT : ('0'. . '9')+ ; class Calc. Parser extends Parser; options { build. AST = true; / uses Common. AST by default } expr : mexpr (PLUS^ mexpr)* SEMI! ; mexpr : atom (STAR^ atom)* ; atom: INT ; A. Hamid kiloul akilo 001@yahoo. de
Beispiel A. Hamid kiloul ANTLR akilo 001@yahoo. de
Beispiel ANTLR Beispiel: Eingabe 1 * 2 + 3 erzeugt folgenden Baum: A. Hamid kiloul # ( + ( * 1 2 ) 3 ) akilo 001@yahoo. de
Beispiel – mit Rückgabewert Struktur ANTLR muss rekursiv beschrieben werden: class Calc. Tree. Walker extends Tree. Parser; expr : # (PLUS expr) | # (STAR expr) | INT ; class Calc. Tree. Walker extends Tree. Parser; 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. parse. Int(i. get. Text()); } ; A. Hamid kiloul akilo 001@yahoo. de
ANTLR A. Hamid kiloul akilo 001@yahoo. de
Erwähnenswert ANTLR nicht bietet: was Referenzknoten, die nichts weiter tun, als auf andere Knoten zu zeigen A. Hamid kiloul akilo 001@yahoo. de
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 akilo 001@yahoo. de
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(JULY 1995) - http: //www. antlr. org - http: //www. ddj. com/documents/s=905/ddj 9903 h/9903 h. htm A. Hamid kiloul akilo 001@yahoo. de
A. Hamid kiloul akilo 001@yahoo. de
3db888d590340f3cfc901edde1adb602.ppt