From d888fa12a88ae7e5332de669b3c3a1dac57f5c19 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 28 May 2021 16:11:27 -0700 Subject: [PATCH] stage1 parser: fix the TODOs --- src/stage1/parser.cpp | 50 ++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/stage1/parser.cpp b/src/stage1/parser.cpp index 8cd624daad..b28c68e063 100644 --- a/src/stage1/parser.cpp +++ b/src/stage1/parser.cpp @@ -126,6 +126,19 @@ static AstNode *ast_parse_container_decl_auto(ParseContext *pc); static AstNode *ast_parse_container_decl_type(ParseContext *pc); static AstNode *ast_parse_byte_align(ParseContext *pc); +ATTRIBUTE_NORETURN +static void ast_error_offset(RootStruct *root_struct, ErrColor err_color, + TokenIndex token, size_t bad_index, Buf *msg) +{ + assert(token < root_struct->token_count); + uint32_t byte_offset = root_struct->token_locs[token].offset; + ErrorMsg *err = err_msg_create_with_offset(root_struct->path, + byte_offset + bad_index, buf_ptr(root_struct->source_code), msg); + + print_err_msg(err, err_color); + exit(EXIT_FAILURE); +} + ATTRIBUTE_PRINTF(3, 4) ATTRIBUTE_NORETURN static void ast_error(ParseContext *pc, TokenIndex token, const char *format, ...) { @@ -135,13 +148,7 @@ static void ast_error(ParseContext *pc, TokenIndex token, const char *format, .. va_end(ap); RootStruct *root_struct = pc->owner->data.structure.root_struct; - assert(token < root_struct->token_count); - uint32_t byte_offset = root_struct->token_locs[token].offset; - ErrorMsg *err = err_msg_create_with_offset(root_struct->path, - byte_offset, buf_ptr(root_struct->source_code), msg); - - print_err_msg(err, pc->err_color); - exit(EXIT_FAILURE); + ast_error_offset(root_struct, pc->err_color, token, 0, msg); } ATTRIBUTE_NORETURN @@ -202,20 +209,9 @@ static void put_back_token(ParseContext *pc) { pc->current_token -= 1; } -static Buf *token_string_literal_buf(RootStruct *root_struct, TokenIndex token) { - Error err; - assert(root_struct->token_ids[token] == TokenIdStringLiteral); - const char *source = buf_ptr(root_struct->source_code); - size_t byte_offset = root_struct->token_locs[token].offset; - size_t bad_index; - Buf *str = buf_alloc(); - if ((err = source_string_literal_buf(source + byte_offset, str, &bad_index))) { - zig_panic("TODO handle string literal parse error"); - } - return str; -} - static Buf *token_buf(ParseContext *pc, TokenIndex token) { + Error err; + if (token == 0) return nullptr; @@ -223,7 +219,16 @@ static Buf *token_buf(ParseContext *pc, TokenIndex token) { if (root_struct->token_ids[token] == TokenIdIdentifier) { return token_identifier_buf(root_struct, token); } else if (root_struct->token_ids[token] == TokenIdStringLiteral) { - return token_string_literal_buf(root_struct, token); + assert(root_struct->token_ids[token] == TokenIdStringLiteral); + const char *source = buf_ptr(root_struct->source_code); + size_t byte_offset = root_struct->token_locs[token].offset; + size_t bad_index; + Buf *str = buf_alloc(); + if ((err = source_string_literal_buf(source + byte_offset, str, &bad_index))) { + ast_error_offset(root_struct, pc->err_color, token, bad_index, + buf_create_from_str("invalid string literal character")); + } + return str; } else { zig_unreachable(); } @@ -3493,7 +3498,8 @@ Buf *token_identifier_buf(RootStruct *root_struct, TokenIndex token) { size_t bad_index; Buf *str = buf_alloc(); if ((err = source_string_literal_buf(source + byte_offset + 1, str, &bad_index))) { - zig_panic("TODO handle string literal parse error"); + ast_error_offset(root_struct, ErrColorAuto, token, bad_index + 1, + buf_create_from_str("invalid string literal character")); } return str; } else {