コード例 #1
0
ファイル: afnd.py プロジェクト: TADebastiani/COMPILADORES
 def _add_estado(self, rotulo):
     estado = Estado()
     estado.rotulo = self._count_estado
     estado.rotuloGr = rotulo
     self.estados.append(estado)
     self._count_estado += 1
     return estado
コード例 #2
0
ファイル: main.py プロジェクト: TADebastiani/COMPILADORES
def main():
    global CONT_ESTADO, AFND, ESTADOS, CONT_LINHA
    # abre o arquivo em modo de leitura
    arquivo = open('codOtimizado.txt', 'w')
    arquivo.write(str(""))
    arquivo.close()

    with open("entrada.txt", "r") as arquivo:
        for linha in arquivo:
            if linha[len(linha) - 1] != '\n':
                linha = linha + '\n'
            if not AFND:
                est = Estado()
                est.rotulo = CONT_ESTADO
                est.inicial = True
                est.rotuloGr = 'S'
                AFND.append(est)
                CONT_ESTADO += 1
            elif linha[0] == '<' and linha[1] != '=' and linha[1] != '\n':
                le_gramatica(linha)
            else:
                le_token(linha)
        determinizar()
        mortos()
        insere_estado_erro()
        gerar_csv()
        print_erros(lexic(), ERRO_LEX)
        print_tabela_simbolos()
        if not TABELA_ERROS:
            aceita = analise_sintatica()
            if aceita:
                analise_semantica()
                gera_codigo_intermediario()
                otimizacao()
コード例 #3
0
ファイル: main.py プロジェクト: TADebastiani/COMPILADORES
def terminal(estad, term):
    global AFND, CONT_ESTADO, ALFABETO, ESTADOS

    cont = 0
    flag = 0
    for i in ESTADOS:
        if i.rotuloGr == estad:
            break
        cont += 1

    for i in ESTADOS[cont].transicoes:
        if i.rotulo == term:
            flag = 1
            i.transicoes.append(CONT_ESTADO)

    if flag == 0:
        transi = Transicao()
        transi.rotulo = term
        transi.transicoes.append(CONT_ESTADO)
        ESTADOS[cont].transicoes.append(transi)
    est = Estado()
    est.final = True
    est.rotulo = CONT_ESTADO
    CONT_ESTADO += 1
    ESTADOS.append(est)
    AFND.append(est)
コード例 #4
0
ファイル: main.py プロジェクト: TADebastiani/COMPILADORES
def nao_terminal(estad, term, nao_term):
    global AFND, CONT_ESTADO, ALFABETO, ESTADOS
    flag = 0
    have_nao_term = False
    cont = 0
    rot = 0
    for i in ESTADOS:
        if i.rotuloGr == estad:
            break
        cont += 1

    for i in ESTADOS:
        if i.rotuloGr == nao_term:
            have_nao_term = True
            rot = i.rotulo

    for i in ESTADOS[cont].transicoes:
        if i.rotulo == term:
            flag = 1
            if have_nao_term:
                if rot not in i.transicoes:
                    i.transicoes.append(rot)
            else:
                i.transicoes.append(CONT_ESTADO)
                est = Estado()
                est.rotulo = CONT_ESTADO
                est.rotuloGr = nao_term
                CONT_ESTADO += 1
                ESTADOS.append(est)
                AFND.append(est)
            break

    if flag == 0:
        transi = Transicao()
        transi.rotulo = term
        if have_nao_term:
            transi.transicoes.append(rot)
        else:
            transi.transicoes.append(CONT_ESTADO)
            est = Estado()
            est.rotulo = CONT_ESTADO
            est.rotuloGr = nao_term
            CONT_ESTADO += 1
            ESTADOS.append(est)
            AFND.append(est)
        ESTADOS[cont].transicoes.append(transi)
コード例 #5
0
ファイル: main.py プロジェクト: TADebastiani/COMPILADORES
def le_token(linha):
    global AFND, ALFABETO, CONT_ESTADO
    flag = 0
    for i in AFND[0].transicoes:
        if i.rotulo == linha[0]:
            i.transicoes.append(CONT_ESTADO)
            flag = 1

    if flag == 0:
        transic = Transicao()
        transic.rotulo = linha[0]
        transic.transicoes.append(CONT_ESTADO)
        AFND[0].transicoes.append(transic)

    if linha[0] not in ALFABETO and linha[0] != 'ε':
        ALFABETO.append(linha[0])

    i = 1

    while linha[i] != '\n':
        estad = Estado()
        estad.rotulo = CONT_ESTADO
        CONT_ESTADO += 1
        trans = Transicao()
        trans.rotulo = linha[i]
        trans.transicoes.append(CONT_ESTADO)
        estad.transicoes.append(trans)
        AFND.append(estad)
        if linha[i] not in ALFABETO and linha[0] != 'ε':
            ALFABETO.append(linha[i])
        i += 1

    estad = Estado()
    estad.rotulo = CONT_ESTADO
    estad.final = True
    estad.eh_token = True
    CONT_ESTADO += 1
    AFND.append(estad)
コード例 #6
0
ファイル: main.py プロジェクト: TADebastiani/COMPILADORES
def le_gramatica(linha):
    global AFND, CONT_ESTADO, ALFABETO, I_LINHA, ESTADOS, CONT_GRAMM
    I_LINHA = 1

    std = split_nt(linha)
    if std == 'S':
        inicializa_estado()
        CONT_GRAMM += 1

    flag = 0
    for i in ESTADOS:
        if i.rotuloGr == std:
            flag = 1

    if flag == 0:
        est = Estado()
        est.rotulo = CONT_ESTADO
        est.rotuloGr = std
        CONT_ESTADO += 1
        ESTADOS.append(est)
        AFND.append(est)

    while linha[I_LINHA] != '\n':
        while linha[I_LINHA] == '>' or linha[I_LINHA] == ' ' or linha[I_LINHA] == ':' or linha[I_LINHA] == '=' or \
                linha[I_LINHA] == '|':
            I_LINHA += 1
        if linha[I_LINHA] == '\n':
            break
        term = linha[I_LINHA]
        if term not in ALFABETO and term != 'ε':
            ALFABETO.append(term)
        I_LINHA += 1

        if linha[I_LINHA] == '<':
            I_LINHA += 1
            nao_term = split_nt(linha)
            I_LINHA += 1
            nao_terminal(std, term, nao_term)

        else:
            if term == 'ε':
                for i in ESTADOS:
                    if i.rotuloGr == std:
                        i.final = True
                        if CONT_GRAMM > 1:
                            i.tipo = 1
                        else:
                            i.tipo = 0
            terminal(std, term)
コード例 #7
0
ファイル: main.py プロジェクト: TADebastiani/COMPILADORES
def determinizar():
    global AFND, AFD, CONT_ESTADO
    CONTADOR = 0
    fila = []
    fila_aux = []
    lista = []
    lista.append(AFND[0].rotulo)
    fila.append(lista)
    fila_aux.append(lista)
    while fila:
        est = Estado()
        est.rotulo = CONTADOR
        CONTADOR += 1
        for j in ALFABETO:
            cont = 0
            trans = Transicao()
            trans.rotulo = j
            for i in fila[0]:
                if AFND[i].final:
                    est.final = True
                if AFND[i].inicial:
                    est.inicial = True
                if AFND[i].eh_token:
                    est.eh_token = True
                if not AFND[i].eh_token:
                    if AFND[i].tipo == 0:
                        est.tipo = 0
                    else:
                        est.tipo = 1
                for k in AFND[i].transicoes:
                    if k.rotulo == j:
                        for l in k.transicoes:
                            if l not in trans.transicoes:
                                trans.transicoes.append(l)
                                trans.transicoes.sort()
            if trans.transicoes not in fila_aux:
                if trans.transicoes:
                    fila.append(trans.transicoes)
                    fila_aux.append(trans.transicoes)
            for c in fila_aux:
                if c == trans.transicoes:
                    trans.trans = cont
                cont += 1
            est.transicoes.append(trans)
        AFD.append(est)
        fila.pop(0)
コード例 #8
0
ファイル: afnd.py プロジェクト: TADebastiani/COMPILADORES
    def __init__(self, arquivo):
        self._count_estado = 0
        self._count_gramatica = 0
        self.estados = []
        self.alfabeto = []

        for linha in arquivo:
            if linha[len(linha) - 1] != '\n':
                linha = linha + '\n'
            if not self.estados:
                est = Estado()
                est.rotulo = self._count_estado
                est.inicial = True
                est.rotuloGr = 'S'
                self.estados.append(est)
                self._count_estado += 1
            elif linha[0] == '<' and linha[1] != '=' and linha[1] != '\n':
                self._le_gramatica(linha)
コード例 #9
0
ファイル: main.py プロジェクト: TADebastiani/COMPILADORES
def insere_estado_erro():
    global AFD

    est = Estado()
    est.rotulo = len(AFD)
    est.rotuloGr = 'X'
    est.final = True
    AFD.append(est)
    for _ in ALFABETO:
        trans = Transicao()
        trans.trans = est.rotulo
        est.transicoes.append(trans)

    for i in AFD:
        for j in i.transicoes:
            if j.trans == -1:
                j.trans = est.rotulo
    for i in AFD:
        trans = Transicao()
        trans.trans = est.rotulo
        i.transicoes.append(trans)