Interpretační překladač implementovaný v Javě s využitím JavaCC
26. 5. 2008 000 14.55 Programování, Škola
Už je to relativně delší doba, co jsem odevzdal hlavní semestrální projekt do předmětu PJP. Cílem bylo vytvořit interpretační překladač podle zadané specifikace jazyka. Vstupem do programu je soubor se zdrojovým kódem (definuje se jako parametr při spouštění) a veškeré výstupy se vypisují na standardní výstup. Projekt je implementován v Javě s využitím generátoru kompilátorů JavaCC.
Specifikace jazyka
Specifikace jazyka interpretačního překladače by se dala stručně popsat těmito body:
- Deklarace
- typ proměnná, proměnná, …;
- Typem mohou být int, float, boolean nebo String.
- Přiřazení hodnoty
- proměnná = výraz;
- Proměnná musí existovat, ohled na datové typy (do intu nepůjde uložit String).
- Čtení ze standardního vstupu
- read proměnná, proměnná, …;
- Načtení hodnoty ze standardního vstupu do proměnných, ohled na datové typy.
- Výpis proměnných
- print výraz, výraz, …;
- Výpis hodnoty výrazů na standardní výstup.
- Výrazy
- Výrazy mohu obsahovat operátory + (plus), – (mínus), * (krát), / (děleno), % (zbytek po celočíselném dělení), . (konkatence), ! (negace).
Zde si můžete prohlédnout podrobnou specifikaci jazyka ve formátu PDF ze stránek vyučujícího.
K dispozici dávám celý projekt ke stažení (zip, 100kB). Obsahem jsou kompletní zdrojové kódy, konfigurační soubor build.xml pro sestavení pomocí programu Ant, dokumentace s návodem na kompilaci a také ukázkové zdrojové kódy k otestování.
Ukázkový zdrojový program
Zde je k vidění ukázkový zdrojový program, který je použit jako vstup pro interpretační překladač:
print "<Konstanty>";
print "10: ",10;
print "1.25: ", 1.25;
print "";;
print "<Promenne>";
String s;
s="Abcd";
print "s(Abcd): ", s;
float d;
d=3.14159e2;
print "d(3.14159e2): ", d;
int n;
n=-500;
print "n(-500): ", n;
print "";
boolean k;
k=true;
print "k(true): ",k;
print "";
print "<Vyrazy>";
print "2+3*5(17): ",2+3*5;
print "17 / 3(5): ", 17 / 3;
print "17 % 3(2): ", 17 % 3;
print "2.5*2.5/6.25(1.0): ", 2.5*2.5/6.25;
print "1.5*3(4.5): ", 1.5*3;
print "abc+def (abcdef): ", "abc"."def";
print "";
print "<Poznamky>"; // Poznamka
// print "Taky poznamka";
print "<Kompatibilita>";
float y;
y= 10;
print "y (10.0): ", y;
print "<Vstup dat - a,b#,c$>";
int a;
float b;
String c;
boolean e;
a = 0;
b = 0.0;
c = "";
e = true;
read a,b,c,e;
print "a,b,c,e: ", a, ", ", b, ", ", c, ", ",e;
Výstup překladače
Zde je text, který vygeneruje překladač s předchozím zdrojovým kódem na vstupu. Na řádcích 24 až 27 je ukázka čtení ze standardního vstupu. Podle datového typu proměnné, do které chceme načíst data od uživatele, se vypíše příslušná hláška a uživatel musí příslušnou hodnotu zapsat do konzole (při špatné hodnotě se vypíše chybové hlášení a překlad bude ukončen).
<Konstanty>
10: 10
1.25: 1.25
<Promenne>
s(Abcd): Abcd
d(3.14159e2): 3.14159e2
n(-500): -500
k(true): true
<Vyrazy>
2+3*5(17): 17
17 / 3(5): 5
17 % 3(2): 2
2.5*2.5/6.25(1.0): 1.0
1.5*3(4.5): 4.5
abc+def (abcdef): abcdef
<Poznamky>
<Kompatibilita>
y (10.0): 10.0
<Vstup dat - a,b#,c$>
Zapis do promenne "a" (typ "int"): 10
Zapis do promenne "b" (typ "float"): 15.55
Zapis do promenne "c" (typ "String"): hello word
Zapis do promenne "e" (typ "boolean"): false
a,b,c,e: 10, 15.55, hello word, false
Překladač určitě není bezchybný, ale funguje podle zadané specifikace. Pokud vás toto téma zaujalo, tak si určitě z výše uvedeného odkazu stáhněte zdrojový kód, ze kterého můžete pochopit základní principy práce s generátorem překladačů JavaCC.
Tweet
Vypadá to moc pěkně. Možná si zkusím oživit programovací jazyky a vyzkouším. Díky
presne tenhle projekt mam taky. uz mam implementovano if else ,akorat se stale nemuzu pohnout s while. nemohl by jste mi nejak poradit? dekuji
S tím ti asi neporadím. Jednak už to je přes 2 roky a taky jsem dělal projekt pro jednoho, kde si nemusel řešit tyto konstrukce, na rozdíl od teamového projektu…
Pěkný, taky bych si chtěl vytvořit (čistě svuj) parser pro svuj mini-jazyk, to buďto v C# nebo C/C++, ale zatim sem nepřišel na algoritmus :D když si představit třeba php tak to musí bejt neúměrně složitý..