diff options
-rw-r--r-- | eval.c | 9 | ||||
-rw-r--r-- | match.c | 11 | ||||
-rw-r--r-- | parser.c | 8 | ||||
-rw-r--r-- | parser.h | 4 | ||||
-rw-r--r-- | parser.y | 9 | ||||
-rw-r--r-- | txr.c | 14 |
6 files changed, 29 insertions, 26 deletions
@@ -4364,21 +4364,22 @@ val load(val target) } } else { int gc = gc_state(0); - parser_t parser; - parse_once(stream, name, &parser); + val parser_obj = ensure_parser(stream); + parser_t *parser = parser_get_impl(self, parser_obj); + parse_once(self, stream, name); gc_state(gc); close_stream(stream, nil); uw_release_deferred_warnings(); - if (parser.errors) + if (parser->errors) uw_throwf(query_error_s, lit("~a: parser errors in ~a"), self, path, nao); { val match_ctx = uw_get_match_context(); val bindings = cdr(match_ctx); - val result = extract(parser.syntax_tree, nil, bindings); + val result = extract(parser->syntax_tree, nil, bindings); cons_bind (new_bindings, success, result); if (success) uw_set_match_context(cons(car(match_ctx), new_bindings)); @@ -4331,18 +4331,19 @@ static val v_load(match_files_ctx *c) if (!txr_lisp_p) { int gc = gc_state(0); - parser_t parser; + val parser_obj = ensure_parser(stream); + parser_t *parser = parser_get_impl(self, parser_obj); - parse_once(stream, name, &parser); + parse_once(self, stream, name); gc_state(gc); - if (parser.errors) + if (parser->errors) sem_error(specline, lit("~s: errors encountered in ~a"), sym, path, nao); if (sym == include_s) { - ret = parser.syntax_tree; + ret = parser->syntax_tree; } else { - val spec = parser.syntax_tree; + val spec = parser->syntax_tree; val result = match_files(mf_spec(*c, spec)); if (!result) { @@ -173,12 +173,12 @@ val parser(val stream, val lineno) return parser; } -static parser_t *get_parser_impl(val self, val parser) +parser_t *parser_get_impl(val self, val parser) { return coerce(parser_t *, cobj_handle(self, parser, parser_s)); } -static val ensure_parser(val stream) +val ensure_parser(val stream) { loc pcdr = gethash_l(lit("internal error"), stream_parser_hash, stream, nulloc); val pars = deref(pcdr); @@ -541,7 +541,7 @@ static val lisp_parse_impl(val self, val interactive, val rlcp_p, val source_in, stream_get_prop(input_stream, name_k))); val parser = ensure_parser(input_stream); val saved_dyn = dyn_env; - parser_t *pi = get_parser_impl(self, parser); + parser_t *pi = parser_get_impl(self, parser); volatile val parsed = nil; if (rlcp_p) @@ -628,7 +628,7 @@ static val read_file_common(val self, val stream, val error_stream, val compiled val parser = ensure_parser(stream); if (compiled) { - parser_t *pi = get_parser_impl(self, parser); + parser_t *pi = parser_get_impl(self, parser); pi->rec_source_loc = 0; } @@ -102,7 +102,7 @@ void parser_resolve_circ(parser_t *); void parser_circ_def(parser_t *, val num, val expr); val parser_circ_ref(parser_t *, val num); void scrub_scanner(scanner_t *, int yy_char, wchar_t *lexeme); -int parse_once(val stream, val name, parser_t *parser); +int parse_once(val self, val stream, val name); int parse(parser_t *parser, val name, enum prime_parser); val source_loc(val form); val source_loc_str(val form, val alt); @@ -129,7 +129,9 @@ val repl(val bindings, val in_stream, val out_stream, val env); void parser_common_init(parser_t *); void parser_cleanup(parser_t *); val parser(val stream, val lineno); +parser_t *parser_get_impl(val self, val parser); val get_parser(val stream); +val ensure_parser(val stream); val parser_errors(val parser); val parser_eof(val parser); void parse_init(void); @@ -1847,16 +1847,14 @@ void yybadtoken(parser_t *parser, int tok, val context) yyerrorf(scnr, lit("unexpected character ~a"), chr(tok), nao); } -int parse_once(val stream, val name, parser_t *parser) +int parse_once(val self, val stream, val name) { int res = 0; #if CONFIG_DEBUG_SUPPORT unsigned dbg_state = debug_clear(opt_dbg_expansion ? 0 : DBG_ENABLE); #endif - parser_common_init(parser); - - parser->stream = stream; - parser->name = name; + val parser_obj = ensure_parser(stream); + parser_t *parser = parser_get_impl(self, parser_obj); parser->rec_source_loc = 1; uw_catch_begin(cons(error_s, nil), esym, eobj); @@ -1872,7 +1870,6 @@ int parse_once(val stream, val name, parser_t *parser) } uw_unwind { - parser_cleanup(parser); #if CONFIG_DEBUG_SUPPORT debug_set(dbg_state); #endif @@ -470,10 +470,11 @@ static void no_dbg_support(val arg) } #endif -static int parse_once_noerr(val stream, val name, parser_t *parser) +static int parse_once_noerr(val stream, val name) { val pfx = format(nil, lit("~a:"), name, nao); - ignerr_func_body(int, 0, parse_once(stream, name, parser), std_error, pfx); + ignerr_func_body(int, 0, parse_once(prog_string, stream, name), + std_error, pfx); } static val read_compiled_file_noerr(val self, val stream, val name, val error_stream) @@ -1052,22 +1053,23 @@ int txr_main(int argc, char **argv) if (!txr_lisp_p) { int gc = gc_state(0); - parser_t parser; - parse_once_noerr(parse_stream, spec_file_str, &parser); + val parser_obj = ensure_parser(parse_stream); + parser_t *parser = parser_get_impl(prog_string, parser_obj); + parse_once_noerr(parse_stream, spec_file_str); gc_state(gc); close_stream(parse_stream, nil); uw_release_deferred_warnings(); - spec = parser.syntax_tree; + spec = parser->syntax_tree; opt_loglevel = match_loglevel; if (opt_compat && opt_compat <= 199) reg_var(intern(lit("*self-path*"), user_package), spec_file_str); - if (parser.errors) { + if (parser->errors) { if (enter_repl) goto repl; return EXIT_FAILURE; |