diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-07-09 07:15:10 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-07-09 07:15:10 -0700 |
commit | 54d43f3260baaad25f5598ff876799711fe109ea (patch) | |
tree | 2a11d79234c7f2767094129fe44ba9b118039c1e /parser.l | |
parent | 64f9da2d4335178f7ffa0008a33ed1ee375e807d (diff) | |
download | txr-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.l | 8 |
1 files changed, 8 insertions, 0 deletions
@@ -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); |