summaryrefslogtreecommitdiffstats
path: root/parser.y
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-10-03 09:43:30 -0700
committerKaz Kylheku <kaz@kylheku.com>2011-10-03 09:43:30 -0700
commit53b4090be0ed161aadf9a7c36ebc896f3e131a1f (patch)
tree30e7554d93d4f0a45a64ab813092b30565791ecd /parser.y
parentd1a8b58b39e131df4a9fdc748cda449c0447bd19 (diff)
downloadtxr-53b4090be0ed161aadf9a7c36ebc896f3e131a1f.tar.gz
txr-53b4090be0ed161aadf9a7c36ebc896f3e131a1f.tar.bz2
txr-53b4090be0ed161aadf9a7c36ebc896f3e131a1f.zip
Implemented new last clause for collect and coll.
Bugfix in cases inside coll: was not collecting bindings. Bugfix for until inside coll: was not seeing bindings from main clause. * lib.c (ldiff): New function. * lib.h (ldiff): Declared. * match.c (match_line): Implemented last clause. Fixed cases handling by moving misplaced termination check. (match_files): Implemented last clause. * parser.y (until_last): New nonterminal symbol. (collect_clause): Refactored syntax to support until and last. (elem): Likewise. * txr.1: Updated.
Diffstat (limited to 'parser.y')
-rw-r--r--parser.y19
1 files changed, 13 insertions, 6 deletions
diff --git a/parser.y b/parser.y
index d767be50..24caac87 100644
--- a/parser.y
+++ b/parser.y
@@ -67,7 +67,7 @@ static val parsed_spec;
%type <val> spec clauses clauses_opt clause
%type <val> all_clause some_clause none_clause maybe_clause
-%type <val> cases_clause choose_clause collect_clause
+%type <val> cases_clause choose_clause collect_clause until_last
%type <val> clause_parts additional_parts
%type <val> output_clause define_clause try_clause catch_clauses_opt
%type <val> line elems_opt elems clause_parts_h additional_parts_h
@@ -179,18 +179,24 @@ collect_clause : COLLECT exprs_opt ')' newl
$5, nil, $2,
nao); }
| COLLECT exprs_opt ')'
- newl clauses
- UNTIL newl clauses END newl { $$ = list(collect_s, $5,
- $8, $2, nao); }
+ newl clauses until_last
+ newl clauses END newl { $$ = list(collect_s, $5,
+ cons($6, $8), $2, nao); }
| COLLECT exprs_opt ')'
newl error { $$ = nil;
- if (yychar == UNTIL || yychar == END)
+ if (yychar == UNTIL ||
+ yychar == END ||
+ yychar == LAST)
yyerror("empty collect");
else
yybadtoken(yychar,
lit("collect clause")); }
;
+until_last : UNTIL { $$ = until_s; }
+ | LAST { $$ = last_s; }
+ ;
+
clause_parts : clauses additional_parts { $$ = cons($1, $2); }
;
@@ -219,7 +225,8 @@ elem : TEXT { $$ = string_own($1); }
rest($1)); }
| COLL exprs_opt ')' elems END { $$ = list(coll_s, $4, nil, $2, nao); }
| COLL exprs_opt ')' elems
- UNTIL elems END { $$ = list(coll_s, $4, $6, $2, nao); }
+ until_last elems END { $$ = list(coll_s, $4, cons($5, $6),
+ $2, nao); }
| COLL error { $$ = nil;
yybadtoken(yychar, lit("coll clause")); }
| ALL clause_parts_h { $$ = list(all_s, t, $2, nao); }