def determinise(automate: Automaton):
    automateDet = Automaton("deterministe")
    automateDet.initial = automate.initial
    listeEtats = []
    listeEtats.append(set([automate.initial.name]))
    listeEtatsNew = listeEtats
    print(listeEtats)
    while len(listeEtats) != 0:
        elt1 = listeEtats[0]
        listeEtats = listeEtats[1:]
        for elt11 in elt1:
            for x in automate.alphabet:
                EtatDest = []
                for (source, symbol, destination) in automate.transitions:
                    if source == str(elt11) and symbol == x:
                        EtatDest.append(destination)
                if (len(EtatDest) != 0) and EtatDest not in listeEtatsNew:
                    listeEtats.append(EtatDest)
                    listeEtatsNew.append(EtatDest)
                    automateDet.add_transition(str(elt1), x, str(EtatDest))
    for etat in automate.acceptstates:
        for elt1 in listeEtatsNew:
            if etat in elt1:
                automateDet.make_accept(str(elt1))
    return automateDet
def eliminate_e_trans(
    automate: Automaton
):  # methode pour enlever les espsilon transitions d'un automate
    for l in range(len(automate.transitions)):
        while "%" in automate.transitions[l][1]:
            list_of_ep_trans = stock_of_trans(automate, "%")
            for i in range(len(list_of_ep_trans)):
                etatq = list_of_ep_trans[i][0]
                etatk = list_of_ep_trans[i][2]
                list_des_trans = []
                for k in range(len(automate.transitions)):
                    if automate.transitions[k][0] == etatk:
                        list_des_trans.append(automate.transitions[k])
                for j in range(len(list_des_trans)):
                    automate.add_transition(etatq, list_des_trans[j][1],
                                            list_des_trans[j][2])
                automate.remove_transition(etatq, "%", etatk)
                if etatk in automate.acceptstates:
                    automate.make_accept(etatq)
    for state in automate.statesdict.values():
        while function_de_transition(automate, state, "%") is not None:
            eliminate_e_trans(automate)
    automate.remove_unreachable()
    automate.name = automate.name + " sans e trans"
    return automate
def Automate_in_one_lettre(Char: str) -> automaton:
    nom = get_random_string(4)
    if Char != "%":
        nom = Automaton(nom)
        nom.add_transition("0", Char, "1")
        nom.make_accept("1")
        return nom
    else:
        nom = Automaton(str(nom))
        nom.add_transition("0", "%", "1")
        nom.make_accept("1")
        return nom
Example #4
0
def regexp_to_automaton(re: str) -> Automaton:
    """
    Moore's algorithm: regular expression `re` -> non-deterministic automaton
    """
    postfix = RegExpReader(re).to_postfix()
    stack: List[Automaton] = []
    for c in postfix:
        if c in (".", "+", "*"):
            right = stack.pop()
            left = None
            if c != "*":
                left = stack.pop()
            result = operation(left, right, c)
            stack.append(result)
        else:
            automate = Automaton(c)
            automate.add_transition("0", c, "1")
            automate.make_accept("1")
            stack.append(automate)

    return stack[0]
Example #5
0
def eliminate_e_trans(
    automate: automaton.Automaton
) -> automaton:  # methode pour enlever les espsilon transitions d'un automate
    try:
        for l in range(len(automate.transitions)):
            list_of_ep_trans = stock_e_trans(automate)
            for i in range(len(list_of_ep_trans)):
                etatq = list_of_ep_trans[i][0]
                etatk = list_of_ep_trans[i][2]
                list_des_trans = []
                for k in range(len(automate.transitions)):
                    if automate.transitions[k][0] == etatk:
                        list_des_trans.append(automate.transitions[k])
                for j in range(len(list_des_trans)):
                    automate.add_transition(etatq, list_des_trans[j][1],
                                            list_des_trans[j][2])
                automate.remove_transition(etatq, "%", etatk)
                if etatk in automate.acceptstates:
                    automate.make_accept(etatq)
        while not stock_e_trans(automate) == False:
            eliminate_other_trans(automate)
    finally:
        return automate
                automate.remove_transition(etatq, "%", etatk)
                if etatk in automate.acceptstates:
                    automate.make_accept(etatq)
    for state in automate.statesdict.values():
        while function_de_transition(automate, state, "%") is not None:
            eliminate_e_trans(automate)
    automate.remove_unreachable()
    automate.name = automate.name + " sans e trans"
    return automate


##################
"TEST"
final = Automaton('final')

final.add_transition("0", "%", '1')
final.add_transition("0", "%", '3')
final.add_transition("1", "a", '1')
final.add_transition("3", "b", '3')
final.add_transition("1", "%", '2')
final.add_transition("3", "%", '4')
final.add_transition("2", "b", '2')
final.add_transition("4", "a", '4')
final.add_transition("4", "%", '5')
final.add_transition("2", "%", '5')
final.add_transition("5", "c", "5")
final.make_accept(['0', "1", "2", "3", "4", "5"])

eliminate_e_trans(final).to_graphviz("Test4/final.gv")

test6 = Automaton("test6")