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.
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
.
Parser bere od lexikálního analyzátoru jeden token za druhým a podle typu s nimi nakládá takto:
[
-- tokeny se
začnou ukládat do spojového seznamu, který bude jako jedna položka zásobníku,
až po vyvážený počet hranatých závorek.
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
.
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
.
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
.