// Written by retoor@molodetz.nl

// This code defines an abstract syntax tree (AST) for a scripting language, implements AST node creation, and attempts to parse tokens from
// a lexer.

// No additional imports or includes are used outside of the provided rlexer.c file.

// MIT License

#include "rlexer.c"

typedef enum rip_ast_type_t { RIP_NONE = 0, RIP_BLOCK, RIP_CALL, RIP_LITERAL } rip_ast_type_t;

typedef struct rip_ast_t {
    struct rip_ast_t *children;
    struct rip_ast_t *next;
    struct rip_ast_t *previous;
    rip_ast_type_t type;
} rip_ast_t;

rip_ast_t *rip_ast_new() {
    rip_ast_t *ast = malloc(sizeof(rip_ast_t));
    ast->children = NULL;
    ast->next = NULL;
    ast->previous = NULL;
    ast->type = RIP_NONE;
    return ast;
}

rip_ast_t *rip_parse() {
    rtoken_t token = rlex_next();
    if (token.type == RT_CURLY_BRACE_OPEN) {
        rip_ast_t *ast = rip_ast_new();
        while (1) {
            rip_ast_t *statement = rip_parse();
        }
    }
    return NULL;
}

int main() {
    char *script = "{print(\"test\")}";
    rlex(script);
    while (1) {
        rtoken_t token = rlex_next();
        if (token.type == RT_CURLY_BRACE_OPEN) {
            // handle open
        }
    }
    return 0;
}