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