Пример #1
0
 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
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
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)
Пример #4
0
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)
Пример #5
0
    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)
Пример #6
0
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)