def __init__(self, char, start=None, finish=None): # constructor makes a simple start node and accept state connected by an edge node_generator = NodeGenerator.getInstance() if (start == None): self.start_node = node_generator.make_node(isStart=True) self.accept_state = node_generator.make_node(isFinish=True) self.start_node.add_destination_node(char, self.accept_state) self.all_accept_states = [] else: # make custom non-simple graphs (like ones after operations) self.start_node = start self.accept_state = finish self.start_node.add_destination_node(char, self.accept_state) self.all_accept_states = []
def keenClosure(graph): """ uses the kleen closure operator on a graph to produce a new graph using thompson algorithm :param graph: a graph :return: """ n = NodeGenerator.getInstance() g = Graph("@") # g.start_node.clearEdges() # repeat more than once graph.accept_state.add_destination_node("@", graph.start_node) # add new finish with edge epsilon graph.accept_state.add_destination_node("@", g.accept_state) graph.accept_state.isFinish = 0 # add new start g.start_node.add_destination_node("@", graph.start_node) graph.start_node.isStart = 0 # repeat zero times return g
def __init__(self, nodes): # sort nodes according to ids nodes = sorted(nodes, key=state.sortHelper) state.state_Nodes.append(nodes) state.state_instances.append(self) self.destinations = {} # we add in it a pair (char,state number) self.id = state.id state.id += 1 @staticmethod def getNodeFromID(self, id): return state.state_instances[id] def getStateNodes(self): return state.state_Nodes[self.id] def addDestination(self, char, state_to): # only 1 state_to for each char, so we dont need a list self.destinations[char] = state_to if __name__ == '__main__': x = NodeGenerator.getInstance() a = x.make_node() b = x.make_node() c = x.make_node() y = state.getState([a, b]) z = state.getState([a, c]) print(z.getStateNodes())