Exemplo n.º 1
0
def generarSubConjuntosIteracion(estadoPivote, NFA, estados, lenguaje):

    for letra in lenguaje:
        # mover dado un Estado y una letra
        mover = t.mover(NFA, estados[estadoPivote].getEstados(), letra)

        if (len(mover) > 0):
            # Calcular e_cerradura
            e_cerraduraTemp, _ = t.e_cerradura(NFA, mover)
            e_cerraduraTemp = list(set(e_cerraduraTemp))

            # Se revisa si el estado generado es nuevo o existente
            estadoControl, idEstado = isNuevoEstado(estados, e_cerraduraTemp)

            if (estadoControl):
                # Ya existe un estado igual,
                # se crea relacion
                estados[estadoPivote].agregarRelacion(
                    ns.RelacionSubconjuntos(estadoPivote, letra, idEstado))
            else:
                nuevoEstadoLetraId = nextLetraId()
                estados[nuevoEstadoLetraId] = ns.NodoSubconjuntos(
                    False, e_cerraduraTemp)
                estados[estadoPivote].agregarRelacion(
                    ns.RelacionSubconjuntos(estadoPivote, letra,
                                            nuevoEstadoLetraId))

    return estados
Exemplo n.º 2
0
    def postOrder(self, Node):
        '''
        Recorre el arbol de forma postoperden
        y va construyendo los NFA usando el 
        algoritmo de Thompson

        Parametros
        ----------
        Node: Obj Node
            Nodo raiz del arbol

        '''

        # Si no existe raiz no seguimos
        if (Node == None):
            return

        # Ejecutamos postOrden en los nodos hijos
        self.postOrder(Node.getLeft())
        self.postOrder(Node.getRight())

        if (Node.getValue() in self.operadores):

            # Si el nodo actual es un Operadores
            if (Node.getValue() == '|'):
                NFA1 = self.pila[len(self.pila) - 1]
                NFA2 = self.pila[len(self.pila) - 2]

                self.pila.pop()
                self.pila.pop()

                self.pila.append(t.construirOr(NFA1, NFA2))

            if (Node.getValue() == '*'):
                NFA1 = self.pila[len(self.pila) - 1]
                NFA2 = self.pila[len(self.pila) - 2]

                self.pila.pop()
                self.pila.pop()

                self.pila.append(t.construirKleen(NFA2))

            if (Node.getValue() == '.'):
                NFA1 = self.pila[len(self.pila) - 1]
                NFA2 = self.pila[len(self.pila) - 2]

                self.pila.pop()
                self.pila.pop()

                self.pila.append(t.construirConcatenacion(NFA2, NFA1))

        else:
            # Si el nodo actual no es un operador
            self.pila.append(t.construirUnSimbolo(Node.getValue()))
Exemplo n.º 3
0
def run():
    str_ = e.get()
    # graph = Graph()
    thom = Thompson(str_)
    g = thom.get_nfa()
    # nfa显示窗口
    nfa_win = tk.Tk("算法构造nfa")
    nfa_win.title("算法构造nfa")
    # nfa_win.geometry()
    t_nfa = tk.Text(nfa_win)
    for edge in g.edges:
        t_nfa.insert("end", edge.__str__())
        # t_nfa.insert("end","testts")
    t_nfa.pack()
    # nfa_win.mainloop()

    dfa_graph, chart = NfaToDfa(g).get_dfa()
    # 转移表
    tran_win = tk.Tk("转移表")
    tran_win.title("转移表")
    # nfa_win.geometry()
    t_chart = tk.Text(tran_win)
    t_chart.insert("end", chart)
    # t_nfa.insert("end","testts")
    t_chart.pack()

    # dfa显示窗口
    dfa_win = tk.Tk("nfa转dfa")
    dfa_win.title("nfa转dfa")
    # nfa_win.geometry()
    t_dfa = tk.Text(dfa_win)
    for edge in dfa_graph.edges:
        t_dfa.insert("end", edge.__str__())
        # t_nfa.insert("end","testts")
    t_dfa.pack()
    print(g)
    # draw(g)
    draw(dfa_graph)
    print(dfa_graph)
 def make_dead_state(dfa, input_symbols):
     dead_state = DfaState([Thompson.Nfa(None)], 'DEAD')
     dead_state.is_accept = False
     for symbol in input_symbols:
         dead_state.trans[symbol] = dead_state
     went_to_dead_state = False
     for Dstate in dfa.Dstates:
         for symbol in input_symbols:
             if not Dstate.trans.get(symbol):
                 Dstate.trans[symbol] = dead_state
                 if not went_to_dead_state:
                     went_to_dead_state = True
     if went_to_dead_state:
         dfa.Dstates.append(dead_state)
Exemplo n.º 5
0
def generarSubConjuntos(NFA):
    lenguaje = t.getLenguaje(NFA)
    estados = {}
    estadosRevisados = []  # los estados que ya se revisaron

    idNodoInicial, _ = t.getIdNodoInicio(NFA)

    # e-cerradura del estado inicial
    e_cerraduraTemp, _ = t.e_cerradura(NFA, [idNodoInicial])

    estados[nextLetraId()] = ns.NodoSubconjuntos(True,
                                                 list(set(e_cerraduraTemp)))

    # Se itera hasta quedarse sin estados por procesar
    while (len(colaLetrasId) > 0):

        estados = generarSubConjuntosIteracion(getLetraIdActual(), NFA,
                                               estados, lenguaje)

    # Se definen los estados finales
    idNodoFinal, _ = t.getIdNodoFin(NFA)
    estados = ns.setEstadosFinales(estados, idNodoFinal)

    return estados
        dead_state = DfaState([Thompson.Nfa(None)], 'DEAD')
        dead_state.is_accept = False
        for symbol in input_symbols:
            dead_state.trans[symbol] = dead_state
        went_to_dead_state = False
        for Dstate in dfa.Dstates:
            for symbol in input_symbols:
                if not Dstate.trans.get(symbol):
                    Dstate.trans[symbol] = dead_state
                    if not went_to_dead_state:
                        went_to_dead_state = True
        if went_to_dead_state:
            dfa.Dstates.append(dead_state)


W = Thompson.State('W')
X = Thompson.State('X')
Y = Thompson.State('Y')
Z = Thompson.State('Z')
E = Thompson.State('e')
F = Thompson.State('f')

W.data['trans']['a'] = X
W.data['trans']['b'] = Y
X.data['trans']['E'] = Z
Y.data['trans']['c'] = Z
Z.data['trans']['E'] = W

nfa = Thompson.Nfa('q')
nfa.name = 'hoppa'
nfa.states = [W, X, Y, Z]
Exemplo n.º 7
0
import shuntingReg
import Thompson

if __name__ == "__main__":
    tests = [["(a.b|b*)", ["ab", "b", "bb", "a"]],
             ["a.(b.b)*.a", ["aa", "abba", "aba"]]]
    a_list = []

    myfile = open("graphTextFile.txt", "r")
    for element in myfile:
        oneLine = element.strip()
        full_line = oneLine.split()
        a_list.append(full_line)
    myfile.close()

    for test in tests:
        infix = test[0]
        print(f"infix:    {infix}")
        postfix = shuntingReg.shunt(infix)
        print(f"postfix:  {postfix}")
        nfa = Thompson.re_to_nfa(postfix)
        print(f"Thompson: {nfa}")
        for s in test[1]:
            match = nfa.match(s)
            print(f"Match '{s}': {match}")
        print()
Exemplo n.º 8
0
#             graph.add_edge(edge)
#             # 初始节点连接结束节点
#             new_node = graph.get_new_state()
#             edge = Edge(new_node, save_state, "初始节点连接结束节点")
#             graph.add_edge(edge)
#             # 初始连接连接内部开始节点
#             edge = Edge(new_node, inner_begin, "初始连接连接内部开始节点")
#             graph.add_edge(edge)
#         else:
#             edge = link(scaner)
#             graph.add_edge(edge)
#
#     return begin

if __name__ == '__main__':

    str = input("请输入正规式:\n")

    # graph = Graph()
    thom = Thompson(str)
    g = thom.get_nfa()
    print(g)
    print(g.start_state)
    draw()
    dfa_graph = NfaToDfa(g).get_dfa()
    print(dfa_graph)
    # if stack.front() != '|' != '(' != ')':
    #     graph.get_new_state()
    # scan(0)
    # print(graph)
Exemplo n.º 9
0
     Alg = Semibandits.EpsGreedy(S,
                                 learning_alg=learning_alg,
                                 classification=False)
     if Args.param is not None:
         start = time.time()
         (r, reg, val_tmp) = Alg.play(Args.T,
                                      verbose=True,
                                      params={
                                          'eps': Args.param,
                                          'train_all': True,
                                          'schedule': 'lin'
                                      })
         stop = time.time()
 if Args.alg == 'thompson':
     import Thompson
     Alg = Thompson.Thompson(S)
     if Args.param is not None:
         start = time.time()
         (r, reg, val_tmp) = Alg.play(Args.T,
                                      verbose=True,
                                      params={'lambda': Args.param})
         stop = time.time()
 if Args.alg == 'bag':
     import LangevinCB, NNModels
     Alg = LangevinCB.BagCB(S)  # , model=NNModels.TwoLayer)
     if Args.param is not None:
         start = time.time()
         (r, reg, val_tmp) = Alg.play(Args.T,
                                      verbose=True,
                                      params={'lr': Args.param},
                                      loss=Args.loss)
Exemplo n.º 10
0
    return estados


def simularNFD(NFD, cadena):
    s = ns.getEstadosIniciales(NFD)[0]

    for i in cadena:
        if (s == []):
            break
        s = ns.mover(NFD[s], i)

    # Si la interseccion de S y los estados finales no es vacia
    # Entonces se acepta la cadena
    if (list(set.intersection(set(s), set(ns.getEstadosFinales(NFD)))) != []):
        return "SI"
    else:
        return "NO"


if __name__ == '__main__':

    NFA1 = t.construirUnSimbolo("a")
    NFAKleen = t.construirKleen(NFA1)
    NFA2 = t.construirUnSimbolo("b")

    NFAOR = t.construirOr(NFAKleen, NFA2)

    generarSubConjuntos(NFAOR)

    #g.visualizarNFA(NFAOR)
Exemplo n.º 11
0
	if temp != -1:
		temp2 = posicion(nodos,transiciones[i][2])
		if temp2 != -1:
			nodos[temp].agregar_transicion(transiciones[i][1],temp2)

i = 0
for i in range(0,len(nodos)):
	temp = completar(simbolos,simbolos_transitivos(nodos[i],simbolos))
	j = 0
	for j in range(0,len(temp)):
		nodos[i].agregar_transicion(temp[j],estados.index(-1))
imprimir_tabla(nodos,simbolos)

Nuevos_estados = []
estados_alcanzables = [str(estados[inicial[0]])]
estados_alcanzables += Thompson.Cerradura_E(transiciones,str(estados[inicial[0]]))
Nuevos_estados.append(Thompson.Estado_AFD('A',estados_alcanzables,0))

bandera = 1
while bandera != 0:
	bandera = 0
	i = 0
	for i in range(0,len(Nuevos_estados)):
		j = 0
		for j in range(0,len(simbolos)):
			estados_alcanzables = Thompson.Ir_a(transiciones,simbolos[j],Nuevos_estados[i])
			if Thompson.analisis(Nuevos_estados,estados_alcanzables):
				letra = chr(ord(Nuevos_estados[len(Nuevos_estados) - 1].simbolo) + 1)
				if Thompson.final(final,estados_alcanzables,estados):
					Nuevos_estados.append(Thompson.Estado_AFD(letra,estados_alcanzables,2))
				else: