def parse(self, tokenizer, state=None): from rply.token import Token lookahead = None lookaheadstack = [] statestack = [0] symstack = [Token("$end", "$end")] current_state = 0 while True: if self.lr_table.default_reductions[current_state]: t = self.lr_table.default_reductions[current_state] current_state = self._reduce_production(t, symstack, statestack, state) continue if lookahead is None: if lookaheadstack: lookahead = lookaheadstack.pop() else: try: lookahead = next(tokenizer) except StopIteration: lookahead = None if lookahead is None: lookahead = Token("$end", "$end") ltype = lookahead.gettokentype() if ltype in self.lr_table.lr_action[current_state]: t = self.lr_table.lr_action[current_state][ltype] if t > 0: statestack.append(t) current_state = t symstack.append(lookahead) lookahead = None continue elif t < 0: current_state = self._reduce_production(t, symstack, statestack, state) continue else: n = symstack[-1] return n else: # TODO: actual error handling here if self.error_handler is not None: if state is None: self.error_handler(lookahead) else: self.error_handler(state, lookahead) raise AssertionError("For now, error_handler must raise.") else: print "[Parsing Error] at '"+lookahead.getstr()+"' (Line: "+str(lookahead.getsourcepos())+")" raise ParsingError(None, lookahead.getsourcepos())
def dotted_name(left: Token, _, right: Token) -> NameBox: left_name = unquote_name(left.getstr()) right_name = unquote_name(right.getstr()) return NameBox(right_name, table_value=left_name)
def expr_as_float(bool: Token) -> BooleanBox: return BooleanBox(bool.getstr())
def not_dotted_name(name: Token) -> NameBox: value = name.getstr() return NameBox(unquote_name(value))
def expr_as_integer(integer: Token) -> IntegerBox: return IntegerBox(integer.getstr())
def expr_as_float(float_num: Token) -> FloatBox: return FloatBox(float_num.getstr())
def expr_as_string(string: Token) -> StringBox: return StringBox(string.getstr()[1:-1].replace("\'", "'"))
def optional_limit(_, limit: Token) -> list: return [int(limit.getstr()), None]
def optional_limit_with_offset(_l, limit: Token, _o, offset: Token) -> list: return [int(limit.getstr()), int(offset.getstr())]
def __init__(self, left, opt: Token, right): self.left = left self.opt = opt.getstr() self.right = right
def __init__(self, value: Token): self.value = int(value.getstr())