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.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'parser.h') diff --git a/parser.h b/parser.h index e6f531f2..0db10d4e 100644 --- a/parser.h +++ b/parser.h @@ -26,6 +26,11 @@ typedef struct yyguts_t scanner_t; +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void *yyscan_t; +#endif + typedef struct { val parser; cnum lineno; @@ -35,14 +40,10 @@ typedef struct { val prepared_msg; val syntax_tree; val primer; + yyscan_t yyscan; scanner_t *scanner; } parser_t; -#ifndef YY_TYPEDEF_YY_SCANNER_T -#define YY_TYPEDEF_YY_SCANNER_T -typedef void *yyscan_t; -#endif - extern const wchar_t *spec_file; extern val form_to_ln_hash; extern val parser_s; @@ -52,6 +53,7 @@ void yyerrorf(scanner_t *scanner, val s, ...); void yybadtoken(parser_t *, int tok, val context); void end_of_regex(scanner_t *scanner); void end_of_char(scanner_t *scanner); +void reset_scanner(scanner_t *scanner); int yylex_init(yyscan_t *pscanner); int yylex_destroy(yyscan_t scanner); parser_t *yyget_extra(yyscan_t scanner); @@ -72,6 +74,8 @@ val rlcp_tree(val to, val from); val regex_parse(val string, val error_stream); val lisp_parse(val source, val error_stream, val error_return_val, val name); val read_eval_stream(val stream, val error_stream, val hash_bang_support); +void parser_common_init(parser_t *); +void parser_cleanup(parser_t *); val parser(val stream, val lineno, val primer); val get_parser(val stream); val parser_errors(val parser); -- cgit v1.2.3