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