コード例 #1
0
ファイル: parser.py プロジェクト: tvanicraath/scaladoll
    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())
コード例 #2
0
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)
コード例 #3
0
def expr_as_float(bool: Token) -> BooleanBox:
    return BooleanBox(bool.getstr())
コード例 #4
0
def not_dotted_name(name: Token) -> NameBox:
    value = name.getstr()
    return NameBox(unquote_name(value))
コード例 #5
0
def expr_as_integer(integer: Token) -> IntegerBox:
    return IntegerBox(integer.getstr())
コード例 #6
0
def expr_as_float(float_num: Token) -> FloatBox:
    return FloatBox(float_num.getstr())
コード例 #7
0
def expr_as_string(string: Token) -> StringBox:
    return StringBox(string.getstr()[1:-1].replace("\'", "'"))
コード例 #8
0
def optional_limit(_, limit: Token) -> list:
    return [int(limit.getstr()), None]
コード例 #9
0
def optional_limit_with_offset(_l, limit: Token, _o, offset: Token) -> list:
    return [int(limit.getstr()), int(offset.getstr())]
コード例 #10
0
ファイル: ast.py プロジェクト: zjl233/moe
 def __init__(self, left, opt: Token, right):
     self.left = left
     self.opt = opt.getstr()
     self.right = right
コード例 #11
0
ファイル: ast.py プロジェクト: zjl233/moe
 def __init__(self, value: Token):
     self.value = int(value.getstr())