Next Previous Contents

5.3 Jazyk A a modul Zenon

Motivace

V každém kroku simulace je třeba vědět o poloze a směru a síle trysky.

I když popis jazyka A umožňuje (v čase) spojité definování těchto hodnot, pro simulaci je nutné toto spojité chování zdiskrétnit. Právě k tomu slouží modul Zenon. Zjednodušeně řečeno, chceme se ptát Zenona, jak vypadá scéna v určitém okamžiku. Za odměnu mu slíbíme, že se budeme ptát pouze na čím dál tím větší čas.

Lexikální analýza jazyka A

Pro lexikální analýzu je použit nástroj flex(1). Tomu stačí pouze popsat jednotlivé lexémy regulárnímy výrazy a co se má dělat poku je najde. Z toho popisu flex vytvoří zdrojový text v jazyce C. Tak můžeme přehledným a snadno upravitelným způsobem získat velmi efektvivní lexikální analyzátor. Více informací o flexu viz např. info flex.

Popis chodu parseru

Parser bere od lexikálního analyzátoru jeden token za druhým a podle typu s nimi nakládá takto:

Některé funkce speciálně:

[] "idfce" def2

Definice nové funkce. Na zásobníku musí být dva argumenty: tělo definice (spoják tokenů), a id názvu této nové funkce.

TT cas1

Posunutí času na TT. Pokud je tento čas větší než požaduje modul Zenon (viz níže), parsování je dočasně přerušeno.

[] dT int2

Definice intervalu. Na zásobníku je tělo intervalu (spoják tokenů) a délka intervalu dT. Tělo bude provedeno pokaždé, když bude modul Zenon požádán o zjištění stavu trysek v čase, který bude mezi TT a TT + dT.

Modul Zenon

Pracuje vlastně ve dvou fázích. Nejprve načte všechny další intervaly, které by mohly potenciálně obsahovat čas TT. Zároveň se vyřadí ty intervaly, které již do děje nezasáhnou.

Druhá fáze spočívá v tom, že se provedou těla všech intervalů obsahujících čas TT.

Zenon podrobněji

V polích zn_trysky, zn_svetla, zn_kamery, zn_define, jsou informace o tryskách, o světlech, o kamerách, o proměnných scény. Informace o tryskách jsou využity modulem Chrlič, ostatní jsou jednoduše přeneseny do výstupu.

Modul Zenon má následující interface:

zn_init()

inicializace.

zn_set_time_zone(double tz)

nastavení kroku.

zn_shift_time()

posuň čas krok vpřed.

zn_set_time_lo(double tm)

nejmenší možný čas bude tm.

zn_at_time(double tm)

spočítej pozici trysek, světel ... v čas tm.


Next Previous Contents