mirror of
https://github.com/janet-lang/janet
synced 2024-11-28 02:59:54 +00:00
Address #1014 improve parse errors when bad delimiters are found.
Reuse some existing logic for eof errors.
This commit is contained in:
parent
ac2082e9b3
commit
f5d11dc656
@ -3,7 +3,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define EXPORTER __declspec(dllexport)
|
#define EXPORTER __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define EXPORTER
|
#define EXPORTER
|
||||||
#endif
|
#endif
|
||||||
@ -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
Loading…
Reference in New Issue
Block a user