Exemplo n.º 1
0
def parse_params(tokens):
    lparen = FP.FirstParser.pop_next_token(tokens)
    if not isinstance(lparen, LParen):
        raise ParserException(LParen, lparen)

    #TODO params
    params = []

    rparen = FP.FirstParser.pop_next_token(tokens)
    if not isinstance(rparen, RParen):
        raise ParserException(RParen, rparen)
    return params
Exemplo n.º 2
0
def parse_function(type, tokens):
    name = FP.FirstParser.pop_next_token(tokens)
    if not isinstance(name, Identifier):
        raise ParserException(Identifier, name)
    name = IdentifierObject(name)
    params = parse_params(tokens)
    lbrace = FP.FirstParser.pop_next_token(tokens)
    if not isinstance(lbrace, LBrace):
        raise ParserException(LBrace, lbrace)

    statements = parse_statements(tokens)

    rbrace = FP.FirstParser.pop_next_token(tokens)
    if not isinstance(rbrace, RBrace):
        raise ParserException(RBrace, rbrace)

    return FunctionObject((type, name, params, statements))
Exemplo n.º 3
0
def parse_statements(tokens):
    statements = []
    current = FP.FirstParser.pop_next_token(tokens)
    if isinstance(current, Return):
        statements.append(parse_return(tokens))
    else:
        raise ParserException(Return, current)

    return statements
Exemplo n.º 4
0
def parse_UnOp(token, tokens):
    if isinstance(token, Negation):
        return parse_negation(tokens)
    elif isinstance(token, LogicalNegation):
        return parse_logical_negation(tokens)
    elif isinstance(token, Bitwise):
        return parse_bitwise(tokens)

    raise ParserException(UnOp, token)
Exemplo n.º 5
0
def parse_factor(tokens):
    next_token = FP.FirstParser.pop_next_token(tokens)
    if isinstance(next_token, LParen):
        return_expression = parse_expression(tokens)
        next_token = FP.FirstParser.pop_next_token(tokens)
        if isinstance(next_token, RParen):
            return return_expression

        raise ParserException(RParen, next_token)

    elif isinstance(next_token, UnOp):
        return parse_UnOp(next_token, tokens)
    elif isinstance(next_token, Constant):
        return parse_constant(next_token, tokens)
    elif isinstance(next_token, Semicolon):
        return SemicolonObject(tokens)

    raise ParserException('Factor', next_token)
Exemplo n.º 6
0
    def parseProgram(self, tokens):
        current = FirstParser.pop_next_token(tokens)
        if isinstance(current, SOF):
            self._objects.append(PF.parse_SOF(tokens))
        else:
            raise ParserException(SOF, current)

        while not isinstance(self._objects[-1], EOFObject):
            current = FirstParser.pop_next_token(tokens)

            if isinstance(current, Type):  #Function
                self._objects.append(
                    PF.parse_function(TypeObject(current), tokens))
            elif isinstance(current, EOF):  #End of file
                self._objects.append(PF.parse_EOF(tokens))

            else:
                raise ParserException('Unknown', current)

        return self._objects
Exemplo n.º 7
0
def parse_constant(constant, tokens):
    if not isinstance(constant, Constant):
        raise ParserException(Constant, constant)
    return ConstantObject(constant)
Exemplo n.º 8
0
def parse_return(tokens):
    return_statement = ReturnObject(parse_expression(tokens))
    next_token = FP.FirstParser.pop_next_token(tokens)
    if not isinstance(next_token, Semicolon):
        raise ParserException(Semicolon, next_token)
    return return_statement