diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-10-03 09:43:30 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-10-03 09:43:30 -0700 |
commit | 53b4090be0ed161aadf9a7c36ebc896f3e131a1f (patch) | |
tree | 30e7554d93d4f0a45a64ab813092b30565791ecd /parser.y | |
parent | d1a8b58b39e131df4a9fdc748cda449c0447bd19 (diff) | |
download | txr-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.y | 19 |
1 files changed, 13 insertions, 6 deletions
@@ -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); } |