From 4e33de0b5b4a32e9b9b44c2ac23f4d757eb6e92e Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 29 Sep 2011 08:45:26 -0700 Subject: * match.c (mingap_k, maxgap_k, gap_k, times_k, lines_k): New symbol variables. (match_lines): Keyword arguments in collect implemented. (match_init): New function. * match.h (match_init): Declared. * parser.l (COLLECT): Lexical syntax changed for COLLECT to allow for argument material. * parser.y (%union): obj renamed to val. (exprs_opt): New nonterminal. (collect_clause): Rewritten for arguments. * txr.c (main): Call to match_init introduced. --- parser.y | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) (limited to 'parser.y') diff --git a/parser.y b/parser.y index 4d213caa..0972c100 100644 --- a/parser.y +++ b/parser.y @@ -52,7 +52,7 @@ static val parsed_spec; %union { wchar_t *lexeme; - union obj *obj; + union obj *val; wchar_t chr; cnum num; } @@ -63,17 +63,17 @@ static val parsed_spec; %token NUMBER %token REGCHAR LITCHAR -%type spec clauses clauses_opt clause -%type all_clause some_clause none_clause maybe_clause -%type cases_clause collect_clause clause_parts additional_parts -%type output_clause define_clause try_clause catch_clauses_opt -%type line elems_opt elems elem var var_op -%type list exprs expr out_clauses out_clauses_opt out_clause -%type repeat_clause repeat_parts_opt o_line -%type o_elems_opt o_elems_opt2 o_elems o_elem rep_elem rep_parts_opt -%type regex regexpr regbranch -%type regterm regclass regclassterm regrange -%type strlit chrlit quasilit quasi_items quasi_item litchars +%type spec clauses clauses_opt clause +%type all_clause some_clause none_clause maybe_clause +%type cases_clause collect_clause clause_parts additional_parts +%type output_clause define_clause try_clause catch_clauses_opt +%type line elems_opt elems elem var var_op +%type list exprs exprs_opt expr out_clauses out_clauses_opt out_clause +%type repeat_clause repeat_parts_opt o_line +%type o_elems_opt o_elems_opt2 o_elems o_elem rep_elem rep_parts_opt +%type regex regexpr regbranch +%type regterm regclass regclassterm regrange +%type strlit chrlit quasilit quasi_items quasi_item litchars %type regchar %nonassoc LOW /* used for precedence assertion */ %nonassoc ALL SOME NONE MAYBE CASES AND OR END COLLECT UNTIL COLL @@ -158,12 +158,16 @@ cases_clause : CASES newl clause_parts { $$ = cons(cases_s, $3); } yyerror("empty cases clause"); } ; -collect_clause : COLLECT newl clauses END newl { $$ = list(collect_s, - $3, nao); } - | COLLECT newl clauses - UNTIL newl clauses END newl { $$ = list(collect_s, $3, - $6, nao); } - | COLLECT newl error { $$ = nil; +collect_clause : COLLECT exprs_opt ')' newl + clauses END newl { $$ = list(collect_s, + $5, nil, $2, + nao); } + | COLLECT exprs_opt ')' + newl clauses + UNTIL newl clauses END newl { $$ = list(collect_s, $5, + $8, $2, nao); } + | COLLECT exprs_opt ')' + newl error { $$ = nil; if (yychar == UNTIL || yychar == END) yyerror("empty collect"); else @@ -444,6 +448,10 @@ exprs : expr { $$ = cons($1, nil); } | expr '.' expr { $$ = cons($1, $3); } ; +exprs_opt : exprs { $$ = $1; } + | /* empty */ { $$ = nil; } + ; + expr : IDENT { $$ = intern(string_own($1), nil); } | KEYWORD { $$ = intern(string_own($1), keyword_package); } @@ -685,4 +693,3 @@ val get_spec(void) { return parsed_spec; } - -- cgit v1.2.3