/* * Quark parser. * Turns tokens into an AST (Abstract Syntax Tree). * Copyright (c) 2023-2024, Quinn Stephens and the OSMORA team. * Provided under the BSD 3-Clause license. */ #include #include #include #include #include "debug.h" #include "hashmap.h" #include "parser/type.h" #include "parser/proc.h" #include "parser.h" static void add_builtin(struct hashmap *map, char *name, size_t size) { struct type *type; size_t name_len; name_len = strlen(name); type = malloc(sizeof(struct type)); type->hashmap_entry.hash = hash_data(name, name_len); type->name = name; type->name_len = name_len; type->size = size; type->n_ptrs = 0; hashmap_add(map, &type->hashmap_entry); } void tok_error(struct token *tok, const char *fmt, ...) { va_list ap; fprintf(stderr, "\033[1m%s:%d:%d: \033[31merror:\033[0m ", tok->fname, tok->line, tok->col); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } void tok_warn(struct token *tok, const char *fmt, ...) { va_list ap; printf("\033[1m%s:%d:%d: \033[33mwarning:\033[0m ", tok->fname, tok->line, tok->col); va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } void parser_parse(struct parser *ctx) { debug("Parsing...\n"); next_token(ctx); while (ctx->tok.kind != TK_EOF) { switch (ctx->tok.kind) { case TK_PROC: parse_proc(ctx); break; case TK_TYPE: parse_type(ctx); break; default: tok_error(&ctx->tok, "unexpected \"%.*s\"\n", (int)ctx->tok.len, ctx->tok.pos); return; } } } void parser_init(struct parser *ctx, char *source) { debug("Initializing parser...\n"); lexer_init(&ctx->lexer, source); add_builtin(ctx->types, "any", 0); add_builtin(ctx->types, "uint", sizeof(void*)); add_builtin(ctx->types, "uint64", 8); add_builtin(ctx->types, "uint32", 4); add_builtin(ctx->types, "uint16", 2); add_builtin(ctx->types, "uint8", 1); }