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
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))
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
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)
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)
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
def parse_constant(constant, tokens): if not isinstance(constant, Constant): raise ParserException(Constant, constant) return ConstantObject(constant)
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