summaryrefslogtreecommitdiffstats
path: root/parser.l
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-11-07 10:21:42 -0800
committerKaz Kylheku <kaz@kylheku.com>2015-11-07 10:21:42 -0800
commit660af6ed504bac0258834f6e4c58ad81454dbad8 (patch)
treed888fa89f333c390cde67094b4b65cea2806405c /parser.l
parent7bbb027e111cc4b90248cd9d9da127839d91038a (diff)
downloadtxr-660af6ed504bac0258834f6e4c58ad81454dbad8.tar.gz
txr-660af6ed504bac0258834f6e4c58ad81454dbad8.tar.bz2
txr-660af6ed504bac0258834f6e4c58ad81454dbad8.zip
New iread function.
The read function no longer works like it used to on an interactive terminal because of the support for .. and . syntax on a top-level expression. The iread function is provided which uses a modified syntax that doesn't support these operators on a top-level expression. The parser thus doesn't look one token ahead, and so iread can return immediately. * eval.c (eval_init): Register iread intrinsic function. * parser.c (prime_parser): Only push back the recently seen token when priming for a regular Lisp read. Handle the prime_interactive method by preparing a SECRET_ESCAPE_I token. (lisp_parse_impl): New static function, formed from previous lisp_parse. Takes a boolean argument indicating interactive mode. (prime_parser_post): New function. (lisp_parse): Now a wrapper for lisp_parse_impl which passes a nil to indicate noninteractive read. (iread): New function. * parser.h (enum prime_parser): New member, prime_interactive. (scrub_scanner, iread, prime_parser_post): Declared. * parser.l (prime_scanner): Handle the prime_interactive case the same way as prime_lisp. (scrub_scanner): New function. * parser.y (SECRET_ESCAPE_I): New token type. (i_expr): New nonterminal symbol. Like n_expr, but doesn't support dot or dotdot operators, except in nested subexpressions. (spec): Handle SECRET_ESCAPE_I by way of i_expr. (sym_helper): Before freeing the token lexeme, call scrub_scanner. If the token is registered as the scanner's most recently seen token, the scanner must forget that registration, because it is no longer valid. (parse): Call prime_parser_post. * txr.1: Documented iread.
Diffstat (limited to 'parser.l')
-rw-r--r--parser.l11
1 files changed, 11 insertions, 0 deletions
diff --git a/parser.l b/parser.l
index 63941223..68767f7e 100644
--- a/parser.l
+++ b/parser.l
@@ -1065,6 +1065,7 @@ void prime_scanner(scanner_t *yyg, enum prime_parser prim)
switch (prim) {
case prime_lisp:
+ case prime_interactive:
yy_push_state(SPECIAL, yyg);
yy_push_state(NESTED, yyg);
yy_push_state(NESTED, yyg);
@@ -1075,6 +1076,16 @@ void prime_scanner(scanner_t *yyg, enum prime_parser prim)
}
}
+void scrub_scanner(scanner_t *yyg, int yy_char, wchar_t *lexeme)
+{
+ struct yy_token *rtok = &yyextra->recent_tok;
+
+ if (rtok->yy_char == yy_char && rtok->yy_lval.lexeme == lexeme) {
+ rtok->yy_char = 0;
+ rtok->yy_lval.lexeme = 0;
+ }
+}
+
void parser_l_init(void)
{
prot1(&form_to_ln_hash);