void ast_error_continue(errors_t* errors, ast_t* ast, const char* fmt, ...) { va_list ap; va_start(ap, fmt); errorv_continue(errors, token_source(ast->t), token_line_number(ast->t), token_line_position(ast->t), fmt, ap); va_end(ap); }
void ast_error_frame(errorframe_t* frame, ast_t* ast, const char* fmt, ...) { assert(frame != NULL); assert(ast != NULL); assert(fmt != NULL); va_list ap; va_start(ap, fmt); errorframev(frame, token_source(ast->t), token_line_number(ast->t), token_line_position(ast->t), fmt, ap); va_end(ap); }
static void fetch_next_lexer_token(parser_t* parser, bool free_prev_token) { token_t* old_token = parser->token; token_t* new_token = lexer_next(parser->lexer); if(old_token != NULL) parser->last_token_line = token_line_number(old_token); if(old_token != NULL && token_get_id(new_token) == TK_EOF) { // Use location of last token for EOF to get better error reporting token_set_pos(new_token, token_source(old_token), token_line_number(old_token), token_line_position(old_token)); } if(free_prev_token) token_free(old_token); parser->token = new_token; }
source_t* ast_source(ast_t* ast) { assert(ast != NULL); return token_source(ast->t); }