summaryrefslogtreecommitdiff
path: root/src/scheme
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2018-01-03 14:56:15 -0800
committerKeith Packard <keithp@keithp.com>2018-01-03 14:56:15 -0800
commit2bcc178f3cbfd346b134bb3fe700b0512f340fea (patch)
tree99361e6d99eac1fd3d99392310be8b2e630b041e /src/scheme
parentb7c34a2e5ecff19d61d337b8c84976cc46005ec4 (diff)
altos/scheme: fix parsing of vector followed by list
The 'parsing a vector' state value wasn't getting cleared at the end of the vector, so that (#(1 2) (3 4) returned (#(1 2) #(3 4) Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/scheme')
-rw-r--r--src/scheme/ao_scheme_read.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/scheme/ao_scheme_read.c b/src/scheme/ao_scheme_read.c
index 9174de5e..7d540aa5 100644
--- a/src/scheme/ao_scheme_read.c
+++ b/src/scheme/ao_scheme_read.c
@@ -53,7 +53,7 @@ static const uint16_t lex_classes[128] = {
PRINTABLE|WHITE, /* */
PRINTABLE, /* ! */
PRINTABLE|STRINGC, /* " */
- PRINTABLE|POUND, /* # */
+ PRINTABLE, /* # */
PRINTABLE, /* $ */
PRINTABLE, /* % */
PRINTABLE, /* & */
@@ -360,7 +360,7 @@ _lex(void)
#endif
}
}
- if (lex_class & POUND) {
+ if (c == '#') {
c = lexc();
switch (c) {
case 't':
@@ -516,7 +516,7 @@ _lex(void)
static inline int lex(void)
{
int parse_token = _lex();
- RDBGI("token %d (%s)\n", parse_token, token_string);
+ RDBGI("token %d \"%s\"\n", parse_token, token_string);
return parse_token;
}
@@ -565,10 +565,11 @@ pop_read_stack(void)
ao_scheme_read_cons_tail = ao_scheme_poly_cons(ao_scheme_read_cons_tail->cdr))
;
} else {
- ao_scheme_read_cons = 0;
- ao_scheme_read_cons_tail = 0;
- ao_scheme_read_stack = 0;
read_state = ao_scheme_read_state;
+ ao_scheme_read_cons = NULL;
+ ao_scheme_read_cons_tail = NULL;
+ ao_scheme_read_stack = NULL;
+ ao_scheme_read_state = 0;
}
RDBG_OUT();
RDBGI("pop read stack %p %d\n", ao_scheme_read_cons, read_state);
@@ -591,7 +592,7 @@ ao_scheme_read(void)
ao_scheme_read_list = 0;
read_state = 0;
- ao_scheme_read_cons = ao_scheme_read_cons_tail = ao_scheme_read_stack = 0;
+ ao_scheme_read_cons = ao_scheme_read_cons_tail = ao_scheme_read_stack = NULL;
for (;;) {
parse_token = lex();
while (is_open(parse_token)) {
@@ -677,8 +678,10 @@ ao_scheme_read(void)
--ao_scheme_read_list;
read_state = pop_read_stack();
#ifdef AO_SCHEME_FEATURE_VECTOR
- if (read_state & READ_SAW_VECTOR)
+ if (read_state & READ_SAW_VECTOR) {
v = ao_scheme_vector_poly(ao_scheme_list_to_vector(ao_scheme_poly_cons(v)));
+ read_state &= ~READ_SAW_VECTOR;
+ }
#endif
break;
case DOT: