summaryrefslogtreecommitdiffstats
path: root/parser.l
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-07-09 07:15:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-07-09 07:15:10 -0700
commit54d43f3260baaad25f5598ff876799711fe109ea (patch)
tree2a11d79234c7f2767094129fe44ba9b118039c1e /parser.l
parent64f9da2d4335178f7ffa0008a33ed1ee375e807d (diff)
downloadtxr-54d43f3260baaad25f5598ff876799711fe109ea.tar.gz
txr-54d43f3260baaad25f5598ff876799711fe109ea.tar.bz2
txr-54d43f3260baaad25f5598ff876799711fe109ea.zip
Parser cleanup: embed scanner in parser.
* parser.c (parser_destroy): New GC finalizer static function. (parser_ops): Register parser_destroy. (parser_common_init): New function, shared by parse and parse_once. Initializes embedded scanner. (parser_cleanup): New function, shared by parse_once and parser_destroy. (parser): Use parser_common_init. * parser.h (parser_t): New member, yyscan. (reset_scanner, parser_common_init): Declared. * parser.l (reset_scanner): New function. * parser.y (parse_once): Use parser_common_init, and thus perform only a few initializations. Do not define scanner as a local variable. (parse): Call reset_scanner instead of yylex_init since the scanner is being reused, and for the same reason do not call yylex_destroy. GC will do that now.
Diffstat (limited to 'parser.l')
-rw-r--r--parser.l8
1 files changed, 8 insertions, 0 deletions
diff --git a/parser.l b/parser.l
index f7c717e8..4739dd59 100644
--- a/parser.l
+++ b/parser.l
@@ -960,6 +960,14 @@ void end_of_char(scanner_t *yyg)
yy_pop_state(yyg);
}
+void reset_scanner(scanner_t *yyg)
+{
+ while (YYSTATE != INITIAL)
+ yy_pop_state(yyg);
+
+ yy_flush_buffer(YY_CURRENT_BUFFER, yyg);
+}
+
val source_loc(val form)
{
return gethash(form_to_ln_hash, form);