def get_nfa(self, idgenerator): left = self.childs[0] right = self.childs[1] left_nfa = left.get_nfa(idgenerator) right_nfa = right.get_nfa(idgenerator) start, accept = idgenerator.nextID(), idgenerator.nextID() root_nfa = NFA().startState(start).acceptState(accept) root_nfa.append([left_nfa, right_nfa]) for sub_nfa in [left_nfa, right_nfa]: root_nfa.addTransitions(start, EPSILON, sub_nfa.start) root_nfa.addTransitions(sub_nfa.accept, EPSILON, accept) return root_nfa
def get_nfa(self, idgenerator): start = idgenerator.nextID() nfa_v = NFA().startState(start) cur_state = nfa_v.start for c in self.childs: if isinstance(c, Primitive): next_state = idgenerator.nextID() nfa_v.addTransitions(cur_state, c.text(), next_state) cur_state = next_state else: sub_nfa = c.get_nfa(idgenerator) nfa_v.addTransitions(cur_state, EPSILON, sub_nfa.start) cur_state = sub_nfa.accept nfa_v.addSingle(sub_nfa) nfa_v.acceptState(cur_state) return nfa_v
def get_nfa(self, idgenerator): start = idgenerator.nextID() accept = start root_nfa = NFA().acceptState(accept).startState(start) if self.isChildSimpleOrAST(): ## convert simple orAst "0|1" to 0,1 symbol = self.child.__repr__().replace("|", ",") root_nfa.addTransitions(start, symbol, accept) elif isinstance(self.child, Primitive): root_nfa.addTransitions(start, self.child.text(), start) else: sub_nfa = self.child.get_nfa(idgenerator) root_nfa.addSingle(sub_nfa) root_nfa.addTransitions(start, EPSILON, sub_nfa.start) root_nfa.addTransitions(sub_nfa.accept, EPSILON, accept) return root_nfa