diff options
Diffstat (limited to 'ghc/compiler/parser/hsparser.y')
-rw-r--r-- | ghc/compiler/parser/hsparser.y | 106 |
1 files changed, 67 insertions, 39 deletions
diff --git a/ghc/compiler/parser/hsparser.y b/ghc/compiler/parser/hsparser.y index 74473d2dae..d30b323617 100644 --- a/ghc/compiler/parser/hsparser.y +++ b/ghc/compiler/parser/hsparser.y @@ -95,6 +95,7 @@ BOOLEAN pat_check=TRUE; entidt uentid; id uid; qid uqid; + rulevar urulevar; literal uliteral; maybe umaybe; either ueither; @@ -194,7 +195,7 @@ BOOLEAN pat_check=TRUE; **********************************************************************/ %token INTERFACE_UPRAGMA SPECIALISE_UPRAGMA -%token INLINE_UPRAGMA NOINLINE_UPRAGMA MAGIC_UNFOLDING_UPRAGMA +%token INLINE_UPRAGMA NOINLINE_UPRAGMA MAGIC_UNFOLDING_UPRAGMA RULES_UPRAGMA %token END_UPRAGMA %token SOURCE_UPRAGMA @@ -238,16 +239,16 @@ BOOLEAN pat_check=TRUE; rbinds rbinds1 rpats rpats1 list_exps list_rest qvarsk qvars_list constrs fields conargatypes - tautypes atypes - types_and_maybe_ids + tautypes polytypes atypes pats simple_context simple_context_list export_list enames import_list inames impdecls maybeimpdecls impdecl dtyclses dtycls_list gdrhs gdpat - lampats cexps gd texps - tyvars1 constr_context forall + lampats aexps gd texps + var_list constr_context forall + rule_forall rule_var_list %type <umatch> alt @@ -265,6 +266,8 @@ BOOLEAN pat_check=TRUE; patk bpatk apatck conpatk +%type <urulevar> rule_var + %type <uid> MINUS PLUS DARROW AS LAZY VARID CONID VARSYM CONSYM var con varop conop op @@ -282,7 +285,8 @@ BOOLEAN pat_check=TRUE; %type <ubinding> topdecl topdecls letdecls typed datad newtd classd instd defaultd foreignd decl decls non_empty_decls fixdecl fix_op fix_ops valdef - maybe_where where_body type_and_maybe_id + maybe_where where_body + ruled rules rule %type <uttype> polytype conargatype conapptype @@ -303,6 +307,7 @@ BOOLEAN pat_check=TRUE; %type <ulong> commas importkey get_line_no unsafe_flag callconv + /********************************************************************** * * * * @@ -468,9 +473,40 @@ topdecl : typed { $$ = $1; FN = NULL; SAMEFN = 0; } | instd { $$ = $1; FN = NULL; SAMEFN = 0; } | defaultd { $$ = $1; FN = NULL; SAMEFN = 0; } | foreignd { $$ = $1; FN = NULL; SAMEFN = 0; } + | ruled { $$ = $1; FN = NULL; SAMEFN = 0; } | decl { $$ = $1; } ; +/* *********************************************************** */ +/* Transformation rules */ + +ruled : RULES_UPRAGMA rules END_UPRAGMA { $$ = $2; } + ; + +rules : /* empty */ { $$ = mknullbind(); } + | rule { $$ = $1; } + | rule SEMI rules { $$ = mkabind($1,$3); } + | SEMI rules { $$ = $2; } + ; + +rule : STRING rule_forall fexp + EQUAL get_line_no exp { $$ = mkrule_prag($1,$2,$3,$6,$5); } + +rule_forall : FORALL rule_var_list DOT { $$ = $2; } + | /* Empty */ { $$ = Lnil; } + ; + +rule_var_list : /* Empty */ { $$ = Lnil; } + | rule_var { $$ = lsing($1); } + | rule_var COMMA rule_var_list { $$ = mklcons($1,$3); } + ; + +rule_var : varid { $$ = mkprulevar( $1 ); } + | varid DCOLON polytype { $$ = mkprulevarsig( $1, $3 ); } + ; + +/* *********************************************************** */ + typed : typekey simple_con_app EQUAL tautype { $$ = mknbind($2,$4,startlineno); } ; @@ -596,15 +632,15 @@ decl : fixdecl Have left out the case specialising to an overloaded type. Let's get real, OK? (WDP) */ - | SPECIALISE_UPRAGMA qvark DCOLON types_and_maybe_ids END_UPRAGMA + | SPECIALISE_UPRAGMA qvark DCOLON polytypes END_UPRAGMA { $$ = mkvspec_uprag($2, $4, startlineno); FN = NULL; SAMEFN = 0; } - | SPECIALISE_UPRAGMA INSTANCE gtycon atype END_UPRAGMA + | SPECIALISE_UPRAGMA INSTANCE inst_type END_UPRAGMA { - $$ = mkispec_uprag($3, $4, startlineno); + $$ = mkispec_uprag($3, startlineno); FN = NULL; SAMEFN = 0; } @@ -667,15 +703,6 @@ qvars_list: qvar { $$ = lsing($1); } | qvars_list COMMA qvar { $$ = lapp($1,$3); } ; -types_and_maybe_ids : - type_and_maybe_id { $$ = lsing($1); } - | types_and_maybe_ids COMMA type_and_maybe_id { $$ = lapp($1,$3); } - ; - -type_and_maybe_id : - tautype { $$ = mkvspec_ty_and_id($1,mknothing()); } - | tautype EQUAL qvark { $$ = mkvspec_ty_and_id($1,mkjust($3)); } - /********************************************************************** * * @@ -702,13 +729,17 @@ type_and_maybe_id : polyatype : atype ; -polytype : FORALL tyvars1 DOT +polytype : FORALL var_list DOT apptype DARROW tautype { $$ = mkforall($2, type2context($4), $6); } - | FORALL tyvars1 DOT tautype { $$ = mkforall($2, Lnil, $4); } + | FORALL var_list DOT tautype { $$ = mkforall($2, Lnil, $4); } | apptype DARROW tautype { $$ = mkimp_forall( type2context($1), $3); } | tautype ; +polytypes : polytype { $$ = lsing($1); } + | polytypes COMMA polytype { $$ = lapp($1,$3); } + ; + /* --------------------------- */ /* tautype is just a monomorphic type. But it may have nested for-alls if we're in a rank-2 type */ @@ -797,10 +828,6 @@ constr : forall constr_context DARROW constr_after_context { $$ = mkconstrex ( | forall constr_after_context { $$ = mkconstrex ( $1, Lnil, $2 ); } ; -forall : { $$ = Lnil } - | FORALL tyvars1 DOT { $$ = $2; } - ; - constr_context : conapptype conargatype { $$ = type2context( mktapp($1,$2) ); } | conargatype { $$ = type2context( $1 ); } @@ -1026,14 +1053,10 @@ kexpLno : LAMBDA dorest { $$ = mkdoe($3,$<ulong>2); } /* CCALL/CASM Expression */ - | CCALL ccallid cexps { $$ = mkccall($2,install_literal("n"),$3); } - | CCALL ccallid { $$ = mkccall($2,install_literal("n"),Lnil); } - | CCALL_GC ccallid cexps { $$ = mkccall($2,install_literal("p"),$3); } - | CCALL_GC ccallid { $$ = mkccall($2,install_literal("p"),Lnil); } - | CASM CLITLIT cexps { $$ = mkccall($2,install_literal("N"),$3); } - | CASM CLITLIT { $$ = mkccall($2,install_literal("N"),Lnil); } - | CASM_GC CLITLIT cexps { $$ = mkccall($2,install_literal("P"),$3); } - | CASM_GC CLITLIT { $$ = mkccall($2,install_literal("P"),Lnil); } + | CCALL ccallid aexps { $$ = mkccall($2,install_literal("n"),$3); } + | CCALL_GC ccallid aexps { $$ = mkccall($2,install_literal("p"),$3); } + | CASM CLITLIT aexps { $$ = mkccall($2,install_literal("N"),$3); } + | CASM_GC CLITLIT aexps { $$ = mkccall($2,install_literal("P"),$3); } /* SCC Expression */ | SCC STRING exp @@ -1088,8 +1111,8 @@ aexp : qvar { $$ = mkident($1); } ; /* ccall arguments */ -cexps : cexps aexp { $$ = lapp($1,$2); } - | aexp { $$ = lsing($1); } +aexps : aexps aexp { $$ = lapp($1,$2); } + | /* empty */ { $$ = Lnil; } ; caserest: ocurly alts ccurly { $$ = $2; } @@ -1581,13 +1604,18 @@ modid : CONID ; /* ---------------------------------------------- */ -tyvar : varid_noforall { $$ = $1; } +tyvar : varid_noforall { $$ = $1; } ; -/* tyvars1: At least one tyvar */ -tyvars1 : tyvar { $$ = lsing($1); } - | tyvar tyvars1 { $$ = mklcons($1,$2); } - ; +/* var_list: At least one var; used mainly for tyvars */ +var_list : varid_noforall { $$ = lsing($1); } + | varid_noforall var_list { $$ = mklcons($1,$2); } + ; + +forall : /* Empty */ { $$ = Lnil } + | FORALL var_list DOT { $$ = $2; } + ; + /********************************************************************** * * |