Example #1
0
    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'"
            ))