Muid translaatorite genereerimise süsteeme

Lex ja yacc olid esimesed leksika ja süntaksianalüsaatorite automaatse genereerimise programmid ja kuna nad on UNIX-i systeemi osad, on nad seda tüüpi programmidest kõige tuntumad. Kui lex ja yacc muutusid kommertsprogrammideks, loodi Vaba Tarkvara Assotsiooni poolt lex-i ja yacci vabad versioonid Flex ja Bison, kuid nende eeskujul on loodud palju muidki (vähemalt paarkümmend) translaatorite genereerimise süsteeme.

Põhijoontes sarnanevad translaatorite genereerimise süsteemid lex-i ja jacc-iga, erinevused on süntaksi kirjeldamiseks lubatud grammatika klassis (enamuse lubab LL(1) või LR(1) -grammatikat), sisendkeeeles (formaadis) ja semantiliste tegevuste tegevuste kirjeldamise keeles (see keel määrab ka väljundi, s.t. genereeritud translaatori keele); järgnevas on loetletud vaid tuntumad.

Antlr - (ANother Tool for Language Recognition) - Therence Parri poolt Purdue ülikoolis 1988 aastal tehtud dipalomitööst alanud projekt muutus pärast selle avaldamist uudisrühmas comp.compilers paljude osavõtjatega vabavara (opensource) projektiks; interpretaatorite ja translaatorite kirjutamise vahend, milles semantilised tegevused saab kirjeldada kas Java-s, C#-s,i C++ -s, Pythonis (samas keeles genereeritakse ka translaator). Praegune versioon 3.0 lubab kasutada LL(*) grammatikaid, s.t. vajaduse korral suurendab süsteem ise ettevaatamiskonstanti (look-ahead).

ALE - (Attribute-Logic Engine) - Toronto Ülikoolis arendatud Prologi-s (Swi-Prolog, SICStus-Prolog) realiseeritud translaatorite genereerimise pakett, milles semantika kirjeldatakse attribuutgrammatikaga; head silumisvahendid ja kiire;

JavaCC - Java abil realiseeritud translaatorite genereerimise pakett (Compiler Compiler)

Grammatica - parserite (compiler compiler) generaator C# ja Java jaoks; väidab, et väljastatud translaator on paremini kommenteeritud ja loetavam kui vastav yacc-i või Antlr-i toode; automaatne vigadest üle saamine (error recovery) ja ükssikasjalikud veateated, mis lihtsustavad grammatika silumist (debugging); lubab kasutada LL(k) grammatikaid suvalise k jaoks.

PRECC - A PREttier Compiler-Compiler

Accent Compiler Compiler - kirjutatud Java-s, kasutab süntaksianalüüsil algoritmi, mis suudab analüüsida igasuguseid (s.t. ilma kitsendusteta) kontekstivabasid grammatikaid (kuid see teeb analüüsi aeglasemaks, selles kasutatud Earle'i algoritmi töökiirus on n3); lubab kasutada ka LL(k) ja LR grammatikaid (siis on analüüs kiirem) .

Coco/R (Compiler-Compiler/Recursive) - Austrias Linzi ülikoolis 1989-1990 loodud translaatorite genereerimise süsteem, väga süsteemikindla ja arusaadava sisendkeelega süsteem, järgnevas on väike näide sisendist (kümnend- ja kuueteistkümnendsüsteemis kirjutatud arvudega opereeriv kalkulaator):

COMPILER Calculator

CHARACTERS
digit = "0123456789" .
hexdigit = digit + "ABCDEF" .

IGNORE CHR(1) .. CHR(31)

TOKENS
decNumber = digit { digit } .
hexNumber = "$" hexdigit { hexdigit } .

PRODUCTIONS
Calculator = { Expression "=" } .
Expression = Term { "+" Term | "-" Term } .
Term = Factor { "*" Factor | "/" Factor } .
Factor = decNumber | hexNumber .

END Calculator.

Nagu ülalesitatud näitest näha, esitatakse CocoL lekseemid (TOKENS) regulaarsete avaldistega, kuid sisendtähestiku CHARACTERS võib liigitada alamklassideks (digit, hexdigit) ja sisendist välja jäetavad (ignoreeritavad) sümbolid loetletakse otse alamjaotuses IGNORE (Antlr-is kasutatakse semantilist operaatorit $setType(Token.SKIP)).

Paljud translaatorite genereerimise süsteemidest sisaldavad peale leksika- ja süntaksianalüüsi vahendeid ka teiste translaatoritega seotud probleemide jaoks:

VPO ( Very portable Optimizer) - globaalne väljundkoodi optimiseerija ja teisendaja, mida on kasutatud mitme tööstusliku translaatori tegemisel;

VISUALPARSE++ - esitab leksika- ja süntaksianalüüsi graafiliselt, nii et neid tehnoloogiaid saab interaktiivselt õppida

jne.

Litsenssidest. Enamus ülalesitatud tarkvaraprojektidest on alguse saanud ülikoolide kursuse-, diplomi- jne töödest ja on vabad, s.t. nende litsenss on mingi vaba (tasuta) kasutamisõiguse andev litsenss: kas GNU GPL (Gnu Public Licence), GNU LGPL (Lesser/Library Gnu Public Licence), kunstilitsenss (Artistic Licence, ver. 1.0 ja 2.0), akadeemiline avaliku kasutamise litsenss (Academic Public Licence), vaba lähtekoodi litsenss (Open Source Licence), Apache litsenss (Apache licence) või mõni teine mitte-kaubanduslik litsenss. Erinevused nende litsensside vahel on (näiteks) selles, kas tarkvara täiendatud/modifitseeritud versioon peab endiselt kuuluma algse litsensi alla (GNU termin: copyleft) või võib see näiteks muutuda kaubanduslikuks produktiks: GPL seda ei luba, kuid paljud arvavad, et uue tarkvara loojal (ka siis, kui see uus tarkvara kasutab vabavara) peab olema endal õigus otsustada ja näiteks Linux-ist on loodud mitmeid kaubanduslikke versioone, sest Linux-i tuum (kernel) ei kuulu GPL alla (kuid Linux kasutab GPL alla kuuluvat gcc translaatorit) ja Linus Thorvaldsil ei ole midagi selle vastu. Minimaalne, avalikuks kasutamiseks (public domain) lubab vaid vaba kasutamist, kuid ei anna lähtekoodi, õigust programmi mingis teises süsteemis kasutada jne; GNU GPL lubab kõike, kuid selle nõue, et ka tuletatud tarkvarale (programmist edasi arendatud või selle kasutamisel mingis teises süsteemis) peab kindlasti olema GPL litsenss, näib paljudele vaba tarkvara arendajatele liiga piiratud ja sellepärast ei kuulu paljud väga tuntud vabad tarkvaraproduktid (PHP, Perl, Python, Apache, Mozilla) GNU litsenssi alla. Ülevaate tähtsamatest vaba tarkvara litsenssidest annab (näiteks) dokument http://www.topology.org/soft/lice.html.


Ülesandeid:
1. Ylesande tekst
Küsimused, probleemid: ©2004 Jaak Henno