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 lista_parametara(cvor_stabla): #print("U lista parametara metodi") if len(cvor_stabla.lista_djece) == 1: deklaracija_parametara(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.lista_tipova.append(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.dodaj_ime(cvor_stabla.lista_djece[0].vrati_ime()) elif len(cvor_stabla.lista_djece) > 1: lista_parametara(cvor_stabla.lista_djece[0]) if config.error: return deklaracija_parametara(cvor_stabla.lista_djece[2]) if config.error: return if cvor_stabla.lista_djece[2].vrati_ime( ) in cvor_stabla.lista_djece[0].lista_imena: PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.lista_tipova = cvor_stabla.lista_djece[0].vrati_tipove( config.doseg) cvor_stabla.lista_tipova.append(cvor_stabla.lista_djece[2].vrati_tip( config.doseg)) cvor_stabla.lista_imena = cvor_stabla.lista_djece[0].lista_imena cvor_stabla.dodaj_ime(cvor_stabla.lista_djece[2].vrati_ime()) 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 ime_tipa(cvor_stabla): #print("U ime tipa metodi") if len(cvor_stabla.lista_djece) == 1: specifikator_tipa(cvor_stabla.lista_djece[0]) cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) else: specifikator_tipa(cvor_stabla.lista_djece[1]) if cvor_stabla.lista_djece[1].vrati_tip(config.doseg) == "void": PomocneFunkcije.ispisi_error_poruku(cvor_stabla) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[1].vrati_tip( config.doseg)) cvor_stabla.je_konstanta = True return
def deklaracija_parametara(cvor_stabla): #print("U deklaracija parametara metodi") Izrazi.ime_tipa(cvor_stabla.lista_djece[0]) if config.error: return if cvor_stabla.lista_djece[0].vrati_tip(config.doseg) == "void": PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return if len(cvor_stabla.lista_djece) == 2: cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) else: cvor_stabla.postavi_tip( "niz" + cvor_stabla.lista_djece[0].vrati_tip(config.doseg)) cvor_stabla.ime = cvor_stabla.lista_djece[1].vrati_ime() 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 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 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 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 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 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 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 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
def definicija_funkcije(cvor_stabla): #print("U definicija funkcije metodi") Izrazi.ime_tipa(cvor_stabla.lista_djece[0]) if cvor_stabla.lista_djece[0].je_konstanta: PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return if PomocneFunkcije.funkcija_vec_postoji( config.doseg, cvor_stabla.lista_djece[1].vrati_ime()): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return if cvor_stabla.lista_djece[3].podaci.startswith("KR_VOID"): if PomocneFunkcije.konfliktna_deklaracija( config.doseg, cvor_stabla.lista_djece[0].vrati_ime(), cvor_stabla.lista_djece[0].vrati_tip(config.doseg)): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.je_definiran = True cvor_stabla.ime = cvor_stabla.lista_djece[1].vrati_ime() cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.lista_tipova.append("void") if cvor_stabla.vrati_ime() == "main" and cvor_stabla.vrati_tip( config.doseg) == "int": config.nema_main = False #print('doseg.lista dekl:', config.doseg.lista_deklaracija) config.doseg.lista_deklaracija.append(cvor_stabla) config.definirane_funkcije.append(cvor_stabla.vrati_ime()) NaredbenaStruktura.slozena_naredba(cvor_stabla.lista_djece[5]) if config.error: return if cvor_stabla.lista_djece[1].vrati_ime() == "main": cvor_stabla.labela = "MAIN" else: cvor_stabla.labela = "F" + str(config.function_counter_label) config.function_counter_label += 1 cvor_stabla.dodaj_kod(cvor_stabla.labela) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[5].kod) novi = CvorTabliceUpgrade(cvor_stabla.labela, cvor_stabla) novi.je_fja = True config.tabela.append(novi) else: lista_parametara(cvor_stabla.lista_djece[3]) if config.error: return if PomocneFunkcije.konfliktna_deklaracija( config.doseg, cvor_stabla.vrati_ime(), cvor_stabla.vrati_tip(config.doseg)): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.je_definiran = True cvor_stabla.postavi_tip(cvor_stabla.lista_djece[0].vrati_tip( config.doseg)) cvor_stabla.ime = cvor_stabla.lista_djece[1].vrati_ime() cvor_stabla.lista_djece[5].lista_tipova = cvor_stabla.lista_djece[ 3].vrati_tipove(config.doseg) cvor_stabla.lista_tipova = cvor_stabla.lista_djece[3].vrati_tipove( config.doseg) cvor_stabla.lista_djece[5].lista_imena = cvor_stabla.lista_djece[ 3].lista_imena cvor_stabla.lista_imena = cvor_stabla.lista_djece[3].lista_imena if cvor_stabla.lista_djece[1].vrati_ime() == "main": cvor_stabla.labela = "MAIN" else: cvor_stabla.labela = "F" + str(config.function_counter_label) config.function_counter_label += 1 cvor_stabla.dodaj_kod(cvor_stabla.labela) config.definirane_funkcije.append(cvor_stabla.vrati_ime()) #print('doseg.lista dekl:', config.doseg.lista_deklaracija) config.doseg.lista_deklaracija.append(cvor_stabla) NaredbenaStruktura.slozena_naredba(cvor_stabla.lista_djece[5]) if config.error: return cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[5].kod) if cvor_stabla.lista_djece[0].vrati_tip(config.doseg) == "void": cvor_stabla.dodaj_kod("\tRET\n") novi = CvorTabliceUpgrade(cvor_stabla.labela, cvor_stabla) novi.je_fja = True config.tabela.append(novi) return
def izravni_deklarator(cvor_stabla): #print("U izravni deklarator metodi") if len(cvor_stabla.lista_djece) == 1: if cvor_stabla.vrati_tip( config.doseg ) == "void" or PomocneFunkcije.je_deklarirano_lokalno( cvor_stabla.lista_djece[0].vrati_ime()): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.je_definiran = False cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() labela = "L" + str(config.brojac_labela) config.brojac_labela += 1 cvor_stabla.labela = labela #print('doseg.lista dekl:', config.doseg.lista_deklaracija) config.doseg.lista_deklaracija.append(cvor_stabla) return elif cvor_stabla.lista_djece[2].podaci.startswith("BROJ"): if cvor_stabla.vrati_tip( config.doseg ) == "void" or PomocneFunkcije.je_deklarirano_lokalno( cvor_stabla.vrati_ime()): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return if cvor_stabla.lista_djece[2].dohvati_vrijednost_broja( ) <= 0 or cvor_stabla.lista_djece[2].dohvati_vrijednost_broja() > 1024: PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip("niz" + cvor_stabla.vrati_tip(config.doseg)) cvor_stabla.velicina_niza = cvor_stabla.lista_djece[ 2].dohvati_vrijednost_broja() cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() #print('doseg.lista dekl:', config.doseg.lista_deklaracija) config.doseg.lista_deklaracija.append(cvor_stabla) elif cvor_stabla.lista_djece[2].podaci.startswith("KR_VOID"): lokalna_deklaracija = PomocneFunkcije.vrati_lokalnu_deklaraciju( cvor_stabla.lista_djece[0].vrati_ime()) if lokalna_deklaracija is None: cvor_stabla.lista_tipova.append("void") cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() #print('doseg.lista dekl:', config.doseg.lista_deklaracija) config.doseg.lista_deklaracija.append(cvor_stabla) config.deklarirane_funkcije.append(cvor_stabla.vrati_ime()) else: if len(lokalna_deklaracija.vrati_tipove(config.doseg) ) != 1 or lokalna_deklaracija.lista_tipova[0] != "void": PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.lista_tipova.append("void") elif cvor_stabla.lista_djece[2].podaci == "<lista_parametara>": lista_parametara(cvor_stabla.lista_djece[2]) if config.error: return lokalna_deklaracija = PomocneFunkcije.vrati_lokalnu_deklaraciju( cvor_stabla.lista_djece[0].vrati_ime()) if lokalna_deklaracija is not None: if not PomocneFunkcije.provjeri_tipove(lokalna_deklaracija, cvor_stabla.lista_djece[2]): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.lista_tipova = cvor_stabla.lista_djece[2].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() else: cvor_stabla.ime = cvor_stabla.lista_djece[0].vrati_ime() cvor_stabla.lista_tipova = cvor_stabla.lista_djece[2].vrati_tipove( config.doseg) config.deklarirane_funkcije.append(cvor_stabla.vrati_ime()) #print('doseg.lista dekl:', config.doseg.lista_deklaracija) config.doseg.lista_deklaracija.append(cvor_stabla) 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 primarni_izraz(cvor_stabla): #print("U primarni izraz metodi") cvor = cvor_stabla.lista_djece[0] if cvor.podaci.startswith('IDN'): if not PomocneFunkcije.je_vec_deklarirano(cvor.vrati_ime()): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip(cvor.vrati_tip(config.doseg)) cvor_stabla.lista_tipova = cvor.vrati_tipove(config.doseg) cvor_stabla.ime = cvor.vrati_ime() cvor_stabla.je_l_vrijednost = cvor.vrati_l_vrijednost(config.doseg) identifikator = PomocneFunkcije.vrati_vec_deklarirano(cvor.vrati_ime()) labela = identifikator.labela if cvor_stabla.je_funkcija: cvor_stabla.dodaj_kod("\tCALL " + labela + "\n") if len(cvor_stabla.vrati_tipove(config.doseg)) != 1 or len( cvor_stabla.vrati_tipove(config.doseg) == 1 and cvor_stabla.lista_tipova[0] != "void"): cvor_stabla.dodaj_kod( "\tADD R7, %D " + str(len(cvor_stabla.vrati_tipove(config.doseg)) * 4) + ", R7\n") if cvor_stabla.vrati_tip(config.doseg) != "void": cvor_stabla.dodaj_kod("\tPUSH R6\n") else: if cvor_stabla.tip.startswith("niz"): cvor_stabla.dodaj_kod("\tMOVE " + labela + ", R0\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") else: cvor_stabla.dodaj_kod("\tLOAD R0, (" + labela + ")\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") cvor_stabla.labela = labela elif cvor.podaci.startswith('BROJ'): if not PomocneFunkcije.je_integer(cvor.vrati_ime()): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip('int') cvor_stabla.je_l_vrijednost = False cvor.labela = "L" + str(config.brojac_labela) config.brojac_labela += 1 config.tabela.append(CvorTabliceUpgrade(cvor.labela, cvor)) cvor_stabla.dodaj_kod("\tLOAD R0, (" + cvor.labela + ")\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") cvor_stabla.labela = cvor.labela elif cvor.podaci.startswith('ZNAK'): if not PomocneFunkcije.je_char(cvor.vrati_ime()): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip('char') cvor_stabla.je_l_vrijednost = False cvor.labela = "L" + str(config.brojac_labela) config.brojac_labela += 1 config.tabela.append(CvorTabliceUpgrade(cvor.labela, cvor)) cvor_stabla.dodaj_kod("\tLOAD R0, (" + cvor.labela + ")\n") cvor_stabla.dodaj_kod("\tPUSH R0\n") cvor_stabla.labela = cvor.labela elif cvor.podaci.startswith('NIZ_ZNAKOVA'): if not PomocneFunkcije.je_string(cvor.vrati_ime()): PomocneFunkcije.ispisi_error_poruku(cvor_stabla) return cvor_stabla.postavi_tip('nizchar') cvor_stabla.je_konstanta = True cvor_stabla.je_l_vrijednost = False #TODO elif cvor.podaci.startswith('L_ZAGRADA'): izraz(cvor_stabla.lista_djece[1]) if config.error: return cvor_stabla.postavi_tip(cvor_stabla.lista_djece[1].vrati_tip( config.doseg)) cvor_stabla.je_l_vrijednost = cvor_stabla.lista_djece[ 1].vrati_l_vrijednost(config.doseg) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[1].kod) return