More grammar
All checks were successful
Validate the build / validate-build (push) Successful in 27s
All checks were successful
Validate the build / validate-build (push) Successful in 27s
This commit is contained in:
parent
dabd3fd86f
commit
000756fca9
@ -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);
|
||||
|
||||
// <register>
|
||||
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;
|
||||
|
||||
// <register_index>?
|
||||
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;
|
||||
}
|
||||
|
||||
// <register_offset>?
|
||||
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};
|
||||
|
Loading…
x
Reference in New Issue
Block a user