arvostelija JavaCC Petri Kärki Helsinki 15. huhtikuuta 2005 Seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Samankaltaiset tiedostot
815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

12. Näppäimistöltä lukeminen 12.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

4. Luokan testaus ja käyttö olion kautta 4.1

8. Näppäimistöltä lukeminen 8.1

14. Poikkeukset 14.1

8. Näppäimistöltä lukeminen 8.1

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

5. HelloWorld-ohjelma 5.1

14. Poikkeukset 14.1

uv n, v 1, ja uv i w A kaikilla

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

Jäsennysalgoritmeja. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 29. syyskuuta 2009 TIETOTEKNIIKAN LAITOS. Jäsennysalgoritmeja

Metodien tekeminen Javalla

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

11. Javan valintarakenteet 11.1

7. Näytölle tulostaminen 7.1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet, syksy 2006

11.4. Context-free kielet 1 / 17

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

5. HelloWorld-ohjelma 5.1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Yhteydettömät kieliopit [Sipser luku 2.1]

Ohjelmointi 2 / 2010 Välikoe / 26.3

Taulukot. Jukka Harju, Jukka Juslin

9. Periytyminen Javassa 9.1

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 29. huhtikuuta 2011

(0 1) 010(0 1) Koska kieli on yksinkertainen, muodostetaan sen tunnistava epädeterministinen q 0 q 1 q 2 q3

Poikkeustenkäsittely

11. Javan valintarakenteet 11.1

15. Ohjelmoinnin tekniikkaa 15.1

S BAB ABA A aas bba B bbs c

Ohjelmoinnin perusteet Y Python

15. Ohjelmoinnin tekniikkaa 15.1

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Attribuuttikieliopit

Ohjelmoinnin perusteet Y Python

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Java-kielen perusteita

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Javan perusteita. Janne Käki

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

7. Oliot ja viitteet 7.1

Java-kielen perusteet

Sisältö. 2. Taulukot. Yleistä. Yleistä

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. lokakuuta 2016

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Ohjelmoinnin perusteet Y Python

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Rajapinta (interface)

1. Omat operaatiot 1.1

13. Loogiset operaatiot 13.1

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

16. Javan omat luokat 16.1

Harjoitus 2 (viikko 45)

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 16. helmikuuta 2012

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteita

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. kesäkuuta 2013

Ohjelmoinnin jatkokurssi, kurssikoe

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Ohjelmoinnin peruskurssi Y1

17. Javan omat luokat 17.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Ohjelmoinnin peruskurssi Y1

Luokat ja oliot. Ville Sundberg

M =(K, Σ, Γ,, s, F ) Σ ={a, b} Γ ={c, d} = {( (s, a, e), (s, cd) ), ( (s, e, e), (f, e) ), (f, e, d), (f, e)

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

T Syksy 2002 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

follow(a) first(α j ) x

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Tietotekniikan valintakoe

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Transkriptio:

hyväksymispäivä arvosana arvostelija JavaCC Petri Kärki Helsinki 15. huhtikuuta 2005 Seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Sisältö i 1 Johdanto 1 2 JavaCC 1 2.1 Selaaja................................... 2 2.2 Jäsentäjä.................................. 3 2.3 Syötetiedoston rakenne.......................... 4 2.4 Tuotettavat tiedostot........................... 7 2.5 JJTree sekä JJDoc.............................. 8 3 Yhteenveto 9 Lähteet 10

1 Johdanto 1 JavaCC on jäsentäjä/selaaja generaattori Javalle. Sen loivat Sreeni Viswanadha ja Sriram Sankar työskennellessään Sunilla. JavaCC lähdekoodi on vuodesta 2003 ollut kaikkien saatavilla ja JavaCC:n kehitystä jatketaan kaiken aikaa. Kehitystyössä ovat mukana myös JavaCC:n alkuperäiset tekijät. Jäsentäjän tehtävä on lukea syötevirtaa ja päätellä noudattaako annettu syöte kielioppia. Jäsentäjä generaattori ohjelmien tarkoitus on tehdä ohjelmointikielten toteutuksesta helpompaa. JavaCC lukee annetun kielen kielioppi spesifikaation ja muuntaa sen Java ohjelmaksi joka pystyy tunnistamaan kyseisen kieliopin mukaiset ohjelmat. Erityisesti hyödyllinen JavaCC on silloin jos kielen rakenne on monimutkainen, tällöin kielen tunnistavan selaajan tekeminen käsin sattaa olla vaikeaa. JavaCC toimii kaikissa järjestelmissä missä on Java 1.1 tai uudempi versio. Viimeisin versio JavaCC ohjelmasta kirjoitushetkellä oli 3.2. JavaCC:n avulla on luotu jäsentäjiä mm Visual Basicille, SQL:lle,HTML:lle, Pythonille, C:lle, C++:lle ja Javalle [Nor05, jcc05]. 2 JavaCC JavaCC on lyhenne sanoista Java Compiler Compiler(kääntäjän kääntäjä). JavaCC luo siis jäsentäjän annetun kieliopin pohjalta. JavaCC ei laadi automaattisesti symbolitaulua tai rakenna jäsennyspuuta vaan nämä on ohjelmoitava käsin. JavaCC saa syötteenä jj päätteisen kielioppi tiedoston. Tämän pohjalta se luo joukon Java tiedostoja. Nämä tiedostot on käännettävä että saataisiin aikaan jäsentäjä. Kielioppi tiedosto sisältää neljän tyyppisiä produktioita. Javakoodi produktiot ja EBNF produktiot määrittelevät kieliopin mistä jäsentäjä generoidaan. Säännöl-

2 linen lauseke produktiot määrittelevät kieliopin merkkijonoalkiot. Säännöllinen lauseke produktioiden avulla generoidaan selaaja. Selaaja esittelyt ovat produktioita joiden avulla voidaan laatia esittelyitä jotka liitetään generoituun selaajaan[nor05, jcc05]. 2.1 Selaaja Selaaja analysoi syötevirran ja jakaa sen osiksi joita sanotaan merkkijonoalkioiksi. Selaaja määrää jokaiselle luetulle alkiolle alkiotyypin. Merkkijonoalkiot ovat joko yksinkertaisia merkkijonoja tai monimutkaisempia alkioita kuten esim <EOF>. Monimutkaisemmat alkiot ympäröidään aina < sekä > merkeillä. Alkiotyyppi voi olla esim LPAR,ID SEMICOLON jne. Jokainen alkio esitetään luokan Token ilmentymänä, jolla on ominaisuuksina muuttuja kind joka sisältää alkion tyypin koodattuna kokonaisluvuksi sekä muuttuja image jokasisältää alkion merkkijonoesityksen. Lisäksi Token luokka sisältää atribuuteja jotka sisältävät paikkainformaatiota sekä osoittimen seuraavan merkkijonoalkioon. Jos useampi kuin yksi säännöllinen lause tunnistaa merkkijonon valitaan niistä se sääännöllinen lause joka tunnistaa pisimmäm luettujen merkkien merkkijonoalkion (maximal munch rule). JavaCC:n generoima selaaja luokka tarjoaa yhden julkisen metodi getnext- Token(). Selaajan spesifikaatio annetaan joukkona säännöllisiä lausekkeita. Rakenteita jotka voivat esiintyä säännöllisessä lausekkeessa ovat yksittäinen merkki, kahden säännöllisen lausekkeen katenaatio, säännöllinen lauseke jonka edessä on kleenen plus joka merkitsee yhtä tai useampaa plusmerkin edessä olevan lausekkeen ilmentymää ilmentymää, kaksi säännöllistä lauseketta erotettuna pystyviivalla joka merkitsee joko ensimmäistä tai toista säännöllistä lauseketta lisäksi vielä tyhjä merkkijono. Esimerkkejä merkintätavasta JavaCC:ssä

3 (r)+ yksi tai useampi r [ c, A Z ] pieni c tai isokirjain [ a, b ] mikä tahansa muu merkki kuin a tai b (r)? r on valinnainen (r1 r2 r3) joko r1, r2 tai r3. { tyhjä merkkijono Selaaja pystyy käsittelemään UNICODE tyyppistä syötettä ja leksikaalinen spesifikaatio voi sisältää unicode merkkejä. Leksikaalisessa spesifikaatiossa voidaan määritellä kuinka isot ja pienet kirjaimet tulkitaan. Säännöllisistä lausekkeista JavaCC laatii niitä vastaavan äärellisen automaatin joka toimii selaajan runkona. Selaajalla voidaan määritellä joukko suorituksen aikaisia tiloja. Jokaisella tila on nimetty tunnisteen avulla. Selaajan käynnistyessä on se oletusarvoisesti tilassa DEFAULT. Selaajan on mahdollista muuttaa leksikaalista tilaansa suorituksen aikana siten että käytössä olevien säännöllisten lausekkeiden joukko vaihtuu. Kun selaaja huomaa virheen esimerkiksi tuntemattoman merkkijonoalkion se aiheuttaa poikkeuksen TokenMgrError[Nor05, jcc05]. 2.2 Jäsentäjä Jäsentäjä lukee selaajan tuottaman merkkijonoalkio jonon ja tarkistaa että sen rakenne vastaa annettua kielioppia. Jäsentäjä ei tuota automaattisesti mitään tulostetta. Käyttäjä voi kuitenkin helposti muokata JavaCC:n tuottamaan halutunlaisen tulosteen syötteenä saadusta merkkijonoalkio jonosta, lisäämällä produktioiden yhteyteen Javakoodia. Tämä voi olla vaikka abstrakti syntaksipuu, luku,

4 asembler tiedosto tai vaikka syötteenä saatu alkio jono hieman muokattuna. Jäsentäjään pitää lisätä käsin kaikki semanttinen toiminta. JavaCC käyttää ylhäältä alas(top-down) eli rekursiivista jäsennystä. Tästä johtuen JavaCC:n kielioppien säännöt ovat joustavammat kuin jos käytettäisiin ylhäältä alas (bottom-up) menetelmää. Rekursiivinen jäsennys mahdollistaa jäsentäjän helpomman testauksen, antaa mahdollisuuden jäsentää mikä tahansa välikesymboli sekä mahdollistaa atribuuttien siirron ylös sekä alas jäsennyspuussa jäsennyksen aikana. Oletusarvoisesti JavaCC luo LL(1) jäsentäjän. Jos annettu kielioppi ei ole täysin LL(1) muodossa JavaCC ennakoida sovellettavan produktion näissä kohdissa. Jäsentäjä on siis näissä kohdissa LL(k) mutta muualla pysyy LL(1) jäsentäjänä suorituskyvyn parantamiseksi. Kieliopin produktioiden esittämiseen JavaCC käyttää EBNF-muotoa. Produktioiden vasemmat puolet voivat sisältää seuraavia rakenteita e1 e2 e3... joko e1 tai e2 tai e3 jne, [e] tai (e)? tarkoittaa että e on valinnainen, (e)+ yksi tai useampi e, (e)*nolla tai useampi e. Rakenteet voivat olla sisäkkäisiä esim ((e1 e2)+ (e3)?)*. Tämän lisäksi on mahdollista liittää säännöllisiä lausekkeita suoraan produktioihin. JavaCC generoi metodin jokaista kieliopin produktiota kohti. Kun jäsentäjä huomaa virheen se heittää ParseError poikkeuksen[nor05, jcc05]. 2.3 Syötetiedoston rakenne Syötteenä saatava kielioppitiedosto sisältää annetun kielen kielioppi spesifikaation. Alla on esimerkiksi otetun Simple3.jj tiedoston sisältö.simple3 tunnistaa kaikki merkkijonot jotka koostuvat joukosta vasemmanpuoleisia aaltosulkeita joita seuraa samanverran oikeanpuoleisia aaltosulkeita. //JavaCC:n suoritukseen vaikuttavat optiot options {

5 LOOKAHEAD = 1; CHOICE_AMBIGUITY_CHECK = 2; STATIC = true; DEBUG_PARSER = false; SANITY_CHECK = true; //käännösyksikkö ei ole pakko olla main metodia PARSER_BEGIN(Simple3) //luokka jonka nimen JavaCC:n generoimat tiedostot saavat public class Simple3 { public static void main(string args[]) throws ParseException { // luodaan jäsentäjä joka lukee syötteen stdin virrasta Simple3 parser = new Simple3(System.in); parser.input(); //aletaan jäsentää välikkeestä input PARSER_END(Simple3) //ylitsehypättävien merkkijoalkioiden määrittely SKIP : { " " "\t" "\n" "\r" //merkkijonoalkion määrittely TOKEN :

6 { <LBRACE: "{"> <RBRACE: ""> void Input() : { int count; { count=matchedbraces() <EOF> { System.out.println("The levels of nesting is " + count); //välikettä vastaavan metodin esittely int MatchedBraces() : //muuttujien esittely { int nested_count=0; { //produktion oikea puoli <LBRACE> [ nested_count=matchedbraces() ] <RBRACE> //suoritettava java lause { return ++nested_count; Syötteenä saatava tiedosto koostuu optio osasta joka voi sisältää yhden tai useampia Javacc generaattorin toimintaa ohjaavia optioita. Ylläolevassa esimerkissä optioita ovat esim LOOKAHEAD = 1 sekä STATIC = true. Optioita voi antaa JavaCC:lle myös komentoriviltä. Komentoriviltä annetut optiot ohittavat kielioppi tiedostossa annetut optiot. Optioita seuraa java käännösyksikkö joka sijaitsee PARSER_BEGIN(name) ja PAR- SER_END(name) lauseiden välissä. Ainut käännösyksikölle asetettu ehto on että

7 sen tulee määritellä nimetty luokka. Luokan nimeä käytetään etuliitteenä jäsentäjä generaattorin luomille Java tiedostoille. Käännösyksikköä seuraavat Leksikaaliset määrittelyt näitä ovat SKIP,TOKEN, SPECIAL_TOKEN sekä MORE. SKIP kertoo säännölliset lausekkeet jotka selaajan tulee ohittaa. TOKEN määrää säänölliset lausekkeet kielen merkkijonoalkioille. SPECIAL_TOKEN kertoo ne merkkijoalkiot jotka jätetään huomiotta jäsennyksen aikana. Näitten alkioiden ero SKIP kohdassa määriteltyihin alkioihin on se että näihin on mahdollista päästä käsiksi myöhemmin. SPECIAL_TOKEN on käytännöllinen esimerkiksi kommenttien käsittelyssä. MORE määrittelee merkkijonoalkion osa-alkion. Merkkijoalkio koostuu jonosta MORE alkioita joita seuraa TOKEN tai SPECIAL_TOKEN. MORE tarkoittaa siis että kaikki siihen mennessä luetut merkit kuuluvat johonkin seuraavaksi tunistettavaan merkkijonoalkioon. Tämän jälkeen seuraa lista produktioita jotka sisältävät ohjelmointikielen kieliopin. Jokainen produktio koostuu vasemmalla olevasta välisymbolia vastaavan metodin määrittelystä jota seuraa kaksoispiste. Kaksoispisteen jälkeen voi seurata joukko Java muuttujien esittelyjä. Kaksoispisteen ja esittelyjen jälkeen produktiossa seuraa kyseisestä välikesymbolista johdettavien merkkijonojen joukko aaltosulkeiden sisällä. Lisäksi produktio voi sisältää Java lauseita aaltosulkeitten sisällä. Nämä lauseet ja esittelyt lisätään JavaCC generattorin luomaan metodiin[jcc05]. 2.4 Tuotettavat tiedostot JavaCC tuottaa oletusarvoisesti seuraavat tiedostot. JavaCC ei tarkista näiden tiedostojen Java koodin virheettömyyttä, joten näissä tiedostoissa saatta olla virheitä jotka Java kääntäjä vasta huomaa. Seuraavia neljää tiedostoa ei luoda jos ne

8 ovat jo olemassa. SimpleCharStream.java (luokka esittää luettavien merkkien virtaa) Token.java (luokka esittää yhtä merkkijonoalkiota) TokenMgrError.java (selaajan antama virhe) ParseException.java (poikkeus joka kertoo että syöte ei ollut jäsentäjän kieliopin mukainen) Näitten lisäksi generoidaan vielä seuraavat tiedostot. XXX.java (jäsentäjä luokka) XXXTokenManager.java (selaaja luokka) XXXConstants.java (rajapinta joka liittää Token luokkiin symboliset nimet) Tässä XXX paikalla on syötetiedoston sisältämässä käännösyksikössa annettu luokan nimi. Esimerkkinä ollut Simple3.jj tuottaisi tiedostot joiden nimet olisivat Simple3.java,Simple3TokenManager ja Simple3Constants.java. Näistä tiedostoista SimpleCharStreamjavan tilalla voi olla Charstream.java jos syötetiedostossa käytettiin JAVA_UNICODE_ESCAPE optiota. Lisäksi jos käyttäjä halusi tehdä itse selaajan XXXTokenManager.javan rajapinta luokka TokenManager.java [Nor05]. 2.5 JJTree sekä JJDoc JavaCC:n mukana tulee kaksi hyödyllistä apuohjelmaa JJTree sekä JJDoc. JJTree on jäsennyspuun rakentaja ja se on mukana JavaCC distribuutiossa. Syötteenä saamastaan jjt päätteisestä tiedostosta JJTree luo jj päätteisen syötetiedoston JavaCC generaattorille. Tämän syötetiedosto tuottaa selaajan joka tuottaa annetus-

9 ta syötteestä jäsennyspuun. Vaikka JavaCC käyttää rekursiivista jäsentäjää rakentaa JJTree jäsennyspuun alhaalta ylös. Se käyttää pinoa apuna jäsennyspuun rakentamisessa. JavaCC:lle on saatavana JTB niminen käyttäjäystävällisempi jäsennyspuunrakentaja se ei kuitenkaan ole niin tehokas kuin JJTree. JJDoc ohjelman avulla voidaan halutusta kieliopista laatia dokumentaatio. JJDoc ohjelmalle voidaan antaa käskyriviltä optiot joista riippu tulostetaanko dokumentaatio tekstitiedostoksi vaiko HTML tiedostoksi [jcc05]. 3 Yhteenveto JavaCC on jäsentäjä generaattori Javalle. JavaCC on myös käytetyin jäsentäjä generaattori Javalle. Jäsentäjägeneraattorin käyttö on suositeltavaa jos kieli jolle jäsentäjää laaditaan on monimutkainen. Vuodesta 2003 lähtien JavaCC:n lähdekoodi on kaikkien käytettävissä ja sitä kehitetään koko ajan. JavaCC saa syötteenään jj päätteisen tiedoston joka sisältää kaiken selaajan ja jäsentäjän luomiseen tarvittavan informaation. Tämän tiedon avulla JavaCC luo joukon java tiedostoja jotka sisältävät selaajan sekä jäsentäjän lähdekoodin. Kääntämällä nämä tiedostot saadan toimiva selaaja. JavaCC ohjelmapakkauksessa on mukana Java kielen kielioppi jonka avulla voi tehdä uusi ohjelmointityökaluja Javalle. JJTree ohjelman avulla voidaan tuottaa tulosteena puurakenne jäsennettäessä ohjelmaa. JJ- Doc ohjelman avulla voidaan halutusta kieliopista laatia HTML dokumentaatio [jcc05].

Lähteet 10 jcc05 JavaCC Home, https://javacc.dev.java.net/doc/. [15.4.2005] Nor05 Norvell Theodore, The JavaCC FAQ, http://www.engr.mun.ca/ ~theo/javacc-faq/javacc-faq.htm. [15.4.2005]