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.y | |
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.y')
-rw-r--r-- | parser.y | 21 |
1 files changed, 4 insertions, 17 deletions
@@ -1443,22 +1443,15 @@ void yybadtoken(parser_t *parser, int tok, val context) int parse_once(val stream, val name, parser_t *parser) { int res; - yyscan_t scanner; - parser->lineno = 1; - parser->errors = 0; + parser_common_init(parser); + parser->stream = stream; parser->name = name; - 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); + parser_cleanup(parser); return res; } @@ -1466,20 +1459,14 @@ int parse_once(val stream, val name, parser_t *parser) int parse(parser_t *parser) { int res; - yyscan_t scanner; parser->errors = 0; parser->prepared_msg = nil; parser->syntax_tree = nil; prime_parser(parser->parser); - yylex_init(&scanner); - parser->scanner = convert(scanner_t *, scanner); - - yyset_extra(parser, parser->scanner); + reset_scanner(parser->scanner); res = yyparse(parser->scanner, parser); - yylex_destroy(parser->scanner); - return res; } |