diff options
Diffstat (limited to 'src/scheme/ao_scheme_read.c')
| -rw-r--r-- | src/scheme/ao_scheme_read.c | 54 | 
1 files changed, 32 insertions, 22 deletions
| diff --git a/src/scheme/ao_scheme_read.c b/src/scheme/ao_scheme_read.c index 6b1e9d66..9ed54b9f 100644 --- a/src/scheme/ao_scheme_read.c +++ b/src/scheme/ao_scheme_read.c @@ -151,7 +151,7 @@ static const uint16_t	lex_classes[128] = {  static int lex_unget_c;  static inline int -lex_get() +lex_get(void)  {  	int	c;  	if (lex_unget_c) { @@ -244,7 +244,7 @@ lex_quoted(void)  	}  } -#define AO_SCHEME_TOKEN_MAX	32 +#define AO_SCHEME_TOKEN_MAX	128  static char	token_string[AO_SCHEME_TOKEN_MAX];  static int32_t	token_int; @@ -340,6 +340,8 @@ _lex(void)  				add_token(c);  				end_token();  				return BOOL; +			case '(': +				return OPEN_VECTOR;  			case '\\':  				for (;;) {  					int alphabetic; @@ -470,36 +472,40 @@ static inline int lex(void)  static int parse_token; +int			ao_scheme_read_list;  struct ao_scheme_cons	*ao_scheme_read_cons;  struct ao_scheme_cons	*ao_scheme_read_cons_tail;  struct ao_scheme_cons	*ao_scheme_read_stack; +static int		ao_scheme_read_state;  #define READ_IN_QUOTE	0x01  #define READ_SAW_DOT	0x02  #define READ_DONE_DOT	0x04 +#define READ_SAW_VECTOR	0x08  static int -push_read_stack(int cons, int read_state) +push_read_stack(int read_state)  {  	RDBGI("push read stack %p 0x%x\n", ao_scheme_read_cons, read_state);  	RDBG_IN(); -	if (cons) { +	if (ao_scheme_read_list) {  		ao_scheme_read_stack = ao_scheme_cons_cons(ao_scheme_cons_poly(ao_scheme_read_cons),  						       ao_scheme__cons(ao_scheme_int_poly(read_state),  								     ao_scheme_cons_poly(ao_scheme_read_stack)));  		if (!ao_scheme_read_stack)  			return 0; -	} +	} else +		ao_scheme_read_state = read_state;  	ao_scheme_read_cons = NULL;  	ao_scheme_read_cons_tail = NULL;  	return 1;  }  static int -pop_read_stack(int cons) +pop_read_stack(void)  {  	int	read_state = 0; -	if (cons) { +	if (ao_scheme_read_list) {  		ao_scheme_read_cons = ao_scheme_poly_cons(ao_scheme_read_stack->car);  		ao_scheme_read_stack = ao_scheme_poly_cons(ao_scheme_read_stack->cdr);  		read_state = ao_scheme_poly_int(ao_scheme_read_stack->car); @@ -512,6 +518,7 @@ pop_read_stack(int cons)  		ao_scheme_read_cons = 0;  		ao_scheme_read_cons_tail = 0;  		ao_scheme_read_stack = 0; +		read_state = ao_scheme_read_state;  	}  	RDBG_OUT();  	RDBGI("pop read stack %p %d\n", ao_scheme_read_cons, read_state); @@ -523,19 +530,20 @@ ao_scheme_read(void)  {  	struct ao_scheme_atom	*atom;  	char			*string; -	int			cons;  	int			read_state;  	ao_poly			v = AO_SCHEME_NIL; -	cons = 0; +	ao_scheme_read_list = 0;  	read_state = 0;  	ao_scheme_read_cons = ao_scheme_read_cons_tail = ao_scheme_read_stack = 0;  	for (;;) {  		parse_token = lex(); -		while (parse_token == OPEN) { -			if (!push_read_stack(cons, read_state)) +		while (parse_token == OPEN || parse_token == OPEN_VECTOR) { +			if (parse_token == OPEN_VECTOR) +				read_state |= READ_SAW_VECTOR; +			if (!push_read_stack(read_state))  				return AO_SCHEME_NIL; -			cons++; +			ao_scheme_read_list++;  			read_state = 0;  			parse_token = lex();  		} @@ -543,7 +551,7 @@ ao_scheme_read(void)  		switch (parse_token) {  		case END:  		default: -			if (cons) +			if (ao_scheme_read_list)  				ao_scheme_error(AO_SCHEME_EOF, "unexpected end of file");  			return _ao_scheme_atom_eof;  			break; @@ -577,9 +585,9 @@ ao_scheme_read(void)  		case QUASIQUOTE:  		case UNQUOTE:  		case UNQUOTE_SPLICING: -			if (!push_read_stack(cons, read_state)) +			if (!push_read_stack(read_state))  				return AO_SCHEME_NIL; -			cons++; +			ao_scheme_read_list++;  			read_state = READ_IN_QUOTE;  			switch (parse_token) {  			case QUOTE: @@ -597,16 +605,18 @@ ao_scheme_read(void)  			}  			break;  		case CLOSE: -			if (!cons) { +			if (!ao_scheme_read_list) {  				v = AO_SCHEME_NIL;  				break;  			}  			v = ao_scheme_cons_poly(ao_scheme_read_cons); -			--cons; -			read_state = pop_read_stack(cons); +			--ao_scheme_read_list; +			read_state = pop_read_stack(); +			if (read_state & READ_SAW_VECTOR) +				v = ao_scheme_vector_poly(ao_scheme_list_to_vector(ao_scheme_poly_cons(v)));  			break;  		case DOT: -			if (!cons) { +			if (!ao_scheme_read_list) {  				ao_scheme_error(AO_SCHEME_INVALID, ". outside of cons");  				return AO_SCHEME_NIL;  			} @@ -620,7 +630,7 @@ ao_scheme_read(void)  		/* loop over QUOTE ends */  		for (;;) { -			if (!cons) +			if (!ao_scheme_read_list)  				return v;  			if (read_state & READ_DONE_DOT) { @@ -647,8 +657,8 @@ ao_scheme_read(void)  				break;  			v = ao_scheme_cons_poly(ao_scheme_read_cons); -			--cons; -			read_state = pop_read_stack(cons); +			--ao_scheme_read_list; +			read_state = pop_read_stack();  		}  	}  	return v; | 
