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 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_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 __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)