Java Compiler Compiler (JavaCC)
Java Compiler Compiler (JavaCC)
Java Compiler Compiler (JavaCC)
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Java</strong> <strong>Compiler</strong> <strong>Compiler</strong><br />
(<strong>Java</strong>CC)<br />
Andreas Kunert
Überblick über den Vortrag<br />
1. Überblick über <strong>Java</strong>CC<br />
2. einführendes Beispiel<br />
3. lexikalische Analyse<br />
4. syntaktische Analyse<br />
5. semantische Aktionen<br />
6. Syntaxbaumgenerierung (JJTree)<br />
7. Fragen<br />
24. April 2003 2 / 28
1. Überblick über <strong>Java</strong>CC<br />
24. April 2003 Überblick 3 / 28
Eigenschaften von <strong>Java</strong>CC (1)<br />
• Scanner- und Parsergenerator in/für <strong>Java</strong><br />
• erzeugt LL(k)-Parser (rekursiver Abstieg)<br />
• mittels Präprozessor Syntaxbaumkonstruktion möglich (JJTree)<br />
• Dokumentationswerkzeug enthalten (JJDoc)<br />
24. April 2003 Überblick 4 / 28
Eigenschaften von <strong>Java</strong>CC (2)<br />
• <strong>Java</strong>CC ist selbst in <strong>Java</strong>CC implementiert worden<br />
• unterstützt Unicode<br />
• Parsergenerator versteht EBNF<br />
• sehr gute Debuggingmöglichkeiten<br />
• exzellente Fehlerbehandlung<br />
(sowohl in <strong>Java</strong>CC als auch in den generierten <strong>Compiler</strong>n)<br />
• ”<br />
100% Pure <strong>Java</strong>“-zertifiziert<br />
• bewegte Geschichte (Suntest, Metamata, Webgain, Sunlabs)<br />
24. April 2003 Überblick 5 / 28
Informationen<br />
• Webseite:<br />
www.experimentalstuff.com/Technologies/<strong>Java</strong>CC<br />
• Newsgroup:<br />
comp.compilers.tools.javacc<br />
• Mailing List:<br />
www.experimentalstuff.com/Technologies/<strong>Java</strong>CC/mailinglist.html<br />
javacc-interest@experimentalstuff.com<br />
• FAQ:<br />
http://www.engr.mun.ca/~theo/<strong>Java</strong>CC-FAQ<br />
• Repository of <strong>Java</strong>CC Grammars:<br />
www.cobase.cs.ucla.edu/pub/javacc<br />
24. April 2003 Überblick 6 / 28
2. Einführendes Beispiel<br />
24. April 2003 Einführung 7 / 28
Anwendung von <strong>Java</strong>CC<br />
1. Mein<strong>Compiler</strong>.jj erzeugen (vim ;-)<br />
2. javacc Mein<strong>Compiler</strong>.jj<br />
(generiert Scanner, Parser und diverse Hilfsdateien)<br />
3. javac Mein<strong>Compiler</strong>.java<br />
4. java Mein<strong>Compiler</strong><br />
(wenn Parser direkt startbar)<br />
24. April 2003 Einführung 8 / 28
Aufbau einer .jj-Datei (formal)<br />
javacc_input ::= [ "options" "{" (option)+ "}" ]<br />
"PARSER_BEGIN" "(" ")"<br />
java_compilation_unit<br />
"PARSER_END" "(" ")"<br />
( production )*<br />
<br />
24. April 2003 Einführung 9 / 28
Aufbau einer .jj-Datei<br />
options{<br />
LOOKAHEAD = 1;<br />
...<br />
}<br />
PARSER_BEGIN(MeinParser)<br />
public class MeinParser {<br />
public static void main(String argv[]) {...}<br />
}<br />
PARSER_END(MeinParser)<br />
... // Scanner- und Parserregeln<br />
24. April 2003 Einführung 10 / 28
Beispiel<br />
• MyCalc.jj<br />
” handcompiliert“<br />
24. April 2003 Einführung 11 / 28
3. Die lexikalische Analyse<br />
24. April 2003 Lexikalische Analyse 12 / 28
Tokenaktionen<br />
• TOKEN<br />
Token werden ganz normal an Parser weitergegeben<br />
• SKIP<br />
Token werden ignoriert<br />
• MORE<br />
bisher gelesene Zeichen werden gepuffert und lexikalische Analyse<br />
fortgeführt<br />
• SPECIAL_TOKEN Token werden ”<br />
asynchron“ an Parser weitergegeben<br />
24. April 2003 Lexikalische Analyse 13 / 28
Aufbau einer Lexikregel (formal)<br />
regular_expr_production ::= [ lexical_state_list ]<br />
( "TOKEN"<br />
| "SKIP"<br />
| "SPECIAL_TOKEN"<br />
| "MORE" )<br />
[ "[" "IGNORE_CASE" "]" ]<br />
":"<br />
"{" regexpr_spec ("|" regexpr_spec)* "}"<br />
24. April 2003 Lexikalische Analyse 14 / 28
Aufbau einer Lexikregel (formal)<br />
regexpr_spec ::= regular_expression<br />
[ java_block ]<br />
[ ":" java_identifier ]<br />
regular_expression ::= java_string_literal<br />
| ""<br />
| ""<br />
| ""<br />
24. April 2003 Lexikalische Analyse 15 / 28
Beispiel<br />
• XScanner.jj<br />
24. April 2003 Lexikalische Analyse 16 / 28
4. Die syntaktische Analyse<br />
24. April 2003 Syntaktische Analyse 17 / 28
Eigenschaften des Parsers<br />
• LL(k) – mit k beliebig, aber fest<br />
• local-lookaheads möglich<br />
• Prinzip rekursiver Abstieg<br />
• Erweiterte BNF<br />
24. April 2003 Syntaktische Analyse 18 / 28
Rekursiver Abstieg<br />
programm =<br />
”PROGRAM” bezeichner ”;” block ”.”.<br />
block =<br />
[ konstantendefinitionsteil ] [ typendefinitionsteil ]<br />
[ variablendeklarationsteil ] [ prozedurdeklarationsteil ]<br />
”BEGIN” verbundanweisung ”END”.<br />
public void program() {<br />
nextSymbol();<br />
testFor (PROGRAMSY);<br />
testFor (IDENT);<br />
testFor (SEMICOLON);<br />
block ();<br />
testFor (PERIOD);<br />
}<br />
private void block () {<br />
if ( testIf (CONSTSY)) constantdefinitionpart();<br />
if ( testIf (TYPESY)) typedefinitionpart ();<br />
if ( testIf (VARSY)) vardeclarationpart ();<br />
if ( testIf (PROCEDURESY)) proceduredeclaration();<br />
testFor (BEGINSY);<br />
statseq ();<br />
testFor (ENDSY);<br />
}<br />
24. April 2003 Syntaktische Analyse 19 / 28
Aufbau einer Grammatikregel<br />
void metasymbol()<br />
{<br />
... // Code der am Anfang der Methode steht<br />
}<br />
{<br />
{ ... }<br />
| { ... }<br />
| ( | ) { ... }<br />
| [ ] { ... }<br />
| ( )? { ... }<br />
| ( )+ { ... }<br />
| ( )* { ... }<br />
}<br />
24. April 2003 Syntaktische Analyse 20 / 28
Beispiel<br />
• CopCow.jj<br />
(mit verschiedenen Lookaheads)<br />
24. April 2003 Syntaktische Analyse 21 / 28
5. Semantische Aktionen<br />
24. April 2003 Semantische Aktionen 22 / 28
Einbau von semantischen Aktionen<br />
• an (nahezu) beliebiger Stelle in Lexik-/Grammatikregeln<br />
• nur <strong>Java</strong> 1.2-Syntax möglich (keine Assertions)<br />
• beliebige Rückgabetypen<br />
• Methodenköpfe können frei definiert werden<br />
24. April 2003 Semantische Aktionen 23 / 28
Beispiel<br />
• MyCalc2.jj<br />
24. April 2003 Semantische Aktionen 24 / 28
6. Syntaxbaumkonstruktion mit JJTree<br />
24. April 2003 JJTree 25 / 28
Geänderter Erstellungsablauf<br />
• Mein<strong>Compiler</strong>.jjt erzeugen (vim ;-)<br />
• jjtree Mein<strong>Compiler</strong>.jjt<br />
(generiert Knotenklassen und <strong>Java</strong>CC-Quelldatei)<br />
• javacc Mein<strong>Compiler</strong>.jj<br />
(generiert Scanner, Parser und diverse Hilfsdateien)<br />
• javac Mein<strong>Compiler</strong>.java<br />
• java Mein<strong>Compiler</strong><br />
(wenn Parser direkt startbar)<br />
24. April 2003 JJTree 26 / 28
Beispiel<br />
• MyCalc3.jj<br />
• Minako<br />
24. April 2003 JJTree 27 / 28
7. Fragen ???<br />
24. April 2003 28 / 28