From 1588e7b46d82a98776e582d133889554497ecd2d Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Sat, 24 Jan 2026 02:55:12 +0000 Subject: [PATCH] parser/parser: parse_symbol now supports primitives parse_symbol now investigates if the parsed symbol data is actually just a primitive (linear search through all primitives). If it is, return a primitive first. Otherwise, generate a symbol as per previous form of routine. --- src/arl/parser/parser.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/arl/parser/parser.c b/src/arl/parser/parser.c index 4d3aee9..03e660f 100644 --- a/src/arl/parser/parser.c +++ b/src/arl/parser/parser.c @@ -5,10 +5,11 @@ * Commentary: See parser.h */ -#include "arl/lib/sv.h" #include #include +#include +#include #include /// Expected characters in a symbol @@ -27,7 +28,7 @@ const char *parse_err_to_string(parse_err_t err) case PARSE_ERR_UNKNOWN_CHAR: return "UNKNOWN_CHAR"; default: - FAIL("Unexpected value for parse_err_t: %d\n", err); + FAIL("Unexpected parse_err_t value: %d\n", err); } } @@ -119,10 +120,27 @@ parse_err_t parse_string(parse_stream_t *stream, ast_node_t *ret) parse_err_t parse_symbol(parse_stream_t *stream, ast_node_t *ret) { sv_t current_contents = sv_chop_left(stream->contents, stream->byte); - u64 symbol_size = sv_while(current_contents, SYMBOL_CHARS); - // Generate symbol - *ret = ast_node_symbol(stream->byte, SV(current_contents.data, symbol_size)); - stream_advance(stream, symbol_size); + sv_t symbol = + SV(current_contents.data, sv_while(current_contents, SYMBOL_CHARS)); + + // see if symbol is one of the AST primitives we can parse AOT + static_assert(NUM_AST_PRIMS == 2, "Expected number of AST primitives"); + for (ast_prim_t i = 0; i < NUM_AST_PRIMS; ++i) + { + const char *possible_prim = ast_prim_to_cstr(i); + if (strlen(possible_prim) == symbol.size && + strncmp(possible_prim, symbol.data, symbol.size) == 0) + { + // Found a matching primitive + *ret = ast_node_prim(stream->byte, i); + goto end; + } + } + + // otherwise, it must be a fresh symbol i.e. user defined + *ret = ast_node_symbol(stream->byte, symbol); +end: + stream_advance(stream, symbol.size); return PARSE_ERR_OK; }