コード例 #1
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #2
0
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
コード例 #3
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #4
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #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
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #7
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #8
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #9
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
コード例 #10
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
コード例 #11
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #12
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #13
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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
コード例 #14
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
コード例 #15
0
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
コード例 #16
0
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
コード例 #17
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
コード例 #18
0
ファイル: Izrazi.py プロジェクト: petar-bubica/PPJ-Labos
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