mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	Address #1014 improve parse errors when bad delimiters are found.
Reuse some existing logic for eof errors.
This commit is contained in:
		| @@ -57,15 +57,15 @@ double double_lots_2( | |||||||
|     double i, |     double i, | ||||||
|     double j) { |     double j) { | ||||||
|     return a + |     return a + | ||||||
|         10.0 * b + |            10.0 * b + | ||||||
|         100.0 * c + |            100.0 * c + | ||||||
|         1000.0 * d + |            1000.0 * d + | ||||||
|         10000.0 * e + |            10000.0 * e + | ||||||
|         100000.0 * f + |            100000.0 * f + | ||||||
|         1000000.0 * g + |            1000000.0 * g + | ||||||
|         10000000.0 * h + |            10000000.0 * h + | ||||||
|         100000000.0 * i + |            100000000.0 * i + | ||||||
|         1000000000.0 * j; |            1000000000.0 * j; | ||||||
| } | } | ||||||
|  |  | ||||||
| EXPORTER | EXPORTER | ||||||
|   | |||||||
| @@ -206,6 +206,37 @@ static void popstate(JanetParser *p, Janet val) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void delim_error(JanetParser *parser, size_t stack_index, char c, const char *msg) { | ||||||
|  |     JanetParseState *s = parser->states + stack_index; | ||||||
|  |     JanetBuffer *buffer = janet_buffer(40); | ||||||
|  |     if (msg) { | ||||||
|  |         janet_buffer_push_cstring(buffer, msg); | ||||||
|  |     } | ||||||
|  |     if (c) { | ||||||
|  |         janet_buffer_push_u8(buffer, c); | ||||||
|  |     } | ||||||
|  |     if (stack_index > 0) { | ||||||
|  |         janet_buffer_push_cstring(buffer, ", "); | ||||||
|  |         if (s->flags & PFLAG_PARENS) { | ||||||
|  |             janet_buffer_push_u8(buffer, '('); | ||||||
|  |         } else if (s->flags & PFLAG_SQRBRACKETS) { | ||||||
|  |             janet_buffer_push_u8(buffer, '['); | ||||||
|  |         } else if (s->flags & PFLAG_CURLYBRACKETS) { | ||||||
|  |             janet_buffer_push_u8(buffer, '{'); | ||||||
|  |         } else if (s->flags & PFLAG_STRING) { | ||||||
|  |             janet_buffer_push_u8(buffer, '"'); | ||||||
|  |         } else if (s->flags & PFLAG_LONGSTRING) { | ||||||
|  |             int32_t i; | ||||||
|  |             for (i = 0; i < s->argn; i++) { | ||||||
|  |                 janet_buffer_push_u8(buffer, '`'); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         janet_formatb(buffer, " opened at line %d, column %d", s->line, s->column); | ||||||
|  |     } | ||||||
|  |     parser->error = (const char *) janet_string(buffer->data, buffer->count); | ||||||
|  |     parser->flag |= JANET_PARSER_GENERATED_ERROR; | ||||||
|  | } | ||||||
|  |  | ||||||
| static int checkescape(uint8_t c) { | static int checkescape(uint8_t c) { | ||||||
|     switch (c) { |     switch (c) { | ||||||
|         default: |         default: | ||||||
| @@ -612,7 +643,7 @@ static int root(JanetParser *p, JanetParseState *state, uint8_t c) { | |||||||
|         case '}': { |         case '}': { | ||||||
|             Janet ds; |             Janet ds; | ||||||
|             if (p->statecount == 1) { |             if (p->statecount == 1) { | ||||||
|                 p->error = "unexpected delimiter"; |                 delim_error(p, 0, c, "unexpected closing delimiter "); | ||||||
|                 return 1; |                 return 1; | ||||||
|             } |             } | ||||||
|             if ((c == ')' && (state->flags & PFLAG_PARENS)) || |             if ((c == ')' && (state->flags & PFLAG_PARENS)) || | ||||||
| @@ -633,7 +664,7 @@ static int root(JanetParser *p, JanetParseState *state, uint8_t c) { | |||||||
|                     ds = close_struct(p, state); |                     ds = close_struct(p, state); | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
|                 p->error = "mismatched delimiter"; |                 delim_error(p, p->statecount - 1, c, "mismatched delimiter "); | ||||||
|                 return 1; |                 return 1; | ||||||
|             } |             } | ||||||
|             popstate(p, ds); |             popstate(p, ds); | ||||||
| @@ -684,26 +715,7 @@ void janet_parser_eof(JanetParser *parser) { | |||||||
|     size_t oldline = parser->line; |     size_t oldline = parser->line; | ||||||
|     janet_parser_consume(parser, '\n'); |     janet_parser_consume(parser, '\n'); | ||||||
|     if (parser->statecount > 1) { |     if (parser->statecount > 1) { | ||||||
|         JanetParseState *s = parser->states + (parser->statecount - 1); |         delim_error(parser, parser->statecount - 1, 0, "unexpected end of source"); | ||||||
|         JanetBuffer *buffer = janet_buffer(40); |  | ||||||
|         janet_buffer_push_cstring(buffer, "unexpected end of source, "); |  | ||||||
|         if (s->flags & PFLAG_PARENS) { |  | ||||||
|             janet_buffer_push_u8(buffer, '('); |  | ||||||
|         } else if (s->flags & PFLAG_SQRBRACKETS) { |  | ||||||
|             janet_buffer_push_u8(buffer, '['); |  | ||||||
|         } else if (s->flags & PFLAG_CURLYBRACKETS) { |  | ||||||
|             janet_buffer_push_u8(buffer, '{'); |  | ||||||
|         } else if (s->flags & PFLAG_STRING) { |  | ||||||
|             janet_buffer_push_u8(buffer, '"'); |  | ||||||
|         } else if (s->flags & PFLAG_LONGSTRING) { |  | ||||||
|             int32_t i; |  | ||||||
|             for (i = 0; i < s->argn; i++) { |  | ||||||
|                 janet_buffer_push_u8(buffer, '`'); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         janet_formatb(buffer, " opened at line %d, column %d", s->line, s->column); |  | ||||||
|         parser->error = (const char *) janet_string(buffer->data, buffer->count); |  | ||||||
|         parser->flag |= JANET_PARSER_GENERATED_ERROR; |  | ||||||
|     } |     } | ||||||
|     parser->line = oldline; |     parser->line = oldline; | ||||||
|     parser->column = oldcolumn; |     parser->column = oldcolumn; | ||||||
|   | |||||||
							
								
								
									
										0
									
								
								tools/format.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								tools/format.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose