changeset 49831:3df99c93b6a4

(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.
author Kim F. Storm <storm@cua.dk>
date Mon, 17 Feb 2003 22:42:05 +0000
parents 924ad8b9c2f6
children c62a92d62ebe
files src/lread.c
diffstat 1 files changed, 25 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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)
 		{