refine reader error message for missing closing paren

svn: r11104
This commit is contained in:
Matthew Flatt 2008-08-06 11:57:37 +00:00
parent 2feab45ea7
commit ada4b6f9d0

View File

@ -149,7 +149,7 @@ static int use_perma_cache = 1;
static Scheme_Object *read_list(Scheme_Object *port, Scheme_Object *stxsrc, static Scheme_Object *read_list(Scheme_Object *port, Scheme_Object *stxsrc,
long line, long col, long pos, long line, long col, long pos,
int closer, int opener, int closer,
int shape, int use_stack, int shape, int use_stack,
Scheme_Hash_Table **ht, Scheme_Hash_Table **ht,
Scheme_Object *indentation, Scheme_Object *indentation,
@ -172,7 +172,7 @@ static Scheme_Object *read_quote(char *who, Scheme_Object *quote_symbol, int len
ReadParams *params); ReadParams *params);
static Scheme_Object *read_vector(Scheme_Object *port, Scheme_Object *stxsrc, static Scheme_Object *read_vector(Scheme_Object *port, Scheme_Object *stxsrc,
long line, long col, long pos, long line, long col, long pos,
char closer, int opener, char closer,
long reqLen, const mzchar *reqBuffer, long reqLen, const mzchar *reqBuffer,
Scheme_Hash_Table **ht, Scheme_Hash_Table **ht,
Scheme_Object *indentation, Scheme_Object *indentation,
@ -211,7 +211,7 @@ static Scheme_Object *read_box(Scheme_Object *port, Scheme_Object *stxsrc,
ReadParams *params); ReadParams *params);
static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc, static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc,
long line, long col, long pos, long line, long col, long pos,
char closer, int eq, int opener, char closer, int eq,
Scheme_Hash_Table **ht, Scheme_Hash_Table **ht,
Scheme_Object *indentation, Scheme_Object *indentation,
ReadParams *params); ReadParams *params);
@ -981,19 +981,19 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
unexpected_closer(ch, port, stxsrc, line, col, pos, indentation, params); unexpected_closer(ch, port, stxsrc, line, col, pos, indentation, params);
return NULL; return NULL;
case '(': case '(':
return read_list(port, stxsrc, line, col, pos, ')', mz_shape_cons, 0, ht, indentation, params); return read_list(port, stxsrc, line, col, pos, ch, ')', mz_shape_cons, 0, ht, indentation, params);
case '[': case '[':
if (!params->square_brackets_are_parens) { if (!params->square_brackets_are_parens) {
scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of open square bracket"); scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of open square bracket");
return NULL; return NULL;
} else } else
return read_list(port, stxsrc, line, col, pos, ']', mz_shape_cons, 0, ht, indentation, params); return read_list(port, stxsrc, line, col, pos, ch, ']', mz_shape_cons, 0, ht, indentation, params);
case '{': case '{':
if (!params->curly_braces_are_parens) { if (!params->curly_braces_are_parens) {
scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of open curly brace"); scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of open curly brace");
return NULL; return NULL;
} else } else
return read_list(port, stxsrc, line, col, pos, '}', mz_shape_cons, 0, ht, indentation, params); return read_list(port, stxsrc, line, col, pos, ch, '}', mz_shape_cons, 0, ht, indentation, params);
case '|': case '|':
special_value = read_symbol(ch, 1, port, stxsrc, line, col, pos, ht, indentation, params, table); special_value = read_symbol(ch, 1, port, stxsrc, line, col, pos, ht, indentation, params, table);
break; break;
@ -1133,7 +1133,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
break; break;
case '(': case '(':
if (!params->honu_mode) { if (!params->honu_mode) {
return read_vector(port, stxsrc, line, col, pos, ')', -1, NULL, ht, indentation, params); return read_vector(port, stxsrc, line, col, pos, ch, ')', -1, NULL, ht, indentation, params);
} }
break; break;
case '[': case '[':
@ -1142,7 +1142,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation, "read: bad syntax `#['"); scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation, "read: bad syntax `#['");
return NULL; return NULL;
} else } else
return read_vector(port, stxsrc, line, col, pos, ']', -1, NULL, ht, indentation, params); return read_vector(port, stxsrc, line, col, pos, ch, ']', -1, NULL, ht, indentation, params);
} }
break; break;
case '{': case '{':
@ -1151,7 +1151,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation, "read: bad syntax `#{'"); scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation, "read: bad syntax `#{'");
return NULL; return NULL;
} else } else
return read_vector(port, stxsrc, line, col, pos, '}', -1, NULL, ht, indentation, params); return read_vector(port, stxsrc, line, col, pos, ch, '}', -1, NULL, ht, indentation, params);
} }
break; break;
case '\\': case '\\':
@ -1241,7 +1241,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
else if (effective_ch == '{') else if (effective_ch == '{')
ch = '}'; ch = '}';
v = read_vector(port, stxsrc, line, col, pos, ch, -1, NULL, ht, indentation, params); v = read_vector(port, stxsrc, line, col, pos, orig_ch, ch, -1, NULL, ht, indentation, params);
if (stxsrc) if (stxsrc)
v = SCHEME_STX_VAL(v); v = SCHEME_STX_VAL(v);
@ -1626,11 +1626,11 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
effective_ch = readtable_effective_char(table, ch); effective_ch = readtable_effective_char(table, ch);
if (effective_ch == '(') if (effective_ch == '(')
return read_hash(port, stxsrc, line, col, pos, ')', (scanpos == 4), ht, indentation, params); return read_hash(port, stxsrc, line, col, pos, ch, ')', (scanpos == 4), ht, indentation, params);
if (effective_ch == '[' && params->square_brackets_are_parens) if (effective_ch == '[' && params->square_brackets_are_parens)
return read_hash(port, stxsrc, line, col, pos, ']', (scanpos == 4), ht, indentation, params); return read_hash(port, stxsrc, line, col, pos, ch, ']', (scanpos == 4), ht, indentation, params);
if (effective_ch == '{' && params->curly_braces_are_parens) if (effective_ch == '{' && params->curly_braces_are_parens)
return read_hash(port, stxsrc, line, col, pos, '}', (scanpos == 4), ht, indentation, params); return read_hash(port, stxsrc, line, col, pos, ch, '}', (scanpos == 4), ht, indentation, params);
} }
/* Report an error. So far, we read 'ha', then scanpos chars of str, then ch. */ /* Report an error. So far, we read 'ha', then scanpos chars of str, then ch. */
@ -1778,11 +1778,11 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
effective_ch = readtable_effective_char(table, ch); effective_ch = readtable_effective_char(table, ch);
if (effective_ch == '(') if (effective_ch == '(')
return read_vector(port, stxsrc, line, col, pos, ')', vector_length, vecbuf, ht, indentation, params); return read_vector(port, stxsrc, line, col, pos, ch, ')', vector_length, vecbuf, ht, indentation, params);
if (effective_ch == '[' && params->square_brackets_are_parens) if (effective_ch == '[' && params->square_brackets_are_parens)
return read_vector(port, stxsrc, line, col, pos, ']', vector_length, vecbuf, ht, indentation, params); return read_vector(port, stxsrc, line, col, pos, ch, ']', vector_length, vecbuf, ht, indentation, params);
if (effective_ch == '{' && params->curly_braces_are_parens) if (effective_ch == '{' && params->curly_braces_are_parens)
return read_vector(port, stxsrc, line, col, pos, '}', vector_length, vecbuf, ht, indentation, params); return read_vector(port, stxsrc, line, col, pos, ch, '}', vector_length, vecbuf, ht, indentation, params);
if (ch == '#' && (vector_length != -1)) { if (ch == '#' && (vector_length != -1)) {
/* Not a vector after all: a graph reference */ /* Not a vector after all: a graph reference */
@ -2591,7 +2591,7 @@ static Scheme_Object *combine_angle_brackets(Scheme_Object *list);
static Scheme_Object * static Scheme_Object *
read_list(Scheme_Object *port, read_list(Scheme_Object *port,
Scheme_Object *stxsrc, long line, long col, long pos, Scheme_Object *stxsrc, long line, long col, long pos,
int closer, int shape, int use_stack, int opener, int closer, int shape, int use_stack,
Scheme_Hash_Table **ht, Scheme_Hash_Table **ht,
Scheme_Object *indentation, Scheme_Object *indentation,
ReadParams *params) ReadParams *params)
@ -2646,7 +2646,10 @@ read_list(Scheme_Object *port,
} }
scheme_read_err(port, stxsrc, startline, startcol, start, MINSPAN(port, start, init_span), EOF, indentation, scheme_read_err(port, stxsrc, startline, startcol, start, MINSPAN(port, start, init_span), EOF, indentation,
"read: expected a %s%s", closer_name(params, closer), suggestion); "read: expected a %s to close `%c'%s",
closer_name(params, closer),
opener,
suggestion);
return NULL; return NULL;
} }
@ -2727,7 +2730,7 @@ read_list(Scheme_Object *port,
long xl, xc, xp; long xl, xc, xp;
scheme_tell_all(port, &xl, &xc, &xp); scheme_tell_all(port, &xl, &xc, &xp);
car = read_list(port, stxsrc, xl, xc, xp, car = read_list(port, stxsrc, xl, xc, xp,
((effective_ch == '(') ? ')' : ((effective_ch == '[') ? ']' : '}')), ch, ((effective_ch == '(') ? ')' : ((effective_ch == '[') ? ']' : '}')),
mz_shape_hash_elem, use_stack, ht, indentation, params); mz_shape_hash_elem, use_stack, ht, indentation, params);
/* car is guaranteed to have an appropriate shape */ /* car is guaranteed to have an appropriate shape */
} }
@ -3336,7 +3339,7 @@ char *scheme_extract_indentation_suggestions(Scheme_Object *indentation)
static Scheme_Object * static Scheme_Object *
read_vector (Scheme_Object *port, read_vector (Scheme_Object *port,
Scheme_Object *stxsrc, long line, long col, long pos, Scheme_Object *stxsrc, long line, long col, long pos,
char closer, int opener, char closer,
long requestLength, const mzchar *reqBuffer, long requestLength, const mzchar *reqBuffer,
Scheme_Hash_Table **ht, Scheme_Hash_Table **ht,
Scheme_Object *indentation, ReadParams *params) Scheme_Object *indentation, ReadParams *params)
@ -3346,7 +3349,7 @@ read_vector (Scheme_Object *port,
Scheme_Object *lresult, *obj, *vec, **els; Scheme_Object *lresult, *obj, *vec, **els;
int len, i; int len, i;
lresult = read_list(port, stxsrc, line, col, pos, closer, mz_shape_vec, 1, ht, indentation, params); lresult = read_list(port, stxsrc, line, col, pos, opener, closer, mz_shape_vec, 1, ht, indentation, params);
if (requestLength == -2) { if (requestLength == -2) {
scheme_raise_out_of_memory("read", "making vector of size %5", reqBuffer); scheme_raise_out_of_memory("read", "making vector of size %5", reqBuffer);
@ -4027,14 +4030,14 @@ static Scheme_Object *read_box(Scheme_Object *port,
/* "(" has been read */ /* "(" has been read */
static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc, static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc,
long line, long col, long pos, long line, long col, long pos,
char closer, int eq, int opener, char closer, int eq,
Scheme_Hash_Table **ht, Scheme_Hash_Table **ht,
Scheme_Object *indentation, ReadParams *params) Scheme_Object *indentation, ReadParams *params)
{ {
Scheme_Object *l; Scheme_Object *l;
/* using mz_shape_hash_list ensures that l is a list of pairs */ /* using mz_shape_hash_list ensures that l is a list of pairs */
l = read_list(port, stxsrc, line, col, pos, closer, mz_shape_hash_list, 0, ht, indentation, params); l = read_list(port, stxsrc, line, col, pos, opener, closer, mz_shape_hash_list, 0, ht, indentation, params);
if (stxsrc) { if (stxsrc) {
Scheme_Object *key, *val; Scheme_Object *key, *val;