# HG changeset patch # User Kim F. Storm # Date 1045521725 0 # Node ID 3df99c93b6a410455f27947fd93dc8cbfc727abf # Parent 924ad8b9c2f6102ba811ca76fdc6279413b86cca (read1): Fix and relax read syntax. Recognize "[", ";", "#", and "?" after a dotted-pair dot. Only recognize "," after dotted-pair dot if inside backquote. Never include "`" or "," (inside backquote) in a symbol. Allow dotted-pair dot after a character constant. Allow "`" and "," (inside backquote) after a character constant. diff -r 924ad8b9c2f6 -r 3df99c93b6a4 src/lread.c --- a/src/lread.c Mon Feb 17 22:41:39 2003 +0000 +++ b/src/lread.c Mon Feb 17 22:42:05 2003 +0000 @@ -2251,7 +2251,8 @@ case '?': { int discard; - int nextc; + int next_char; + int ok; c = READCHAR; if (c < 0) @@ -2262,13 +2263,25 @@ else if (BASE_LEADING_CODE_P (c)) c = read_multibyte (c, readcharfun); - nextc = READCHAR; - UNREAD (nextc); - if (nextc > 040 - && !(nextc == '?' - || nextc == '\"' || nextc == '\'' || nextc == ';' - || nextc == '(' || nextc == ')' - || nextc == '[' || nextc == ']' || nextc == '#')) + next_char = READCHAR; + if (next_char == '.') + { + /* Only a dotted-pair dot is valid after a char constant. */ + int next_next_char = READCHAR; + UNREAD (next_next_char); + + ok = (next_next_char <= 040 + || index ("\"'`;([#?", next_next_char) + || (new_backquote_flag && next_next_char == ',')); + } + else + { + ok = (next_char <= 040 + || index ("\"'`;()[]#", next_char) + || (new_backquote_flag && next_char == ',')); + } + UNREAD (next_char); + if (!ok) Fsignal (Qinvalid_read_syntax, Fcons (make_string ("?", 1), Qnil)); return make_number (c); @@ -2423,7 +2436,8 @@ UNREAD (next_char); if (next_char <= 040 - || index ("\"'`,(", next_char)) + || index ("\"'`;([#?", next_char) + || (new_backquote_flag && next_char == ',')) { *pch = c; return Qnil; @@ -2444,9 +2458,8 @@ char *end = read_buffer + read_buffer_size; while (c > 040 - && !(c == '\"' || c == '\'' || c == ';' - || c == '(' || c == ')' - || c == '[' || c == ']' || c == '#')) + && !index ("\"'`;()[]#", c) + && !(new_backquote_flag && c == ',')) { if (end - p < MAX_MULTIBYTE_LENGTH) {