36 lines
1021 B
C
36 lines
1021 B
C
#include "util.h"
|
|
#include "../tokenlist.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) {
|
|
next = tokenlist_skip_trivia(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,
|
|
token_validator_t is_valid) {
|
|
if (current->token.id != token_id ||
|
|
(is_valid && !is_valid(¤t->token)))
|
|
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);
|
|
}
|