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]