Generator vmesne kode

Sestavite generator vmesne kode, ki izračuna fragmente vmesne kode:

  1. ImcCodeChunk vsebuje celotno vmesno kodo funkcije (brez vgnezdenih funkcij) v obliki enega ImcMOVE ukaza, s katerim izraz/rezultat funkcije priredimo začasni spremenljivki RV.
  2. ImcDataChunk vsebuje opis globalne spremenljivke.

V klicni zapis sta dodani dve začasni spremenljivki:

  1. RV vsebuje rezultat funkcije.
  2. FP vsebuje kazalec na klicni zapis.

Ukazi vmesne kode se delijo na dve vrsti: ukazi za izraze in ukazi za stavke.
Ukazi za izraze:

  • ImcBINOP(op,left,right): vrne vrednost binarnega izraza z operatorjem op ter podizrazoma left in right.
  • ImcCALL(label,args): vrne vrednost funkcije na naslovu label pri argumentih args (prvi argument je vrednost statičnega povezave); vsak argument je predstavljen kot izraz vmesne kode, ki izračuna njegovo vrednost.
  • ImcCONST(value): vrne vrednost value.
  • ImcESEQ(stmt,value): najprej izvede stavek stmt, nato vrne vrednost value.
  • ImcMEM(expr): dostop do naslova expr (če je ImcMEM neposredni levi sin ukaza ImcMOVE, pomeni pisanje v pomnilnik, sicer pomeni branje iz pomnilnika).
  • ImcNAME(label): vrne naslov label.
  • ImcTEMP(temp): vrne vrednost začasne spremenljivke temp.

Ukazi za stavke:

  • ImcCJUMP(cond,true,false): če je vrednost pogoja cond različna od 0, skoči na oznako true, sicer skoči na oznako false.
  • ImcEXP(expr): izračuna in zavrže rezultat izraza expr.
  • ImcJUMP(label): skoči na oznako label.
  • ImcLABEL(label): oznaka label.
  • ImcMOVE(dst,src): shrani vrednost src na naslov dst.
  • ImcSEQ(stmts): zaporedoma izvede stavke stmts.

V semantični analizator dodajte omejitev, da so funkcijski argumenti in rezultati lahko le tipov integer, logical in string.

Rešitev 7. domače naloge oddajte kot arhiv 63xxxxxx-07.zip (kjer je 63xxxxxx vaša vpisna številka) - rešitve dosedanjih domačih nalog so del rešitve 7. domače naloge. V tem arhivu naj bo struktura direktorijev natančno enaka strukturi direktorijev v arhivu s predlogo domače naloge (z dodanimi rešitvami dosedanjih domačih nalog).