Vaje - Razreševanje simbolov

Vaje - Razreševanje simbolov

Obiskovanje vozlišč

Sintaksni analizator generira sintaktično predstavitev izvorne kode, npr. sintaksno drevo oz. v našem primeru gre za seznam ukazov, ki so predstavljeni z objekti (nasledniki razreda Node). Pri prevajanju, razreševanju simbolov itd. večkrat potrebujemo nek način obdelave ukazov programa - t.j. želimo se sprehoditi čez program. V ta namen se pogosto uporablja vzorec Obiskovalec (angl. Vistitor design pattern). Mi lahko uporabimo njegovo poenostavljeno različico.

a) Razredu Node bomo dodali dve metodi:

  • enter(Code code) - kličemo pred obiskom vozlišča;
  • leave(Code code) - kličemo po obisku vozlišča.

V teh dveh metodah se boste ukvarjali predvsem z nastavljanjem lokacijskega števca.

  • Namig 1: Ukazi lokacijski števec povečajo za dolžino kode ukaza (prav pride tudi npr. metoda node.length(), ki vrne to dolžino ukaza v bajtih), nekatere direktive (START, ORG) pa ga neposredno nastavljajo.
  • Namig 2: Morda se vam tekom obiskovanja splača voditi dva lokacijska števca, eden kaže na lokacijo trenutno obiskanega ukaza, drugi pa na lokacijo naslednjega ukaza (ta pravzaprav predstavlja vrednost PC - spomnimo se, da PC kaže na naslednji ukaz).

b) Razredu Code bomo dodali še metodi:

  • begin()
  • end()

ki pripravi vse potrebno za začetek obiskovanja, npr. inicializiraza lokacijski števec, resetira bazni register.

Prvi prehod - definicija label

Del prvega prehoda imamo pravzaprav že narejenega - branje datoteke in dodajanje ukazov v seznam. Česar še nismo naredili, pa je definicija simbola, ki ga podaja morebita labela ukaza. Vsakič, ko torej ukaz (vozlišče) dodamo v seznam, ga torej še obiščemo. V ta namen definirajte neko metodo, npr.

  • activate(Code)

V metodi pravzaprav izvedete le definicijo simbola, ki ga podaja labela.

Drugi prehod - razreševanje desnih simbolov

a) Razredu Node dodamo metodo:

  • resolve(Code code)

ki obišče vozlišče oz. v našem primeru razreši morebitni simbol, ki pripada ukazu. Seveda bo potrebno to metodo povoziti v nekaterih naslednikih razreda Node. Pri tem bodi pozorni na:

  • direktive - nekatere direktive poleg razreševanja simbola še spremenijo nekatere atribute (npr. začetni naslov kode, vrednost baznega registra);
  • ukaze formata 3 - poleg razreševanja simbola je potrebno tudi preverite operand, če je v dovoljenem intervalu;
  • ukaze formata 4 - ne podpirajo PC-relativnega in bazno-relativnega naslavljanja.

Prednosti med načini naslavljanja:

  • Kodo je možno generirati na več različnih (pravilnih) načinov. Smiselno pa je prednost dati PC-relativnemu naslavljanju pred bazno-relativnim in nadalje pred neposrednim.
  • V koliko naslavljanja ni mogoče razrešiti, vržite izjemo.

b) Razredu Code bomo dodali metodo:

  • resolve()

ki izvede razreševanje kode.

Last modified: Wednesday, 19 December 2012, 11:57 AM