Bytevector parsing

This commit is contained in:
Justin Ethier 2017-08-15 13:39:58 +00:00
parent a492ea820c
commit 7ddb9f3ce6
2 changed files with 57 additions and 23 deletions

View file

@ -759,16 +759,16 @@
(list->vector (reverse lis))) (list->vector (reverse lis)))
(else (else
(loop (cons t lis) (parse2 fp)))))))) (loop (cons t lis) (parse2 fp))))))))
;;((bytevector? token) ((bytevector? token)
;; (let loop ((lis '()) (let loop ((lis '())
;; (t (parse2 fp))) (t (parse2 fp)))
;; (cond (cond
;; ((eof-object? t) ((eof-object? t)
;; (error "missing closing parenthesis")) (error "missing closing parenthesis"))
;; ((eq? t #\)) ((eq? t #\))
;; (list->vector (reverse lis))) (apply bytevector (reverse lis)))
;; (else (else
;; (loop (cons t lis) (parse2 fp)))))) (loop (cons t lis) (parse2 fp))))))
((eq? token #\') ((eq? token #\')
(list 'quote (parse2 fp))) (list 'quote (parse2 fp)))
((eq? token #\`) ((eq? token #\`)

View file

@ -5995,13 +5995,7 @@ void Cyc_io_read_token(void *data, object cont, object port)
_read_next_char(data, cont, p); // Fill buffer _read_next_char(data, cont, p); // Fill buffer
c = p->mem_buf[p->buf_idx++]; c = p->mem_buf[p->buf_idx++];
p->col_num++; p->col_num++;
if (c == '|') { // Block comment if (c == 't') {
_read_multiline_comment(p);
continue;
} else if (c == ';') { // Datum comment
object sym = find_or_add_symbol("#;");
return_thread_runnable(data, sym);
} else if (c == 't') {
if ((p->mem_buf_len - p->buf_idx) >= 3 && if ((p->mem_buf_len - p->buf_idx) >= 3 &&
p->mem_buf[p->buf_idx + 0] == 'r' && p->mem_buf[p->buf_idx + 0] == 'r' &&
p->mem_buf[p->buf_idx + 1] == 'u' && p->mem_buf[p->buf_idx + 1] == 'u' &&
@ -6021,15 +6015,55 @@ void Cyc_io_read_token(void *data, object cont, object port)
} }
return_thread_runnable(data, boolean_f); return_thread_runnable(data, boolean_f);
// TODO: numbers // TODO: numbers
// TODO: bytevector /*
// TODO: vector ((eq? #\e next-c)
} else if (c == '(') { (parse-number fp toks all? parens ptbl
10 (lambda (num)
(exact
(string->number (list->string num))))))
((eq? #\i next-c)
(parse-number fp toks all? parens ptbl
10 (lambda (num)
(inexact
(string->number (list->string num))))))
((eq? #\b next-c)
(parse-number fp toks all? parens ptbl
2 (lambda (num) (string->number (list->string num) 2))))
((eq? #\o next-c)
(parse-number fp toks all? parens ptbl
8 (lambda (num) (string->number (list->string num) 8))))
((eq? #\x next-c)
(parse-number fp toks all? parens ptbl
16 (lambda (num) (string->number (list->string num) 16))))
*/
} else if (c == '(') { // Vector
make_empty_vector(vec); make_empty_vector(vec);
return_thread_runnable(data, &vec); return_thread_runnable(data, &vec);
} } else if (c == 'u') { // Bytevector
_read_next_char(data, cont, p); // Fill buffer
c = p->mem_buf[p->buf_idx++];
p->col_num++;
if (c == '8') {
_read_next_char(data, cont, p); // Fill buffer
c = p->mem_buf[p->buf_idx++];
p->col_num++;
if (c == '(') {
make_empty_bytevector(vec);
return_thread_runnable(data, &vec);
} else {
_read_error(data, p, "Unhandled input sequence");
}
} else {
_read_error(data, p, "Unhandled input sequence");
}
// TODO: character // TODO: character
// TODO: datum comment } else if (c == '|') { // Block comment
{ _read_multiline_comment(p);
continue;
} else if (c == ';') { // Datum comment
object sym = find_or_add_symbol("#;");
return_thread_runnable(data, sym);
} else {
char buf[31]; char buf[31];
snprintf(buf, 30, "Unhandled input sequence %c", c); snprintf(buf, 30, "Unhandled input sequence %c", c);
_read_error(data, p, buf); _read_error(data, p, buf);