Add basic parser utilities
This commit is contained in:
		
							
								
								
									
										35
									
								
								src/parser/util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/parser/util.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | #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); | ||||||
|  | } | ||||||
							
								
								
									
										27
									
								
								src/parser/util.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/parser/util.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | #ifndef INCLUDE_PARSER_UTIL_H_ | ||||||
|  | #define INCLUDE_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; | ||||||
|  |  | ||||||
|  | typedef bool (*token_validator_t)(lexer_token_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, | ||||||
|  |                            token_validator_t is_valid); | ||||||
|  |  | ||||||
|  | tokenlist_entry_t *skip_insignificant(tokenlist_entry_t *); | ||||||
|  |  | ||||||
|  | extern error_t *err_parse_no_match; | ||||||
|  |  | ||||||
|  | #endif // INCLUDE_PARSER_UTIL_H_ | ||||||
		Reference in New Issue
	
	Block a user