Zadanie 2: Secret Hunter

Cieľom zadania je implementovať program v programovacom jazyku Java, ktorý zo súboru zapísanom v doménovo špecifickom jazyku (DSL) na definíciu stavového automatu vygeneruje jeho implementáciu v jazyku C.

Vstup

Súbor napísaný v DSL obsahuje:

  • príkazy (commands) - vstupy jednotlivych znakov z klávesnice, ktoré spôsobia prechod do iného stavu,
  • príkazy pre reštart (resetCommands) - podmnožina príkazov, ktoré vždy spôsobia prechod do počiatočného stavu,
  • udalosti (events) - akcie, ktoré sa automaticky vykonajú pri prechode do daného stavu - konkrétne výpisy znakov na obrazovku,
  • stavy (states), voliteľne obsahujúce akcie (actions) a prechody v tvare príkaz --> nový_stav.

Spomínané štyri hlavné časti nemajú pevne stanovené poradie a môžu sa opakovať. Definícia akcií v stave však musí byť pred definíciami prechodov. Počiatočný stav je ten, ktorý sa definuje ako prvý v poradí.

Výstup

Výstupom generátora má byť súbor so zdrojovým kódom programu v jazyku C. Príklad ukážkového výstupu:

Podklady

K dispozícii máte kostru projektu.

Podmienky

Do existujúceho repozitára pomocou Git-u nahrajte svoj kód najneskôr do začiatku 11. cvičenia. Pridaný obsah má mať nasledujúcu štruktúru:

zadanie2/
    src/
    README.txt
    pom.xml

Nezabudnite predovšetkým na vytvorenie priečinka zadanie2. Súbor README.txt má obsahovať gramatiku DSL v tvare EBNF. Adresárová štruktúra má zodpovedať konvenciám vybraného kompilačného nástroja. Výstupom syntaktickej analýzy má byť vhodná údajová štruktúra (napr. trieda StateMachineDefinition uvedená v kostre projektu), z ktorej sa až následne vygeneruje kód v jazyku C, teda generovanie kódu nemá prebiehať priamo počas syntaktickej analýzy.

Súčasťou zadania sú aj jednotkové testy, ktoré je možné vytvoriť napríklad využitím knižnice JUnit. Očakávaný počet testov je aspoň 20, pričom je potrebné otestovať hraničné situácie predloženého riešenia. Zadanie je možné odovzdať aj bez testov, no za znížený počet bodov.

Hodnotenie:

Hodnotenie za zadanie je možné získať až po jeho úspešnom obhájení (8b).