diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | match.c | 2 | ||||
-rw-r--r-- | parser.c | 4 | ||||
-rw-r--r-- | parser.h | 3 | ||||
-rw-r--r-- | parser.y | 22 | ||||
-rw-r--r-- | txr.c | 2 |
6 files changed, 42 insertions, 6 deletions
@@ -1,5 +1,20 @@ 2015-06-07 Kaz Kylheku <kaz@kylheku.com> + * match.c (v_load): Call parse_once rater than parse. + + * parser.c (regex_parse, lisp_parse): Likewise. + + * txr.c (txr_main): Likewise. + + * parser.h (parse): Declaration updated. + (parse_once): Declared. + + * parser.y (parse_once): New function, same as old parse implementation. + (parse): Becomes one argument function which works with a previously + initialized parser and continues the parse. + +2015-06-07 Kaz Kylheku <kaz@kylheku.com> + * stream.c (catenated_stream_p, catenated_stream_push): New functions. (stream_init): Registered new functions as intrinsics. @@ -3725,7 +3725,7 @@ static val v_load(match_files_ctx *c) parser_t parser; open_txr_file(path, &name, &stream); - parse(stream, name, &parser); + parse_once(stream, name, &parser); gc_state(gc); if (parser.errors) @@ -111,7 +111,7 @@ val regex_parse(val string, val error_stream) { int gc = gc_state(0); val name = if3(std_error != std_null, lit("regex"), lit("")); - parse(stream, name, &parser); + parse_once(stream, name, &parser); gc_state(gc); } std_error = save_stream; @@ -145,7 +145,7 @@ val lisp_parse(val source_in, val error_stream, val error_return_val, val name_i { int gc = gc_state(0); name = if3(std_error != std_null, name, lit("")); - parse(stream, name, &parser); + parse_once(stream, name, &parser); gc_state(gc); } @@ -56,7 +56,8 @@ parser_t *yyget_extra(yyscan_t scanner); void yyset_extra(parser_t *, yyscan_t); void parser_l_init(void); void open_txr_file(val spec_file, val *name, val *stream); -int parse(val stream, val name, parser_t *parser); +int parse_once(val stream, val name, parser_t *parser); +int parse(parser_t *parser); val source_loc(val form); val source_loc_str(val form); val rlset(val form, val info); @@ -1428,7 +1428,7 @@ void yybadtoken(parser_t *parser, int tok, val context) yyerrorf(scnr, lit("unexpected ~s"), chr(tok), nao); } -int parse(val stream, val name, parser_t *parser) +int parse_once(val stream, val name, parser_t *parser) { int res; yyscan_t scanner; @@ -1450,3 +1450,23 @@ int parse(val stream, val name, parser_t *parser) return res; } + +int parse(parser_t *parser) +{ + int res; + yyscan_t scanner; + + parser->errors = 0; + parser->prepared_msg = nil; + parser->syntax_tree = nil; + yylex_init(&scanner); + parser->scanner = convert(scanner_t *, scanner); + + yyset_extra(parser, parser->scanner); + + res = yyparse(parser->scanner, parser); + + yylex_destroy(parser->scanner); + + return res; +} @@ -665,7 +665,7 @@ int txr_main(int argc, char **argv) { int gc = gc_state(0); parser_t parser; - parse(parse_stream, spec_file_str, &parser); + parse_once(parse_stream, spec_file_str, &parser); gc_state(gc); if (parser.errors) |