Add basic parser utilities
This commit is contained in:
parent
69e1cb840c
commit
89c7bb5253
31
src/parser_util.c
Normal file
31
src/parser_util.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#include "parser_util.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) {
|
||||||
|
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) {
|
||||||
|
if (current->token.id != token_id)
|
||||||
|
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);
|
||||||
|
}
|
22
src/parser_util.h
Normal file
22
src/parser_util.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef INCLUDE_SRC_PARSER_UTIL_H_
|
||||||
|
#define INCLUDE_SRC_PARSER_UTIL_H_
|
||||||
|
|
||||||
|
#include "ast.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "tokenlist.h"
|
||||||
|
|
||||||
|
typedef struct parse_result {
|
||||||
|
error_t *err;
|
||||||
|
tokenlist_entry_t *next;
|
||||||
|
ast_node_t *node;
|
||||||
|
} parse_result_t;
|
||||||
|
|
||||||
|
parse_result_t parse_error(error_t *err);
|
||||||
|
parse_result_t parse_no_match();
|
||||||
|
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);
|
||||||
|
|
||||||
|
tokenlist_entry_t *skip_insignificant(tokenlist_entry_t *);
|
||||||
|
|
||||||
|
#endif // INCLUDE_SRC_PARSER_UTIL_H_
|
Loading…
x
Reference in New Issue
Block a user