14.01.2014 Aufrufe

Java Compiler Compiler (JavaCC)

Java Compiler Compiler (JavaCC)

Java Compiler Compiler (JavaCC)

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!