Exemple #1
0
	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)
Exemple #2
0
	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)