def log_ili_izraz(cvor_stabla): #print("U log ili izraz metodi") if len(cvor_stabla.lista_djece) == 1: log_i_izraz(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 0].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela else: log_ili_izraz(cvor_stabla.lista_djece[0]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[0].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return log_i_izraz(cvor_stabla.lista_djece[2]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip("int") cvor_stabla.je_l_vrijednost = False return
def odnosni_izraz(cvor_stabla): #print("U odnosni izraz metodi") if len(cvor_stabla.lista_djece) == 1: aditivni_izraz(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 0].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela else: odnosni_izraz(cvor_stabla.lista_djece[0]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[0].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return aditivni_izraz(cvor_stabla.lista_djece[2]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip("int") cvor_stabla.je_l_vrijednost = False cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) cvor_stabla.dodaj_kod("\tPOP R1\n") cvor_stabla.dodaj_kod("\tPOP R0\n") cvor_stabla.dodaj_kod("\tCMP R0, R1\n") mapa = {"<": "SLT", ">": "SGT", "<=": "SLE", ">=": "SGE"} cvor_stabla.dodaj_kod("\tJP_" + mapa[cvor_stabla.lista_djece[1].vrati_ime()] + " " + "TRUE" + str(config.if_counter_label) + "\n") cvor_stabla.dodaj_kod("FALSE" + str(config.if_counter_label) + "\n") cvor_stabla.dodaj_kod("\tMOVE 0, R2\n") cvor_stabla.dodaj_kod("\tJP " + "ENDIF" + str(config.if_counter_label) + "\n") config.if_counter_label += 1 cvor_stabla.appendKod("TRUE" + str(config.if_counter_label) + "\n") cvor_stabla.appendKod("\tMOVE 1, R2\n") cvor_stabla.appendKod("ENDIF" + str(config.if_counter_label) + "\n") cvor_stabla.appendKod("\tPUSH R2\n") config.if_counter_label += 1 return
def naredba_skoka(cvor_stabla): #print("U naredba skoka metodi") if len(cvor_stabla.lista_djece) == 3: Izrazi.izraz(cvor_stabla.lista_djece[1]) if config.error: return tip = PomocneFunkcije.vrati_tip_trenutne_funkcije() if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[1].vrati_tip(config.doseg), tip) or cvor_stabla.lista_djece[1].je_funkcija(): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[1].kod) cvor_stabla.dodaj_kod("\tPOP R6\n\tRET\n") else: if cvor_stabla.lista_djece[0].podaci.startswith('KR_RETURN'): if PomocneFunkcije.vrati_tip_trenutne_funkcije() != 'void': PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.dodaj_kod("\tRET\n") else: if not config.doseg.je_u_petlji: PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return return
def unarni_izraz(cvor_stabla): #print("U unarni izraz metodi") if len(cvor_stabla.lista_djece) == 1: postfiks_izraz(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 0].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela elif cvor_stabla.lista_djece[1].podaci == "<unarni_izraz>": unarni_izraz(cvor_stabla.lista_djece[1]) if config.error: return if not cvor_stabla.lista_djece[1].vrati_l_vrijednost( config.doseg) or not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[1].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip("int") cvor_stabla.je_l_vrijednost = False else: cast_izraz(cvor_stabla.lista_djece[1]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[1].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip("int") cvor_stabla.je_l_vrijednost = False cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[1].kod) cvor_stabla.dodaj_kod("\tPOP R0\n") if cvor_stabla.lista_djece[0].lista_djece[0].vrati_ime() == "-": cvor_stabla.dodaj_kod("\tXOR R0, -1, R0\n\tADD R0, 1, R0\n") if cvor_stabla.lista_djece[0].lista_djece[0].vrati_ime() == "~": cvor_stabla.dodaj_kod("\tXOR R0, %D -1, R0\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") return
def aditivni_izraz(cvor_stabla): #print("U aditivni izraz metodi") if len(cvor_stabla.lista_djece) == 1: multiplikativni_izraz(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 0].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela else: aditivni_izraz(cvor_stabla.lista_djece[0]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[0].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return multiplikativni_izraz(cvor_stabla.lista_djece[2]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip("int") cvor_stabla.je_l_vrijednost = False cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) cvor_stabla.dodaj_kod("\tPOP R0\n") cvor_stabla.dodaj_kod("\tPOP R1\n") if cvor_stabla.lista_djece[1].podaci.startswith("PLUS"): cvor_stabla.dodaj_kod("\tADD R0, R1, R0\n") else: cvor_stabla.dodaj_kod("\tSUB R1, R0, R0\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") return
def bin_i_izraz(cvor_stabla): #print("U bin i izraz metodi") if len(cvor_stabla.lista_djece) == 1: jednakosni_izraz(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 0].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela else: bin_i_izraz(cvor_stabla.lista_djece[0]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[0].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return jednakosni_izraz(cvor_stabla.lista_djece[2]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), "int"): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip("int") cvor_stabla.je_l_vrijednost = False cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) cvor_stabla.dodaj_kod("\tPOP R0\n\tPOP R1\n") cvor_stabla.dodaj_kod("\tAND R0, R1, R0\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") return
def izraz_pridruzivanja(cvor_stabla): #print("U izraz pridruzivanja metodi") if len(cvor_stabla.lista_djece) == 1: log_ili_izraz(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 0].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela elif len(cvor_stabla.lista_djece) > 1: postfiks_izraz(cvor_stabla.lista_djece[0]) if config.error: return if not cvor_stabla.lista_djece[0].vrati_l_vrijednost(config.doseg): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return izraz_pridruzivanja(cvor_stabla.lista_djece[2]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), cvor_stabla.lista_djece[0].vrati_tip(config.doseg)): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.je_l_vrijednost = False loop = 0 while loop < (len(cvor_stabla.lista_djece[0].kod.split("\n")) - 2): cvor_stabla.dodaj_kod( cvor_stabla.lista_djece[0].kod.split("\n")[loop] + "\n") loop += 1 cvor_stabla.dodaj_kod("\tPUSH R0\n") cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) cvor_stabla.dodaj_kod("\tPOP R1\n") cvor_stabla.dodaj_kod("\tPOP R0\n") cvor_stabla.dodaj_kod("\tSTORE R1, (R0)\n") return
def naredba_grananja(cvor_stabla): #print("U naredba grananja metodi") Izrazi.izraz(cvor_stabla.lista_djece[2]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), 'int') or cvor_stabla.lista_djece[2].je_funkcija(): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return naredba(cvor_stabla.lista_djece[4]) if config.error: return if len(cvor_stabla.lista_djece) > 5: naredba(cvor_stabla.lista_djece[6]) if config.error: return cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) cvor_stabla.dodaj_kod("\tPOP R0\n") cvor_stabla.dodaj_kod("\tCMP R0, 0\n") cvor_stabla.dodaj_kod("\tJP_EQ " + "ELSE" + str(config.if_counter_label) + "\n") cvor_stabla.dodaj_kod("THEN" + str(config.if_counter_label) + "\n") cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[4].kod) cvor_stabla.dodaj_kod("\tJP " + "ENDIF" + str(config.if_counter_label) + "\n") cvor_stabla.dodaj_kod("\tJP_NE " + "ELSE" + str(config.if_counter_label) + "\n") cvor_stabla.dodaj_kod("ELSE" + str(config.if_counter_label) + "\n") if len(cvor_stabla.lista_djece) == 7: cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[6].kod) cvor_stabla.dodaj_kod("ENDIF" + str(config.if_counter_label) + "\n") config.if_counter_label += 1 return
def cast_izraz(cvor_stabla): #print("U cast izraz metodi") if len(cvor_stabla.lista_djece) == 1: unarni_izraz(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 0].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela else: ime_tipa(cvor_stabla.lista_djece[1]) if config.error: return cast_izraz(cvor_stabla.lista_djece[3]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[3].vrati_tip(config.doseg), cvor_stabla.lista_djece[1].vrati_tip(config.doseg)) and not ( cvor_stabla.lista_djece[3].vrati_tip(config.doseg) == "int" and cvor_stabla.lista_djece[1].vrati_tip(config.doseg) == "char") or cvor_stabla.lista_djece[3].je_funkcija( ) or cvor_stabla.lista_djece[1].je_funkcija(): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[1].vrati_tip( config.doseg)) cvor_stabla.je_l_vrijednost = False cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[3].kod) cvor_stabla.labela = cvor_stabla.lista_djece[3].labela return
def init_deklarator(cvor_stabla): #print("U init deklarator metodi") cvor_stabla.lista_djece[0].postavi_tip(cvor_stabla.vrati_tip(config.doseg)) if cvor_stabla.je_konstanta: cvor_stabla.lista_djece[0].je_konstanta = True if cvor_stabla.je_u_petlji: cvor_stabla.lista_djece[0].je_u_petlji = True izravni_deklarator(cvor_stabla.lista_djece[0]) if config.error: return if len(cvor_stabla.lista_djece) == 1: if cvor_stabla.lista_djece[0].je_konstanta: PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) if cvor_stabla.lista_djece[0].tip.startswith("niz"): for i in range(cvor_stabla.lista_djece[0].velicina_niza): labela = "L" + str(config.brojac_labela) config.brojac_labela += 1 if i == 0: cvor_stabla.labela = labela novi = CvorTabliceUpgrade(labela, None) novi.je_prazno = True config.tabela.append(novi) config.doseg.lista_deklaracija[len(config.doseg.lista_deklaracija) - 1].labela = cvor_stabla.labela elif len(cvor_stabla.lista_djece) > 1: inicijalizator(cvor_stabla.lista_djece[2]) if config.error: return if cvor_stabla.lista_djece[0].tip.startswith("niz"): if cvor_stabla.lista_djece[ 0].velicina_niza <= cvor_stabla.lista_djece[ 2].velicina_niza: config.error = True for tip in cvor_stabla.lista_djece[2].vrati_tipove(config.doseg): if not PomocneFunkcije.je_castable( tip, cvor_stabla.lista_djece[0].vrati_tip( config.doseg)[3:]): config.error = True if config.error: PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.labela = cvor_stabla.lista_djece[2].labela config.doseg.lista_deklaracija[len(config.doseg.lista_deklaracija) - 1].labela = cvor_stabla.labela else: if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), cvor_stabla.lista_djece[0].vrati_tip(config.doseg) ) or cvor_stabla.lista_djece[2].je_funkcija(): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) labela = cvor_stabla.lista_djece[0].labela cvor_stabla.dodaj_kod("\tLOAD R0, (R7)\n") cvor_stabla.dodaj_kod("\tSTORE R0, (" + labela + ")\n") cvor_stabla.dodaj_kod("\tADD R7, 4, R7\n") novi = CvorTabliceUpgrade(labela, cvor_stabla) novi.je_prazno = True config.tabela.append(novi) cvor_stabla.labela = labela return
def naredba_petlje(cvor_stabla): #print("U naredba petlje metodi") if len(cvor_stabla.lista_djece) == 5: Izrazi.izraz(cvor_stabla.lista_djece[2]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), 'int') or cvor_stabla.lista_djece[2].je_funkcija(): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.lista_djece[4].je_u_petlji = True naredba(cvor_stabla.lista_djece[4]) if config.error: return if len(cvor_stabla.lista_djece) == 6: izraz_naredba(cvor_stabla.lista_djece[2]) if config.error: return izraz_naredba(cvor_stabla.lista_djece[3]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[3].vrati_tip(config.doseg), 'int') or cvor_stabla.lista_djece[3].je_funkcija(): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.lista_djece[5].je_u_petlji = True naredba(cvor_stabla.lista_djece[5]) if config.error: return if len(cvor_stabla.lista_djece) == 7: izraz_naredba(cvor_stabla.lista_djece[2]) if config.error: return izraz_naredba(cvor_stabla.lista_djece[3]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[3].vrati_tip(config.doseg), 'int') or cvor_stabla.lista_djece[3].je_funkcija(): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return Izrazi.izraz(cvor_stabla.lista_djece[4]) if config.error: return cvor_stabla.lista_djece[6].je_u_petlji = True naredba(cvor_stabla.lista_djece[6]) if config.error: return return
def postfiks_izraz(cvor_stabla): #print("U postfix izraz metodi", cvor_stabla, cvor_stabla.lista_djece) if len(cvor_stabla.lista_djece) == 1: primarni_izraz(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 0].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela elif cvor_stabla.lista_djece[1].podaci.startswith('L_UGL_ZAGRADA'): postfiks_izraz(cvor_stabla.lista_djece[0]) if config.error: return if not cvor_stabla.lista_djece[0].vrati_tip( config.doseg).startswith('niz'): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return X = cvor_stabla.lista_djece[0].vrati_tip(config.doseg)[3:] je_konstanta = cvor_stabla.lista_djece[0].je_konstanta izraz(cvor_stabla.lista_djece[2]) if config.error: return if not PomocneFunkcije.je_castable( cvor_stabla.lista_djece[2].vrati_tip(config.doseg), 'int'): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip(X) cvor_stabla.je_l_vrijednost = not je_konstanta cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) labela = PomocneFunkcije.vrati_vec_deklarirano( cvor_stabla.lista_djece[0].vrati_ime()).labela cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) cvor_stabla.dodaj_kod("\tPOP R0\n") cvor_stabla.dodaj_kod("\tSHL R0, %D 2, R0\n") cvor_stabla.dodaj_kod("\tMOVE " + labela + ", R1\n") cvor_stabla.dodaj_kod("\tADD R0, R1, R0\n") cvor_stabla.dodaj_kod("\tLOAD R0, (R0)\n\tPUSH R0\n") return elif len(cvor_stabla.lista_djece) == 3: postfiks_izraz(cvor_stabla.lista_djece[0]) if config.error: return if not cvor_stabla.lista_djece[0].je_funkcija( ) or cvor_stabla.lista_djece[0].lista_tipova[0] != 'void': PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.je_l_vrijednost = False cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) elif len(cvor_stabla.lista_djece) == 4: postfiks_izraz(cvor_stabla.lista_djece[0]) if config.error: return lista_argumenata(cvor_stabla.lista_djece[2]) if config.error: return if not cvor_stabla.lista_djece[0].je_funkcija(): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return p_izraz = cvor_stabla.lista_djece[0] lista_arg = cvor_stabla.lista_djece[2] if len(p_izraz.vrati_tipove(config.doseg)) != len( lista_arg.vrati_tipove(config.doseg)): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return for i in range(len(p_izraz.vrati_tipove(config.doseg))): if not PomocneFunkcije.je_castable(lista_arg.lista_tipova[i], p_izraz.lista_tipova[i]): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip(p_izraz.vrati_tip(config.doseg)) cvor_stabla.je_l_vrijednost = False cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) elif len(cvor_stabla.lista_djece) == 2: postfiks_izraz(cvor_stabla.lista_djece[0]) if config.error: return p_izraz = cvor_stabla.lista_djece[0] if not p_izraz.vrati_l_vrijednost( config.doseg) or not PomocneFunkcije.je_castable( p_izraz.vrati_tip(config.doseg), 'int'): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip('int') cvor_stabla.je_l_vrijednost = False cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) if cvor_stabla.lista_djece[1].vrati_ime() == "++": cvor_stabla.dodaj_kod("\tPOP R0\n") cvor_stabla.dodaj_kod("\tADD R0, 1, R0\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") else: cvor_stabla.dodaj_kod("\tPOP R0\n") cvor_stabla.dodaj_kod("\tSUB R0, 1, R0\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") return