def evaluate(self, t:ParseTree): dummyRoot = ParserRuleContext() dummyRoot.children = [t] # don't set t's parent. work = [dummyRoot] for i in range(0, len(self.elements)): next = set() for node in work: if len( node.children) > 0 : # only try to match next element if it has children # e.g., //func/*/stat might have a token node for which # we can't go looking for stat nodes. matching = self.elements[i].evaluate(node) next |= matching i += 1 work = next return work
def evaluate(self, t: ParseTree): dummyRoot = ParserRuleContext() dummyRoot.children = [t] # don't set t's parent. work = [dummyRoot] for i in range(0, len(self.elements)): next = set() for node in work: if len(node.children) > 0: # only try to match next element if it has children # e.g., //func/*/stat might have a token node for which # we can't go looking for stat nodes. matching = self.elements[i].evaluate(node) next |= matching i += 1 work = next return work
def evaluate(self, t: ParseTree): dummyRoot = ParserRuleContext() dummyRoot.children = [t] # don't set t's parent. work = [dummyRoot] for element in self.elements: work_next = list() for node in work: if not isinstance(node, TerminalNode) and node.children: # only try to match next element if it has children # e.g., //func/*/stat might have a token node for which # we can't go looking for stat nodes. matching = element.evaluate(node) # See issue antlr#370 - Prevents XPath from returning the # same node multiple times matching = filter(lambda m: m not in work_next, matching) work_next.extend(matching) work = work_next return work