def parse(self, parse_until=None):
		if parse_until is None:
			parse_until = []
		
		nodelist = self.create_nodelist()
		while self.tokens:
			token = self.next_token()
			# We only need to parse var and block tokens.
			if token.token_type == TOKEN_VAR:
				if not token.contents:
					self.empty_variable(token)
				
				filter_expression = self.compile_filter(token.contents)
				var_node = self.create_variable_node(filter_expression)
				self.extend_nodelist(nodelist, var_node,token)
			elif token.token_type == TOKEN_BLOCK:
				if token.contents in parse_until:
					# put token back on token list so calling code knows why it terminated
					self.prepend_token(token)
					return nodelist
				
				try:
					command = token.contents.split()[0]
				except __HOLE__:
					self.empty_block_tag(token)
				
				if (self.allow and command not in self.allow) or (self.disallow and command in self.disallow):
					self.disallowed_tag(command)
				
				self.enter_command(command, token)
				
				try:
					compile_func = self.tags[command]
				except KeyError:
					self.invalid_block_tag(token, command, parse_until)
				
				try:
					compiled_result = compile_func(self, token)
				except TemplateSyntaxError, e:
					if not self.compile_function_error(token, e):
						raise
				
				self.extend_nodelist(nodelist, compiled_result, token)
				self.exit_command()
		
		if parse_until:
			self.unclosed_block_tag(parse_until)
		
		return nodelist
dataset/ETHPy150Open ithinksw/philo/philo/validators.py/TemplateValidationParser.parse