diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2013-12-05 23:18:35 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2013-12-05 23:18:35 -0800 |
commit | f128b3e3f1ab9fb724d09486b59ae2a2b4cab29c (patch) | |
tree | 0f71acbb110df777c7e30b90c32525e8bd8a9d3e /parser.l | |
parent | 7563a6d0330a4ac02e3e0df169d35f9f395b8d71 (diff) | |
download | txr-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.l | 25 |
1 files changed, 25 insertions, 0 deletions
@@ -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()); +} |