authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-28 16:11:27-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-28 16:11:27-07:00
logd888fa12a88ae7e5332de669b3c3a1dac57f5c19
tree1fce37604d4e0255bf8501bf51c76bb791ed1f71
parentf5d4fe3e17533f83404c16fbceff0dc7bb12cb18

stage1 parser: fix the TODOs


1 files changed, 27 insertions(+), 21 deletions(-)

src/stage1/parser.cpp+27-21
......@@ -126,6 +126,19 @@ static AstNode *ast_parse_container_decl_auto(ParseContext *pc);
126126static AstNode *ast_parse_container_decl_type(ParseContext *pc);
127127static AstNode *ast_parse_byte_align(ParseContext *pc);
128128
129ATTRIBUTE_NORETURN
130static void ast_error_offset(RootStruct *root_struct, ErrColor err_color,
131 TokenIndex token, size_t bad_index, Buf *msg)
132{
133 assert(token < root_struct->token_count);
134 uint32_t byte_offset = root_struct->token_locs[token].offset;
135 ErrorMsg *err = err_msg_create_with_offset(root_struct->path,
136 byte_offset + bad_index, buf_ptr(root_struct->source_code), msg);
137
138 print_err_msg(err, err_color);
139 exit(EXIT_FAILURE);
140}
141
129142ATTRIBUTE_PRINTF(3, 4)
130143ATTRIBUTE_NORETURN
131144static 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, ..
135148 va_end(ap);
136149
137150 RootStruct *root_struct = pc->owner->data.structure.root_struct;
138 assert(token < root_struct->token_count);
139 uint32_t byte_offset = root_struct->token_locs[token].offset;
140 ErrorMsg *err = err_msg_create_with_offset(root_struct->path,
141 byte_offset, buf_ptr(root_struct->source_code), msg);
142
143 print_err_msg(err, pc->err_color);
144 exit(EXIT_FAILURE);
151 ast_error_offset(root_struct, pc->err_color, token, 0, msg);
145152}
146153
147154ATTRIBUTE_NORETURN
......@@ -202,20 +209,9 @@ static void put_back_token(ParseContext *pc) {
202209 pc->current_token -= 1;
203210}
204211
205static Buf *token_string_literal_buf(RootStruct *root_struct, TokenIndex token) {
212static Buf *token_buf(ParseContext *pc, TokenIndex token) {
206213 Error err;
207 assert(root_struct->token_ids[token] == TokenIdStringLiteral);
208 const char *source = buf_ptr(root_struct->source_code);
209 size_t byte_offset = root_struct->token_locs[token].offset;
210 size_t bad_index;
211 Buf *str = buf_alloc();
212 if ((err = source_string_literal_buf(source + byte_offset, str, &bad_index))) {
213 zig_panic("TODO handle string literal parse error");
214 }
215 return str;
216}
217214
218static Buf *token_buf(ParseContext *pc, TokenIndex token) {
219215 if (token == 0)
220216 return nullptr;
221217
......@@ -223,7 +219,16 @@ static Buf *token_buf(ParseContext *pc, TokenIndex token) {
223219 if (root_struct->token_ids[token] == TokenIdIdentifier) {
224220 return token_identifier_buf(root_struct, token);
225221 } else if (root_struct->token_ids[token] == TokenIdStringLiteral) {
226 return token_string_literal_buf(root_struct, token);
222 assert(root_struct->token_ids[token] == TokenIdStringLiteral);
223 const char *source = buf_ptr(root_struct->source_code);
224 size_t byte_offset = root_struct->token_locs[token].offset;
225 size_t bad_index;
226 Buf *str = buf_alloc();
227 if ((err = source_string_literal_buf(source + byte_offset, str, &bad_index))) {
228 ast_error_offset(root_struct, pc->err_color, token, bad_index,
229 buf_create_from_str("invalid string literal character"));
230 }
231 return str;
227232 } else {
228233 zig_unreachable();
229234 }
......@@ -3493,7 +3498,8 @@ Buf *token_identifier_buf(RootStruct *root_struct, TokenIndex token) {
34933498 size_t bad_index;
34943499 Buf *str = buf_alloc();
34953500 if ((err = source_string_literal_buf(source + byte_offset + 1, str, &bad_index))) {
3496 zig_panic("TODO handle string literal parse error");
3501 ast_error_offset(root_struct, ErrColorAuto, token, bad_index + 1,
3502 buf_create_from_str("invalid string literal character"));
34973503 }
34983504 return str;
34993505 } else {