Add basic parser utilities
This commit is contained in:
		
							
								
								
									
										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_ | ||||
		Reference in New Issue
	
	Block a user