1 / 57

Pr. Dr. Weber

Systemprogrammierung. Pr. Dr. Weber. Compiler-Generator ANTLR. A.Hamid kiloul akilo001@yahoo.de. Gliederung. ANTLR. 1. Was ist ANTLR / Geschichte 2. ANTLR plugin für Eclipse / Installation

jena
Download Presentation

Pr. Dr. Weber

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Systemprogrammierung Pr. Dr. Weber Compiler-Generator ANTLR A.Hamid kiloul akilo001@yahoo.de

  2. 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 akilo001@yahoo.de

  3. 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 akilo001@yahoo.de

  4. 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 akilo001@yahoo.de

  5. 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 akilo001@yahoo.de

  6. Installation ANTLR Online-Aktualisierungen stehen zur Verfügung auf http://antlreclipse.sourceforge.net/updates/. • Wählen Sie Softwareaktualisierungen-> Fund und Installieren Sie vom Hilfe Menü. A.Hamid kiloul akilo001@yahoo.de

  7. Installation ANTLR 2. Wählen Search for new features to install und drücken Sie auf Next. A.Hamid kiloul akilo001@yahoo.de

  8. Installation ANTLR 3.Drücken Sie New Remote Site... A.Hamid kiloul akilo001@yahoo.de

  9. 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 akilo001@yahoo.de

  10. Installation ANTLR 5. Drücken Sie auf Finish A.Hamid kiloul akilo001@yahoo.de

  11. 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 akilo001@yahoo.de

  12. Installation ANTLR 7. Akzeptieren Sie den Lizenzvertrag und drücken Sie Als nächstes Next A.Hamid kiloul akilo001@yahoo.de

  13. Installation ANTLR 8. Drücken Sie auf Finish A.Hamid kiloul akilo001@yahoo.de

  14. ANTLR A.Hamid kiloul akilo001@yahoo.de

  15. ANTLR ANTLR Optionen A.Hamid kiloul akilo001@yahoo.de

  16. Einleitung ANTLR 􀂆 ANTLR bietet verschiedenste Optionen, wie 􀂄 Dateioptionen 􀂄 Grammatikoptionen 􀂄 Optionen für Regeln 􀂄 sowie Kommandozeilenoptionen A.Hamid kiloul akilo001@yahoo.de

  17. Datei, Grammatik und Regel Optionen ANTLR 􀂆 Optionen 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 akilo001@yahoo.de

  18. 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 akilo001@yahoo.de

  19. 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 akilo001@yahoo.de

  20. 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 akilo001@yahoo.de

  21. 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 akilo001@yahoo.de

  22. 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 akilo001@yahoo.de

  23. 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 akilo001@yahoo.de

  24. DFA vs. hand build scanner ANTLR 􀂆 Vorteile DFA 􀂄 einfach aus regulären Ausdrücken herzustellen 􀂄 kommen mit Linksrekursion klar: integer : "[0-9]+" ; real : "[0-9]+{.[0-9]*}|.[0-9]+" ; A.Hamid kiloul akilo001@yahoo.de

  25. 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 akilo001@yahoo.de

  26. 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 akilo001@yahoo.de

  27. Aufbau ANTLR myCompiler.g HEADER OPTIONS LEXER PARSER TREEWALKER 􀂆 Reihenfolge egal 􀂆 *.g ist Konvention A.Hamid kiloul akilo001@yahoo.de

  28. HEADER ANTLR 􀂆 Aufbau: header { ...übernommener code in compiler... } 􀂆 muss Zielcode entsprechen 􀂆 guter Bereich für eigentlichen Compiler der Lexer, Parser… nutzt A.Hamid kiloul akilo001@yahoo.de

  29. LEXER ANTLR 􀂆 Aufbau: { ...optionaler Zielcode... } class MyLexer extends Lexer; options { ...Optionen... } tokens { ...optionale Tokendefinitionen... } { ...optionaler klasseninterner Zielcode... } A.Hamid kiloul akilo001@yahoo.de

  30. PARSER ANTLR 􀂆 Aufbau: { ...optionaler Zielcode... } class MyParser extends Parser; options { ...Optionen... } tokens { ...optionale Tokendefinitionen... } { ...optionaler klasseninterner Zielcode... } A.Hamid kiloul akilo001@yahoo.de

  31. REGELN ANTLR 􀂆 Tokensektion: tokens { KEYWORD_VOID="void"; 􀂆 Definition von Schlüsselwörtern EXPR; 􀂆 Definition von imaginären Token } A.Hamid kiloul akilo001@yahoo.de

  32. LEXER & PARSER ANTLR 􀂆 string "for" == 'f' 'o' 'r‘ 􀂆 end of file EOF 􀂆 Zeichen auslassen: WS : ( ' ' | '\t' | '\n'| '\r' )+ { $setType(Token.SKIP); }; A.Hamid kiloul akilo001@yahoo.de

  33. LEXER & PARSER ANTLR 􀂆 Aufbau: class MyParser extends Parser; idList : ( ID )+; 􀂄 beginnt mit Kleinbuchstabe class MyLexer extends Lexer; ID : ( 'a'..'z' )+ ; 􀂄 beginnt mit Großbuchstabe A.Hamid kiloul akilo001@yahoo.de

  34. ANTLR Tree Parsing mit ANTLR A.Hamid kiloul akilo001@yahoo.de

  35. Inhalt ANTLR Einleitung 􀂆 Was ist ein Treeparser 􀂆 Notation 􀂆 Grammatikregeln 􀂆 Transformation und Operatoren 􀂆 Beispiele 􀂄 einfach 􀂄 Rückgabewert A.Hamid kiloul akilo001@yahoo.de

  36. 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 akilo001@yahoo.de

  37. 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 akilo001@yahoo.de

  38. 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 akilo001@yahoo.de

  39. 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 akilo001@yahoo.de

  40. 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 akilo001@yahoo.de

  41. Die AST Definition ANTLR 􀂄 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 */ } A.Hamid kiloul akilo001@yahoo.de

  42. 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: 􀂄 # (PLUS INT INT) A.Hamid kiloul akilo001@yahoo.de

  43. 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 akilo001@yahoo.de

  44. 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 akilo001@yahoo.de

  45. 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 akilo001@yahoo.de

  46. 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 akilo001@yahoo.de

  47. 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 akilo001@yahoo.de

  48. Der “^“ Operator ANTLR …… 􀂆 Ergebnisbaum: #(C #(B A)) 􀂆 Ergebnisbaum ohne “^“: Liste A B C A.Hamid kiloul akilo001@yahoo.de

  49. 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 akilo001@yahoo.de

  50. Beispiel ANTLR A.Hamid kiloul akilo001@yahoo.de

More Related