diff --git a/src/parser/parser.c b/src/parser/parser.c index a92a2c3..0476666 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -9,7 +9,8 @@ parse_result_t parse_number(tokenlist_entry_t *current) { parser_t parsers[] = {parse_octal, parse_decimal, parse_hexadecimal, parse_binary, nullptr}; - return parse_any(current, parsers); + parse_result_t result = parse_any(current, parsers); + return parse_result_wrap(NODE_NUMBER, result); } parse_result_t parse_plus_or_minus(tokenlist_entry_t *current) { @@ -83,7 +84,8 @@ parse_result_t parse_register_expression(tokenlist_entry_t *current) { parse_result_t parse_immediate(tokenlist_entry_t *current) { parser_t parsers[] = {parse_number, parse_identifier, nullptr}; - return parse_any(current, parsers); + parse_result_t result = parse_any(current, parsers); + return parse_result_wrap(NODE_IMMEDIATE, result); } parse_result_t parse_memory_expression(tokenlist_entry_t *current) { diff --git a/src/parser/util.c b/src/parser/util.c index 9b3cd18..09741b2 100644 --- a/src/parser/util.c +++ b/src/parser/util.c @@ -33,3 +33,24 @@ parse_result_t parse_token(tokenlist_entry_t *current, return parse_success(node, current->next); } + +parse_result_t parse_result_wrap(node_id_t id, parse_result_t result) { + if (result.err) + return result; + + ast_node_t *node; + error_t *err = ast_node_alloc(&node); + if (err) { + ast_node_free(result.node); + return parse_error(err); + } + node->id = id; + + err = ast_node_add_child(node, result.node); + if (err) { + ast_node_free(result.node); + return parse_error(err); + } + + return parse_success(node, result.next); +} diff --git a/src/parser/util.h b/src/parser/util.h index ee5a315..5c074b0 100644 --- a/src/parser/util.h +++ b/src/parser/util.h @@ -19,6 +19,7 @@ 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, token_validator_t is_valid); +parse_result_t parse_result_wrap(node_id_t id, parse_result_t result); extern error_t *err_parse_no_match;