Interpretační překladač implementovaný v Javě s využitím JavaCC — Jasperův zápisník

Přejít na obsah | Přejít na menu


Interpretační překladač implementovaný v Javě s využitím JavaCC

Čas 26. 5. 2008 v 14.55 Kategorie 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: Screenshot CMD

  • 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.


Tento příspěvek byl publikován dne 26. 5. 2008 v 14:55 v rubrice Programování, Škola.
Komentáře můžete sledovat přes RSS 2.0 kanál.
Můžete zanechat komentář nebo trackback z vašeho webu.

4 komentářů k příspěvku “Interpretační překladač implementovaný v Javě s využitím JavaCC”

  1. Ivan napsal:

    Vypadá to moc pěkně. Možná si zkusím oživit programovací jazyky a vyzkouším. Díky

  2. aston.havoc napsal:

    presne tenhle projekt mam taky. uz mam implementovano if else ,akorat se stale nemuzu pohnout s while. nemohl by jste mi nejak poradit? dekuji

    • Jasper napsal:

      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…

  3. General napsal:

    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ý..

Zanechte komentář

Avatary zajišťovány službou Gravatar.
Váš první komentář musí schválit správce, další již lze psát volně.