From 000756fca9f3545ec9d78acb5460a8b40b96586c Mon Sep 17 00:00:00 2001 From: omicron Date: Wed, 2 Apr 2025 15:39:41 +0200 Subject: [PATCH] More grammar --- src/parser/parser.c | 84 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/src/parser/parser.c b/src/parser/parser.c index e489e6b..13b6b5d 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -12,6 +12,90 @@ parse_result_t parse_number(tokenlist_entry_t *current) { return parse_any(current, parsers); } +parse_result_t parse_plus_or_minus(tokenlist_entry_t *current) { + parser_t parsers[] = {parse_plus, parse_minus, nullptr}; + return parse_any(current, parsers); +} + +parse_result_t parse_register_index(tokenlist_entry_t *current) { + parser_t parsers[] = {parse_plus, parse_register, parse_asterisk, + parse_number, nullptr}; + return parse_consecutive(current, NODE_LABEL, parsers); +} + +parse_result_t parse_register_offset(tokenlist_entry_t *current) { + parser_t parsers[] = {parse_plus_or_minus, parse_number, nullptr}; + return parse_consecutive(current, NODE_LABEL, parsers); +} + +parse_result_t parse_register_expression(tokenlist_entry_t *current) { + parse_result_t result; + + ast_node_t *expr; + error_t *err = ast_node_alloc(&expr); + if (err) + return parse_error(err); + + // + result = parse_register(current); + if (result.err) { + ast_node_free(expr); + return result; + } + err = ast_node_add_child(expr, result.node); + if (err) { + ast_node_free(result.node); + ast_node_free(expr); + return parse_error(err); + } + current = result.next; + + // ? + result = parse_register_index(current); + if (result.err) { + error_free(result.err); + } else { + err = ast_node_add_child(expr, result.node); + if (err) { + ast_node_free(result.node); + ast_node_free(expr); + return parse_error(err); + } + current = result.next; + } + + // ? + result = parse_register_offset(current); + if (result.err) { + error_free(result.err); + } else { + err = ast_node_add_child(expr, result.node); + if (err) { + ast_node_free(result.node); + ast_node_free(expr); + return parse_error(err); + } + current = result.next; + } + return parse_success(expr, 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 parse_memory_expression(tokenlist_entry_t *current) { + parser_t parsers[] = {parse_register_expression, parse_identifier, nullptr}; + return parse_any(current, parsers); +} + +parse_result_t parse_memory(tokenlist_entry_t *current) { + parser_t parsers[] = {parse_lbracket, parse_memory_expression, + parse_rbracket, nullptr}; + return parse_consecutive(current, NODE_LABEL, parsers); +} + parse_result_t parse_operand(tokenlist_entry_t *current) { // FIXME: not the correct set of parsers parser_t parsers[] = {parse_register, parse_number, nullptr};