summaryrefslogtreecommitdiffstats
path: root/parser.l
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2013-12-05 23:18:35 -0800
committerKaz Kylheku <kaz@kylheku.com>2013-12-05 23:18:35 -0800
commitf128b3e3f1ab9fb724d09486b59ae2a2b4cab29c (patch)
tree0f71acbb110df777c7e30b90c32525e8bd8a9d3e /parser.l
parent7563a6d0330a4ac02e3e0df169d35f9f395b8d71 (diff)
downloadtxr-f128b3e3f1ab9fb724d09486b59ae2a2b4cab29c.tar.gz
txr-f128b3e3f1ab9fb724d09486b59ae2a2b4cab29c.tar.bz2
txr-f128b3e3f1ab9fb724d09486b59ae2a2b4cab29c.zip
* eval.c (eval_init): Registered regex_parse as new
intrinsic function and std_null as new variable. * parser.h (yylex_destroy): Existing function declared. * parser.l (regex_parse): New function. New lexical syntax added which returns SECRET_ESCAPE_R. * parser.y (SECRET_ESCAPE_R): New token. (spec): Added syntactic variant which lets us smuggle a regex into the parser easily. * stream.c:x (std_null): New global variable. (null_stream_print): New static function. (null_ops): New static structure. (make_null_stream): New function. (stream_init): Protect and initialize std_null. * stream.h (std_null, make_null_stream): Declared. * txr.1: New features documented: regex-parse, *stdnull*. * txr.c (txr_main): Call yylex_destroy after parsing the program now that I know about this function; this can free up some memory.
Diffstat (limited to 'parser.l')
-rw-r--r--parser.l25
1 files changed, 25 insertions, 0 deletions
diff --git a/parser.l b/parser.l
index c629e481..18b4af3b 100644
--- a/parser.l
+++ b/parser.l
@@ -675,6 +675,11 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
yy_push_state(SPECIAL);
}
+<INITIAL>@\x01R {
+ yy_push_state(REGEX);
+ return SECRET_ESCAPE_R;
+}
+
<INITIAL>^@[#;].*\n {
/* eat whole line comment */
lineno++;
@@ -823,3 +828,23 @@ void parse_reset(val spec_file)
yyin_stream = make_stdio_stream(in, spec_file_str);
}
}
+
+val regex_parse(val string, val error_stream)
+{
+ uses_or2;
+ val parse_string = cat_str(list(lit("@\x01R/"), string, lit("/"), nao), nil);
+ yyin_stream = make_string_byte_input_stream(parse_string);
+ errors = 0;
+ lineno = 1;
+ val save_stream = std_error;
+ std_error = if3(error_stream == t, std_output, or2(error_stream, std_null));
+ {
+ int gc = gc_state(0);
+ spec_file_str = string;
+ yyparse();
+ yylex_destroy();
+ gc_state(gc);
+ }
+ std_error = save_stream;
+ return errors ? nil : rest(get_spec());
+}