summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--parser.c11
-rw-r--r--parser.h1
2 files changed, 11 insertions, 1 deletions
diff --git a/parser.c b/parser.c
index 5d24fcb0..d232e588 100644
--- a/parser.c
+++ b/parser.c
@@ -351,14 +351,17 @@ val read_eval_stream(val stream, val error_stream, val hash_bang_support)
for (;;) {
val form = lisp_parse(stream, error_stream, error_val, name, colon_k);
+ val parser = get_parser(stream);
if (form == error_val) {
- if (parser_errors(get_parser(stream)) == zero)
+ if (parser_errors(parser) == zero)
break;
return nil;
}
(void) eval_intrinsic(form, nil);
+ if (parser_eof(parser))
+ break;
}
return t;
@@ -638,6 +641,12 @@ val parser_errors(val parser)
return num(p->errors);
}
+val parser_eof(val parser)
+{
+ parser_t *p = coerce(parser_t *, cobj_handle(parser, parser_s));
+ return tnil(p->recent_tok.yy_char == 0);
+}
+
void parse_init(void)
{
parser_s = intern(lit("parser"), user_package);
diff --git a/parser.h b/parser.h
index efbaa351..95b9e4f7 100644
--- a/parser.h
+++ b/parser.h
@@ -104,4 +104,5 @@ void parser_cleanup(parser_t *);
val parser(val stream, val lineno);
val get_parser(val stream);
val parser_errors(val parser);
+val parser_eof(val parser);
void parse_init(void);