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
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()
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)
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)
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)
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)
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)
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)
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)