def alt(self): (first, transitions) = self.concat() branch_node = None # alt_tail while self.match('|'): (second, snd_transitions) = self.concat() if branch_node == None: branch_node = Node() branch_node.add_epsilon_transition(first) branch_node.add_epsilon_transition(second) transitions += snd_transitions self.append_postfix('|') if branch_node == None: return (first, transitions) else: return (branch_node, transitions)
def quant(self): (first, transitions) = self.paren() # quant_tail res = self.match('+', '?', '*') if res: self.append_postfix(res) if res == '*': loop_node = Node() for n in transitions: n.attach_destination(loop_node) loop_node.add_epsilon_transition(first) transition = Transition(loop_node, None) return (loop_node, List(transition)) elif res == '+': loop_node = Node() for tr in transitions: tr.attach_destination(loop_node) loop_node.add_epsilon_transition(first) out_transition = Transition(loop_node, None) return (first, List(out_transition)) elif res == '?': skip_node = Node() skip_node.add_epsilon_transition(first) return (skip_node, transitions + List(Transition(skip_node, None))) return (first, transitions)