summaryrefslogtreecommitdiff
path: root/ghc/compiler/rename/ParseIface.y
diff options
context:
space:
mode:
Diffstat (limited to 'ghc/compiler/rename/ParseIface.y')
-rw-r--r--ghc/compiler/rename/ParseIface.y133
1 files changed, 90 insertions, 43 deletions
diff --git a/ghc/compiler/rename/ParseIface.y b/ghc/compiler/rename/ParseIface.y
index 1f6e8315a4..1092208b95 100644
--- a/ghc/compiler/rename/ParseIface.y
+++ b/ghc/compiler/rename/ParseIface.y
@@ -93,14 +93,24 @@ parseIface = parseIToks . lexIface
LAM { ITlam }
BIGLAM { ITbiglam }
CASE { ITcase }
+ PRIM_CASE { ITprim_case }
OF { ITof }
LET { ITlet }
LETREC { ITletrec }
IN { ITin }
+ ATSIGN { ITatsign }
COERCE_IN { ITcoerce_in }
COERCE_OUT { ITcoerce_out }
CHAR { ITchar $$ }
STRING { ITstring $$ }
+ DOUBLE { ITdouble $$ }
+ INTEGER_LIT { ITinteger_lit }
+ STRING_LIT { ITstring_lit }
+ FLOAT_LIT { ITfloat_lit }
+ RATIONAL_LIT { ITrational_lit }
+ ADDR_LIT { ITaddr_lit }
+ LIT_LIT { ITlit_lit }
+ CCALL { ITccall $$ }
%%
iface :: { ParsedIface }
@@ -153,13 +163,17 @@ exports_part : EXPORTS_PART export_items { $2 }
export_items :: { [ExportItem] }
export_items : { [] }
- | export_item export_items { $1 : $2 }
+ | mod_name entities SEMI export_items { ($1,$2) : $4 }
-export_item :: { ExportItem }
-export_item : mod_name entity_occ maybe_dotdot { ($1, $2, $3) }
+entities :: { [(OccName, [OccName])] }
+entities : { [] }
+ | entity entities { $1 : $2 }
-maybe_dotdot :: { [OccName] }
-maybe_dotdot : { [] }
+entity :: { (OccName, [OccName]) }
+entity : entity_occ maybe_inside { ($1, $2) }
+
+maybe_inside :: { [OccName] }
+maybe_inside : { [] }
| OPAREN val_occs CPAREN { $2
--------------------------------------------------------------------------
}
@@ -209,7 +223,7 @@ topdecl : TYPE tc_name tv_bndrs EQUAL type SEMI
{ TyD (TyNew $2 $3 $4 $6 $7 noDataPragmas mkIfaceSrcLoc) }
| CLASS decl_context tc_name tv_bndr csigs SEMI
{ ClD (ClassDecl $2 $3 $4 $5 EmptyMonoBinds noClassPragmas mkIfaceSrcLoc) }
- | var_name DCOLON ctype id_info SEMI
+ | var_name DCOLON type id_info SEMI
{ SigD (IfaceSig $1 $3 $4 mkIfaceSrcLoc) }
decl_context :: { RdrNameContext }
@@ -225,7 +239,7 @@ csigs1 : csig { [$1] }
| csig SEMI csigs1 { $1 : $3 }
csig :: { RdrNameSig }
-csig : var_name DCOLON ctype { ClassOpSig $1 $3 noClassOpPragmas mkIfaceSrcLoc
+csig : var_name DCOLON type { ClassOpSig $1 $3 noClassOpPragmas mkIfaceSrcLoc
----------------------------------------------------------------
}
@@ -257,8 +271,8 @@ fields1 : field { [$1] }
| field COMMA fields1 { $1 : $3 }
field :: { ([RdrName], RdrNameBangType) }
-field : var_name DCOLON ctype { ([$1], Unbanged $3) }
- | var_name DCOLON BANG ctype { ([$1], Banged $4)
+field : var_name DCOLON type { ([$1], Unbanged $3) }
+ | var_name DCOLON BANG type { ([$1], Banged $4)
--------------------------------------------------------------------------
}
@@ -276,34 +290,34 @@ context_list1 : class { [$1] }
class :: { (RdrName, RdrNameHsType) }
class : qtc_name atype { ($1, $2) }
-ctype :: { RdrNameHsType }
-ctype : FORALL forall context DARROW type { mkHsForAllTy $2 $3 $5 }
- | type { $1 }
-
type :: { RdrNameHsType }
-type : btype { $1 }
- | btype RARROW type { MonoFunTy $1 $3 }
+type : FORALL forall context DARROW tautype { mkHsForAllTy $2 $3 $5 }
+ | tautype { $1 }
+
+tautype :: { RdrNameHsType }
+tautype : btype { $1 }
+ | btype RARROW tautype { MonoFunTy $1 $3 }
-ctypes2 :: { [RdrNameHsType] {- Two or more -} }
-ctypes2 : ctype COMMA ctype { [$1,$3] }
- | ctype COMMA ctypes2 { $1 : $3 }
+types2 :: { [RdrNameHsType] {- Two or more -} }
+types2 : type COMMA type { [$1,$3] }
+ | type COMMA types2 { $1 : $3 }
btype :: { RdrNameHsType }
btype : atype { $1 }
- | qtc_name atypes1 { MonoTyApp $1 $2 }
- | tv_name atypes1 { MonoTyApp $1 $2 }
+ | qtc_name atype atypes { MonoTyApp $1 ($2:$3) }
+ | tv_name atype atypes { MonoTyApp $1 ($2:$3) }
atype :: { RdrNameHsType }
atype : qtc_name { MonoTyApp $1 [] }
| tv_name { MonoTyVar $1 }
- | OPAREN ctypes2 CPAREN { MonoTupleTy dummyRdrTcName $2 }
+ | OPAREN types2 CPAREN { MonoTupleTy dummyRdrTcName $2 }
| OBRACK type CBRACK { MonoListTy dummyRdrTcName $2 }
| OCURLY qtc_name atype CCURLY { MonoDictTy $2 $3 }
- | OPAREN ctype CPAREN { $2 }
+ | OPAREN type CPAREN { $2 }
-atypes1 :: { [RdrNameHsType] {- One or more -} }
-atypes1 : atype { [$1] }
- | atype atypes1 { $1 : $2
+atypes :: { [RdrNameHsType] {- Zero or more -} }
+atypes : { [] }
+ | atype atypes { $1 : $2
---------------------------------------------------------------------
}
@@ -337,6 +351,9 @@ qvar_name :: { RdrName }
var_name :: { RdrName }
var_name : var_occ { Unqual $1 }
+any_var_name :: {RdrName}
+any_var_name : var_name { $1 }
+ | qvar_name { $1 }
qdata_name :: { RdrName }
qdata_name : QCONID { varQual $1 }
@@ -393,7 +410,7 @@ instdecls : { [] }
| instd instdecls { $1 : $2 }
instd :: { RdrNameInstDecl }
-instd : INSTANCE ctype EQUAL var_name SEMI
+instd : INSTANCE type EQUAL var_name SEMI
{ InstDecl $2
EmptyMonoBinds {- No bindings -}
[] {- No user pragmas -}
@@ -404,41 +421,53 @@ instd : INSTANCE ctype EQUAL var_name SEMI
id_info :: { [HsIdInfo RdrName] }
id_info : { [] }
- | ARITY_PART arity_info id_info { HsArity $2 : $3 }
- | STRICT_PART strict_info id_info { HsStrictness $2 : $3 }
- | UNFOLD_PART core_expr id_info { HsUnfold $2 : $3 }
+ | id_info_item id_info { $1 : $2 }
+
+id_info_item :: { HsIdInfo RdrName }
+id_info_item : ARITY_PART arity_info { HsArity $2 }
+ | STRICT_PART strict_info { HsStrictness $2 }
+ | BOTTOM { HsStrictness mkBottomStrictnessInfo }
+ | UNFOLD_PART core_expr { HsUnfold $2 }
arity_info :: { ArityInfo }
arity_info : INTEGER { exactArity (fromInteger $1) }
strict_info :: { StrictnessInfo RdrName }
-strict_info : DEMAND qvar_name { mkStrictnessInfo $1 (Just $2) }
+strict_info : DEMAND any_var_name { mkStrictnessInfo $1 (Just $2) }
| DEMAND { mkStrictnessInfo $1 Nothing }
- | BOTTOM { mkBottomStrictnessInfo }
core_expr :: { UfExpr RdrName }
-core_expr : var_name { UfVar $1 }
- | qvar_name { UfVar $1 }
+core_expr : any_var_name { UfVar $1 }
| qdata_name { UfVar $1 }
| core_lit { UfLit $1 }
+ | OPAREN core_expr CPAREN { $2 }
+
+ | core_expr ATSIGN atype { UfApp $1 (UfTyArg $3) }
| core_expr core_arg { UfApp $1 $2 }
- | LAM core_val_bndr RARROW core_expr { UfLam $2 $4 }
+ | LAM core_val_bndrs RARROW core_expr { foldr UfLam $4 $2 }
| BIGLAM core_tv_bndrs RARROW core_expr { foldr UfLam $4 $2 }
| CASE core_expr OF
OCURLY alg_alts core_default CCURLY { UfCase $2 (UfAlgAlts $5 $6) }
- | CASE BANG core_expr OF
- OCURLY prim_alts core_default CCURLY { UfCase $3 (UfPrimAlts $6 $7) }
+ | PRIM_CASE core_expr OF
+ OCURLY prim_alts core_default CCURLY { UfCase $2 (UfPrimAlts $5 $6) }
+
| LET OCURLY core_val_bndr EQUAL core_expr CCURLY
IN core_expr { UfLet (UfNonRec $3 $5) $8 }
| LETREC OCURLY rec_binds CCURLY
IN core_expr { UfLet (UfRec $3) $6 }
- | qdata_name BANG core_args { UfCon $1 $3 }
- | qvar_name BANG core_args { UfPrim (UfOtherOp $1) $3 }
| coerce atype core_expr { UfCoerce $1 $2 $3 }
+ | CCALL ccall_string
+ OBRACK atype atypes CBRACK core_args { let
+ (is_casm, may_gc) = $1
+ in
+ UfPrim (UfCCallOp $2 is_casm may_gc $5 $4)
+ $7
+ }
+
rec_binds :: { [(UfBinder RdrName, UfExpr RdrName)] }
: { [] }
| core_val_bndr EQUAL core_expr SEMI rec_binds { ($1,$3) : $5 }
@@ -458,23 +487,37 @@ alg_alts :: { [(RdrName, [UfBinder RdrName], UfExpr RdrName)] }
core_default :: { UfDefault RdrName }
: { UfNoDefault }
- | core_val_bndr RARROW core_expr { UfBindDefault $1 $3 }
+ | core_val_bndr RARROW core_expr SEMI { UfBindDefault $1 $3 }
core_arg :: { UfArg RdrName }
: var_name { UfVarArg $1 }
| qvar_name { UfVarArg $1 }
| qdata_name { UfVarArg $1 }
| core_lit { UfLitArg $1 }
- | OBRACK atype CBRACK { UfTyArg $2 }
core_args :: { [UfArg RdrName] }
: { [] }
| core_arg core_args { $1 : $2 }
core_lit :: { Literal }
-core_lit : INTEGER { MachInt $1 True }
- | CHAR { MachChar $1 }
- | STRING { MachStr $1 }
+core_lit : INTEGER { MachInt $1 True }
+ | CHAR { MachChar $1 }
+ | STRING { MachStr $1 }
+ | STRING_LIT STRING { NoRepStr $2 }
+ | DOUBLE { MachDouble (toRational $1) }
+ | FLOAT_LIT DOUBLE { MachFloat (toRational $2) }
+
+ | INTEGER_LIT INTEGER { NoRepInteger $2 (panic "NoRepInteger type")
+ -- The type checker will add the types
+ }
+
+ | RATIONAL_LIT INTEGER INTEGER { NoRepRational ($2 % $3)
+ (panic "NoRepRational type")
+ -- The type checker will add the type
+ }
+
+ | ADDR_LIT INTEGER { MachAddr $2 }
+ | LIT_LIT STRING { MachLitLit $2 (panic "ParseIface.y: ToDo: need PrimRep on LitLits in ifaces") }
core_val_bndr :: { UfBinder RdrName }
core_val_bndr : var_name DCOLON atype { UfValBinder $1 $3 }
@@ -491,3 +534,7 @@ core_tv_bndrs :: { [UfBinder RdrName] }
core_tv_bndrs : { [] }
| core_tv_bndr core_tv_bndrs { $1 : $2 }
+ccall_string :: { FAST_STRING }
+ : STRING { $1 }
+ | VARID { $1 }
+ | CONID { $1 }