Add parse_result_wrap to wrap a result with another parent node
Use the new wrap function to wrap numbers and immediate nodes
This commit is contained in:
parent
b70b6896bf
commit
b4757e008c
@ -9,7 +9,8 @@
|
|||||||
parse_result_t parse_number(tokenlist_entry_t *current) {
|
parse_result_t parse_number(tokenlist_entry_t *current) {
|
||||||
parser_t parsers[] = {parse_octal, parse_decimal, parse_hexadecimal,
|
parser_t parsers[] = {parse_octal, parse_decimal, parse_hexadecimal,
|
||||||
parse_binary, nullptr};
|
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) {
|
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) {
|
parse_result_t parse_immediate(tokenlist_entry_t *current) {
|
||||||
parser_t parsers[] = {parse_number, parse_identifier, nullptr};
|
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) {
|
parse_result_t parse_memory_expression(tokenlist_entry_t *current) {
|
||||||
|
@ -33,3 +33,24 @@ parse_result_t parse_token(tokenlist_entry_t *current,
|
|||||||
|
|
||||||
return parse_success(node, current->next);
|
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);
|
||||||
|
}
|
||||||
|
@ -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,
|
parse_result_t parse_token(tokenlist_entry_t *current,
|
||||||
lexer_token_id_t token_id, node_id_t ast_id,
|
lexer_token_id_t token_id, node_id_t ast_id,
|
||||||
token_validator_t is_valid);
|
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;
|
extern error_t *err_parse_no_match;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user