def _or_(self): nextChar = self.parser._next_for_plugin_ match = self.parser._match_for_plugin_ char = nextChar() stack = [] while char != ']': node = self._range_() char = nextChar() if char == '&': match('&') match('&') another = self._range_() node = AndNode(node, another) stack.append(node) char = nextChar() match(']') orNode = OrNode(stack) # OR node can not be empty assert orNode.asts debug(orNode) return orNode
def parse(self, regex): self._reset_() self._string_ = regex self._push_op_(('EOF', 'EOF')) while not self._done_(): self._read_() if self._need_insert_concat_(): self._rollback_() self._lookahead_ = 'concat', 'concat' cmp = self._compare_(self._peek_op_(), self._lookahead_) while cmp > 0: # Pop until top of stack is less than the input op = self._pop_op_() debug('pop ', op) assert op[0] in RegexParser._OP_FUNCTIONS_ RegexParser._OP_FUNCTIONS_[op[0]](self, op[1]) cmp = self._compare_(self._peek_op_(), self._lookahead_) if cmp == 0: op = self._pop_op_() debug('pop ', op) else: self._push_op_(self._lookahead_) debug('push ', self._lookahead_) start = self._cleanup_() assert not self._operators_ assert not self._operands_ return NFAAutomaton(start)
def _compare_(self, a, b): pTopOp = RegexParser._PRIORITY_[a[0]][0] pInputOp = RegexParser._PRIORITY_[b[0]][1] debug('cmp [', a[0], ',', b[0], ']=', pTopOp - pInputOp) return pTopOp - pInputOp
def _plugin_set_(self): debug('processing set') regexSet = RegexSet(self) return 'char', SetNFAState(regexSet._set_())