add(data: bytes)
: hozzaad a tapehez adatotisEmpty(): bool
take(n: int): bytes
: leveszi az elson
byte-ot a szalagrolpeek(n: int): bytes
: visszater az elson
byte-al a szalagon, de nem veszi le rola
isEmpty(): bool
push(states: [State])
pop(): State
peek(): State
size(): int
Ez alapvetoen csak egy interface, hogy a letrehozando state-ek ehhez igazodjanak.
run(t: Tape, handler: func): [State]
- A major type-okat felosztjuk kicsi, alapveto egysegekre amik egy
State
interface-t kovetnek. - Egy adat feldolgozasa tobb reszre oszthato, pl. egy tombnel meret beolvasasa utana pedig a tomb elemei. Egy state, egy-egy ilyen feladtot lat el.
- A vermet ezekkel a state-ekkel toltjuk fel, es mindig az a state van a verem tetejen, amilyen feladatot eppen vegre kell hajtani.
- Egy state vegrehajtasa azt is megmondja, hogy ezutan milyen state vagy state-ek keruljenek a verem tetejere, vagy ne keruljon semmi uj.
- A state-eket egy major type-on belul bontjuk szet (ez akar
konyvtarstrukturaban is megnyilvanulhat), tehat pl a
UInt
major type ilyen state-ekre oszlik:UIntInfo
: ebben a state-ben megallapitjuk a beolvasando szam meretetUIntRead
: itt pedig beolvassuk az adott byte-nyi szamot es feldolgozzuk
- Megallapithatoak kozos vagy tipusfuggetlen state-ek is:
MajorType
: megallapitja a szalag elso byte-janak elso 3 bitjebol, hogy az milyen tipusu es visszater annak a kezdo state-jevel (pl. UInt eseteben aUIntInfo
-val)<Tipus>Info
: Minden tipus rendelkezik egy kezdeti informacios allapottal, ahol az elso byte utolso 5 bitjet dolgozzuk fel.
- a vezerlest egy ciklusban zajlik, ami addig fut amig nem vegeztunk a szalag beolvasasaval es innen hajtjuk vegre a vermen levo state-eket.
- ha pl beolvastunk egy szamot, vagy barmi mas tortent egy egy state-ben, azt
egy a state-nek atadott
handler
fuggveny meghivasaval tudjuk jelezni. Ez kezdetben tortenhet ugy hogy mindig egy stringben kozoljuk igy kozvetlenul tudunk JSON-ba dekodolni. Kesobb ezt konnyen felokosithatjuk egy absztraktabb megoldassal amivel mas, akar altalanos, dekodolasi lehetoseg is kialakithato.
- a tape-et atadhatjuk a state-eknek es ezek modositashatjak is azt
tape = [1, [2, 3]]
stack = [MajorType()]
done = False
while not done:
top = stack.pop()
topush = top.run(tape, stack, handler)
stack.push(topush)
- a tape elso byte-jarol megallapitja, hogy annak elso 3 bitje milyen major type-ot ir le
- a megkapott major type elso state-jevel
- a tape elso byte-jarol megallapitja, hogy annak utolso 5 bitje milyen meretu szamot ir le.
- egy megfelelo meretu
UIntRead(n)
state-el
- beolvas a tape-rol n byte-nyi adatot es azzal meghivja a
handler
-t
[]