def atom(self): res = ParseResult() tok = self.current_tok if tok.type in (Lexer.TT_INT, Lexer.TT_FLOAT): res.register_advancement() self.advance() return res.success(Lexer.NumberNode(tok)) elif tok.type == Lexer.TT_STRING: res.register_advancement() self.advance() return res.success(Lexer.StringNode(tok)) elif tok.type == Lexer.TT_IDENTIFIER: res.register_advancement() self.advance() return res.success(Lexer.VarAccessNode(tok)) elif tok.type == Lexer.TT_LPAREN: res.register_advancement() self.advance() expr = res.register(self.expr()) if res.error: return res if self.current_tok.type == Lexer.TT_RPAREN: res.register_advancement() self.advance() return res.success(expr) else: return res.failure( Lexer.InvalidSyntaxError( self.current_tok.pos_start, self.current_tok.pos_end, "Mengharapkan seperti (senja kala itu) ')'")) elif tok.type == Lexer.TT_LSQUARE: list_expr = res.register(self.list_expr()) if res.error: return res return res.success(list_expr) elif tok.matches(Lexer.TT_KEYWORD, 'Ketika_nada'): if_expr = res.register(self.if_expr()) if res.error: return res return res.success(if_expr) elif tok.matches(Lexer.TT_KEYWORD, 'Untuk_kita'): for_expr = res.register(self.for_expr()) if res.error: return res return res.success(for_expr) elif tok.matches(Lexer.TT_KEYWORD, 'Sedangkan'): while_expr = res.register(self.while_expr()) if res.error: return res return res.success(while_expr) elif tok.matches(Lexer.TT_KEYWORD, 'Fungsi'): func_def = res.register(self.func_def()) if res.error: return res return res.success(func_def) return res.failure( Lexer.InvalidSyntaxError( tok.pos_start, tok.pos_end, "Mengharapkan seperti (senja kala itu) int, float, identifier, '+', '-', '(', '[', 'Ketika_nada', 'Untuk_kita', 'Sedangkan', 'Fungsi'" ))