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.h | |
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.h')
-rw-r--r-- | parser.h | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -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); |