ref: 9e2aa26b0574b4ac53c838f6b59fd78f952c3923
parent: dcf77fa75d578d655ccb37d9d2b706d5eafcaa1a
author: Matthew Flatt <mflatt@racket-lang.org>
date: Fri Nov 10 05:54:11 CST 2023
repair reader for `.` after open parenthes/bracket Closes #16
--- a/tests/read+print.zuo
+++ b/tests/read+print.zuo
@@ -20,6 +20,10 @@
(check (~s 1 '(apple . pie) (string->uninterned-symbol "banana")) "1 (apple . pie) #<symbol:banana>")
(check (~a 1 '(apple) "banana") "1(apple)banana")
(check (~a 1 '(apple . pie) (string->uninterned-symbol "banana")) "1(apple . pie)banana")
+(check (~a 1 '(apple . pie) (string->uninterned-symbol "banana")) "1(apple . pie)banana")
+
+(check-fail (string-read "( . pie)") "misplaced `.`")
+(check-fail (string-read "[ . pie]") "misplaced `.`")
(define table
(list
--- a/zuo.c
+++ b/zuo.c
@@ -2121,9 +2121,13 @@
stack);
obj = z.o_undefined;
} else if ((c == '.') && !(isalpha(s[*_o+1]) || isdigit(s[*_o+1]) || strchr(symbol_chars, s[*_o+1]))) {
- if ((stack != z.o_null) && (ZUO_CAR(ZUO_CAR(stack)) == ZUO_IN_PAREN_LIST_RECUR))
+ if ((stack != z.o_null)
+ && (ZUO_CAR(ZUO_CAR(stack)) == ZUO_IN_PAREN_LIST_RECUR)
+ && (ZUO_CAR(ZUO_CDR(ZUO_CAR(stack))) != z.o_null))
ZUO_CAR(ZUO_CAR(stack)) = ZUO_IN_PAREN_PAIR_RECUR;
- else if ((stack != z.o_null) && (ZUO_CAR(ZUO_CAR(stack)) == ZUO_IN_BRACKET_LIST_RECUR))
+ else if ((stack != z.o_null)
+ && (ZUO_CAR(ZUO_CAR(stack)) == ZUO_IN_BRACKET_LIST_RECUR)
+ && (ZUO_CAR(ZUO_CDR(ZUO_CAR(stack))) != z.o_null))
ZUO_CAR(ZUO_CAR(stack)) = ZUO_IN_BRACKET_PAIR_RECUR;
else
zuo_read_fail(s, _o, where, "misplaced `.`");