예제 #1
0
def parse_dfa(file_path):
    # open file
    f = open(file_path, "r")

    # states
    line = f.readline()
    line = line.replace(" ", "")
    line = line.replace("\n", "")
    states = {}
    tokens = line.split("=")
    if tokens[0] != "S":
        print("Automaton description isn't valid")
        return None
    else:
        tokens[1] = tokens[1].replace("{", "")
        tokens[1] = tokens[1].replace("}", "")
        tokens = tokens[1].split(",")
        for s in tokens:
            states[s] = automata.State(s)
    # alphabet
    line = f.readline()
    line = line.replace(" ", "")
    line = line.replace("\n", "")
    alph = set()
    tokens = line.split("=")
    if tokens[0] != "A":
        print("Automaton description isn't valid")
        return None
    else:
        tokens[1] = tokens[1].replace("{", "")
        tokens[1] = tokens[1].replace("}", "")
        tokens = tokens[1].split(",")
        for a in tokens:
            alph.add(a)
    for s in states.values():
        s.accepted_input = alph

    # initial state
    line = f.readline()
    line = line.replace(" ", "")
    line = line.replace("\n", "")
    tokens = line.split("=")
    if tokens[0] != "I":
        print("Automaton description isn't valid")
        return None
    else:
        initial = tokens[1]

    # end states
    line = f.readline()
    line = line.replace(" ", "")
    line = line.replace("\n", "")
    tokens = line.split("=")
    if tokens[0] != "E":
        print("Automaton description isn't valid")
        return None
    else:
        tokens[1] = tokens[1].replace("{", "")
        tokens[1] = tokens[1].replace("}", "")
        tokens = tokens[1].split(",")
        for e in tokens:
            states[e].is_end_state = True

    # transition function
    number_of_rules = len(states) * len(alph)
    for r in range(number_of_rules):
        line = f.readline()
        line = line.replace(" ", "")
        line = line.replace("\n", "")
        tokens = line.split("=")
        tokens[0] = tokens[0].replace("d", "")
        tokens[0] = tokens[0].replace("(", "")
        tokens[0] = tokens[0].replace(")", "")
        t = tokens[0].split(",")
        if alph.__contains__(t[1]):
            states[t[0]].transitions[t[1]] = tokens[1]
        else:
            print("Automaton description isn't valid")
            return None

    f.close()

    # resulting dfa object
    return automata.DFA(states, alph, initial)