summaryrefslogtreecommitdiffstats
path: root/parser.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-07-09 07:15:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-07-09 07:15:10 -0700
commit54d43f3260baaad25f5598ff876799711fe109ea (patch)
tree2a11d79234c7f2767094129fe44ba9b118039c1e /parser.h
parent64f9da2d4335178f7ffa0008a33ed1ee375e807d (diff)
downloadtxr-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.h14
1 files changed, 9 insertions, 5 deletions
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);