def inicijalizator(cvor_stabla): #print("U inicijalizator metodi") if len(cvor_stabla.lista_djece) == 1: Izrazi.izraz_pridruzivanja(cvor_stabla.lista_djece[0]) if config.error: return if PomocneFunkcije.ide_u_niz_znakova(cvor_stabla.lista_djece[0]): cvor_stabla.velicina_niza = PomocneFunkcije.izracunaj_duljinu_znakova( cvor_stabla) for i in range(cvor_stabla.velicina_niza): cvor_stabla.lista_tipova.append("char") else: 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.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela elif len(cvor_stabla.lista_djece) > 1: lista_izraza_pridruzivanja(cvor_stabla.lista_djece[1]) if config.error: return cvor_stabla.velicina_niza = cvor_stabla.lista_djece[1].velicina_niza cvor_stabla.lista_tipova = cvor_stabla.lista_djece[1].vrati_tipove( config.doseg) cvor_stabla.ime = cvor_stabla.lista_djece[1].vrati_ime() cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[1].kod) cvor_stabla.labela = cvor_stabla.lista_djece[1].labela return
def lista_izraza_pridruzivanja(cvor_stabla): #print("U lista izraza pridruzivanja metodi") if len(cvor_stabla.lista_djece) == 1: Izrazi.izraz_pridruzivanja(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.velicina_niza = 1 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: lista_izraza_pridruzivanja(cvor_stabla.lista_djece[0]) if config.error: return Izrazi.izraz_pridruzivanja(cvor_stabla.lista_djece[2]) if config.error: 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.velicina_niza = cvor_stabla.lista_djece[0].velicina_niza + 1 cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[2].kod) cvor_stabla.labela = cvor_stabla.lista_djece[0].labela 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 deklaracija(cvor_stabla): #print("U deklaracija metodi") Izrazi.ime_tipa(cvor_stabla.lista_djece[0]) if config.error: return cvor_stabla.lista_djece[1].postavi_tip( cvor_stabla.lista_djece[0].vrati_tip(config.doseg)) if cvor_stabla.lista_djece[0].je_konstanta: cvor_stabla.lista_djece[1].je_konstanta = True if cvor_stabla.je_u_petlji: cvor_stabla.lista_djece[1].je_u_petlji = True lista_init_deklaratora(cvor_stabla.lista_djece[1]) cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[1].kod) 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 izraz_naredba(cvor_stabla): #print("U izraz naredba metodi") if len(cvor_stabla.lista_djece) == 1: cvor_stabla.postavi_tip("int") cvor_stabla.dodaj_kod(cvor_stabla.lista_djece[0].kod) else: Izrazi.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.dodaj_kod(cvor_stabla.lista_djece[0].kod) 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 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 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