make read-cdot group datums from left-to-right

so that X.Y.Z is read as (#%dot (#%dot X Y) Z)
This commit is contained in:
AlexKnauth 2016-09-01 09:17:29 -04:00
parent 5708526055
commit d648c8cc42

View File

@ -2035,40 +2035,49 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
if (!read_cdot) { return ret; } if (!read_cdot) { return ret; }
found_dot = 0; // read in zero or more . sequences in a left-associative way
// X.Y should be read as (#%dot X Y)
// X.Y.Z should be read as (#%dot (#%dot X Y) Z)
while ( 1 ) { while ( 1 ) {
next = scheme_peekc_special_ok(port); found_dot = 0;
if ( next == EOF ) { break; } while ( 1 ) {
if ( (table && readtable_kind(table, next, params) & READTABLE_WHITESPACE) next = scheme_peekc_special_ok(port);
|| (!table && scheme_isspace(next)) ) { if ( next == EOF ) { break; }
scheme_getc_special_ok(port); continue; } if ( (table && readtable_kind(table, next, params) & READTABLE_WHITESPACE)
if ( (table && readtable_effective_char(table, next) == '.') || (!table && scheme_isspace(next)) ) {
|| (!table && next == '.') ) { scheme_getc_special_ok(port); continue; }
scheme_getc_special_ok(port); found_dot = 1; break; } if ( (table && readtable_effective_char(table, next) == '.')
break; || (!table && next == '.') ) {
} scheme_getc_special_ok(port); found_dot = 1; break; }
break;
if ( found_dot ) {
Scheme_Object *dot, *next;
scheme_tell_all(port, &dline, &dcol, &dpos);
dot = dot_symbol;
if (stxsrc) {
dot = scheme_make_stx_w_offset(dot, dline, dcol, dpos, SPAN(port,dpos), stxsrc, STX_SRCTAG);
} }
next = read_inner_inner(port, stxsrc, ht, indentation, params, comment_mode, pre_char, table, get_info);
if (SCHEME_EOFP(next)) { if ( !found_dot ) {
scheme_read_err(port, stxsrc, dline, dcol, dpos, 1, EOF, indentation, return ret;
"read: expected a datum after cdot, found end-of-file");
return NULL;
} else { } else {
ret = scheme_make_pair( dot, scheme_make_pair( ret, scheme_make_pair( next, scheme_null ) ) ); Scheme_Object *dot, *next;
}
if (stxsrc) {
ret = scheme_make_stx_w_offset(ret, rline, rcol, rpos, SPAN(port,rpos), stxsrc, STX_SRCTAG);
}
}
return ret; scheme_tell_all(port, &dline, &dcol, &dpos);
dot = dot_symbol;
if (stxsrc) {
dot = scheme_make_stx_w_offset(dot, dline, dcol, dpos, SPAN(port,dpos), stxsrc, STX_SRCTAG);
}
next = read_inner_inner_inner(port, stxsrc, ht, indentation, params, comment_mode, pre_char, table, get_info);
if (SCHEME_EOFP(next)) {
scheme_read_err(port, stxsrc, dline, dcol, dpos, 1, EOF, indentation,
"read: expected a datum after cdot, found end-of-file");
return NULL;
} else {
ret = scheme_make_pair( dot, scheme_make_pair( ret, scheme_make_pair( next, scheme_null ) ) );
}
if (stxsrc) {
ret = scheme_make_stx_w_offset(ret, rline, rcol, rpos, SPAN(port,rpos), stxsrc, STX_SRCTAG);
}
}
// look for more dots after this
continue;
}
} }
static Scheme_Object * static Scheme_Object *