Skip to content

Instantly share code, notes, and snippets.

@gerhardberger
Created March 31, 2017 18:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gerhardberger/fe24f860c1a56827bf09196c7d9dcb66 to your computer and use it in GitHub Desktop.
Save gerhardberger/fe24f860c1a56827bf09196c7d9dcb66 to your computer and use it in GitHub Desktop.

veremautomata

alap osztalyok

Tape

  • add(data: bytes): hozzaad a tapehez adatot
  • isEmpty(): bool
  • take(n: int): bytes: leveszi az elso n byte-ot a szalagrol
  • peek(n: int): bytes: visszater az elso n byte-al a szalagon, de nem veszi le rola

Stack

  • isEmpty(): bool
  • push(states: [State])
  • pop(): State
  • peek(): State
  • size(): int

State

Ez alapvetoen csak egy interface, hogy a letrehozando state-ek ehhez igazodjanak.

  • run(t: Tape, handler: func): [State]

alapveto mukodes

  • 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 meretet
    • UIntRead: 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 a UIntInfo-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 fo ciklus

  • a tape-et atadhatjuk a state-eknek es ezek modositashatjak is azt
tape = [1, [2, 3]]
stack = [MajorType()]
done = False

while !done:
  top = stack.pop()

  topush = top.run(tape, stack, handler)

  stack.push(topush)

Common

MajorType

action

  • a tape elso byte-jarol megallapitja, hogy annak elso 3 bitje milyen major type-ot ir le

returns

  • a megkapott major type elso state-jevel

Unsigned integer states

UIntInfo

action

  • a tape elso byte-jarol megallapitja, hogy annak utolso 5 bitje milyen meretu szamot ir le.

returns

  • egy megfelelo meretu UIntRead(n) state-el

UIntRead(n)

action

  • beolvas a tape-rol n byte-nyi adatot es azzal meghivja a handler-t

returns

  • []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment