From 89c7bb5253ce4d64bc604ed43d63b3493db2efba Mon Sep 17 00:00:00 2001 From: omicron Date: Tue, 1 Apr 2025 20:03:28 +0200 Subject: [PATCH] Add basic parser utilities --- src/parser_util.c | 31 +++++++++++++++++++++++++++++++ src/parser_util.h | 22 ++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/parser_util.c create mode 100644 src/parser_util.h diff --git a/src/parser_util.c b/src/parser_util.c new file mode 100644 index 0000000..1ece241 --- /dev/null +++ b/src/parser_util.c @@ -0,0 +1,31 @@ +#include "parser_util.h" + +error_t *err_parse_no_match = + &(error_t){.message = "parsing failed to find the correct token sequence"}; + +parse_result_t parse_error(error_t *err) { + return (parse_result_t){.err = err}; +} + +parse_result_t parse_no_match() { + return parse_error(err_parse_no_match); +} + +parse_result_t parse_success(ast_node_t *ast, tokenlist_entry_t *next) { + return (parse_result_t){.node = ast, .next = next}; +} + +parse_result_t parse_token(tokenlist_entry_t *current, + lexer_token_id_t token_id, node_id_t ast_id) { + if (current->token.id != token_id) + return parse_no_match(); + + ast_node_t *node; + error_t *err = ast_node_alloc(&node); + if (err) + return parse_error(err); + node->id = ast_id; + node->token_entry = current; + + return parse_success(node, current->next); +} diff --git a/src/parser_util.h b/src/parser_util.h new file mode 100644 index 0000000..c081ef3 --- /dev/null +++ b/src/parser_util.h @@ -0,0 +1,22 @@ +#ifndef INCLUDE_SRC_PARSER_UTIL_H_ +#define INCLUDE_SRC_PARSER_UTIL_H_ + +#include "ast.h" +#include "error.h" +#include "tokenlist.h" + +typedef struct parse_result { + error_t *err; + tokenlist_entry_t *next; + ast_node_t *node; +} parse_result_t; + +parse_result_t parse_error(error_t *err); +parse_result_t parse_no_match(); +parse_result_t parse_success(ast_node_t *ast, tokenlist_entry_t *next); +parse_result_t parse_token(tokenlist_entry_t *current, + lexer_token_id_t token_id, node_id_t ast_id); + +tokenlist_entry_t *skip_insignificant(tokenlist_entry_t *); + +#endif // INCLUDE_SRC_PARSER_UTIL_H_