From 54d43f3260baaad25f5598ff876799711fe109ea Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 9 Jul 2015 07:15:10 -0700 Subject: 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. --- parser.y | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) (limited to 'parser.y') diff --git a/parser.y b/parser.y index 12324f51..de3f600d 100644 --- a/parser.y +++ b/parser.y @@ -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; } -- cgit v1.2.3