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