def search(self,key):
		"""
		wrapper func that starts a rule search on the linked list.
		"""
		node=self.start
		self.currentRule=key.split(' ')
		self.matchedTerms=[]
		
		parseResult=self.matched2(node,0,False,False)


		if parseResult==0 :
			return 0
		elif parseResult==-1:
			logger.misc_debug(self,"error","search():: some error happed and matched() returned error!")
			return -1
		else:
			return self.matchedTerms
	def depthFirstTrav(self,node,attributeKey=None):
		"""
		depth first traversal is used to get all the node tags in order.
		"""
		if not attributeKey:
			if node == None:
				sys.stderr.write("tree empty!!!")
				return 0
			if len(node.children)==0:
				sys.stdout.write(node.term.encode("utf-8"))
				return 1
			else:
				sys.stdout.write(node.term+'(')
				for c_index in range(len(node.children)):
					if c_index == (len(node.children) - 1):
						self.depthFirstTrav(node.children[c_index])
						sys.stdout.write(')')
					else:
						self.depthFirstTrav(node.children[c_index])
						sys.stdout.write(', ')
		
				
				return 1
		else:
			if node == None:
				logger.misc_debug(self,"critical","TREE EMPTY!!! :P")
				return 0
			if len(node.children)==0:
				self.currentTrans+=node.attribute[attributeKey].encode("utf-8")+" "

				return 1
			else:
				for c_index in range(len(node.children)):
					if c_index == (len(node.children) - 1):
						self.depthFirstTrav(node.children[c_index],attributeKey)
					else:
						self.depthFirstTrav(node.children[c_index],attributeKey)
		
				
				return 1
	def parse(self,grammar,traceReduction=True):
		"""
		parses the input(as a list) based on `grammar`

		"""
	#and let the parsing begin
		mainLoopIter=0
		while(True):
			mainLoopIter+=1
			logger.parser_debug(self,"__________________________________main loop: %%__",mainLoopIter)
			reduce=None
			match=None
			dist=None
			for k,v in grammar.items():
				logger.parser_debug(self,"\tSTART SEARCH FOR:%%",k)
				matchedTerms=self.search(k)
				if matchedTerms!=-1 and matchedTerms!=0:
					logger.parser_debug(self,"\tMATCH FOUND, rule= %%",k)
					terms=''
					for term in matchedTerms:
						terms+=term.term+' '
					logger.parser_debug(self,"\tMATCHED TERMS ARE..%%",terms)
					logger.parser_debug(self,"\tABOVE TERMS SHALL REDUCE TO: %%",v)
					if v=='START' and not self.start.next == None:
						continue
					d=self.distToStart(matchedTerms)
					logger.parser_debug(self,"\tDISTANCE of the TERMS: %%",d)
					if dist==None or d<dist:#implements the left to right scanning of inputs
						dist=d
						logger.parser_debug(self,"\tTHIS MATCH IS MORE TO THE LEFT THAN PREVIOUS\nCHOOSING THIS(policy:left - right scanning)")
						match=matchedTerms
						reduce=v
					elif d==dist:
						if len(matchedTerms)>len(match):#implements the policy of choosing the longest reduction
							match=matchedTerms
							logger.parser_debug(self,"\tTHIS MATCH IS AT SAME DIST TO PREVIOUS BUT IS LONGER THAN PREVIUOS\n CHOOSING THIS(policy: use longest match)")
							reduce=v
						elif len(matchedTerms)==len(match):#possibly this will never happen..as all(not really..:P) ambigous rules are elimintaed in ruleTable expansion
							match=matchedTerms
							logger.parser_debug(self,"\tTHIS MATCH IS AT SAME DIST TO PREVIOUS AS WELL AS HAS SAME LENGHTH..AMBIGUITY!")
							reduce=v
					
						
				else:
					logger.parser_debug(self,"\tSEARCH RETURNS FALSE")	
					pass
			if reduce =='START':
				logger.parser_debug(self,"\tSUCCESS: REDUCTION COMPLETED")
				break
			if match==None:
				logger.misc_debug(self,"error","\tREDUCTION FAILED!!!")
				return False
			matchedString=''
			for term in match:
				matchedString+=term.term+' '

			logger.parser_debug(self,"\tTHIS MATCH FINALLY CHOSEN FOR REDUCTION!!: matched=%%  reduced=%%\n",matchedString,reduce)
			self.insert(reduce,match)
			
			if traceReduction:
				#self.printList()
				#print ""
				pass
			logger.parser_debug(self,"\n")

		return True