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]