コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
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
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
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
コード例 #7
0
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
コード例 #8
0
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
コード例 #9
0
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