From 5f1979b78fa32b120a7c1a9a1731de3bab4e09ae Mon Sep 17 00:00:00 2001 From: sof <unknown> Date: Wed, 1 Sep 1999 14:08:19 +0000 Subject: [PATCH] [project @ 1999-09-01 14:08:19 by sof] * On foreign decls, "ext_name"s are now optional. If missing, the ext_name is made equal to the Haskell name. * Half a dozen special-ids were incorrectly handled when occurring as tyvars. --- ghc/compiler/parser/Lex.lhs | 4 ++++ ghc/compiler/parser/ParseUtil.lhs | 22 ++++++++++++++--- ghc/compiler/parser/Parser.y | 40 ++++++++++++++++++------------- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/ghc/compiler/parser/Lex.lhs b/ghc/compiler/parser/Lex.lhs index e1de35a2ee5b..4ee690be8445 100644 --- a/ghc/compiler/parser/Lex.lhs +++ b/ghc/compiler/parser/Lex.lhs @@ -128,6 +128,8 @@ data Token | ITlabel | ITdynamic | ITunsafe + | ITstdcallconv + | ITccallconv | ITinterface -- interface keywords | IT__export @@ -280,6 +282,8 @@ ghcExtensionKeywordsFM = listToUFM $ ( "label", ITlabel ), ( "dynamic", ITdynamic ), ( "unsafe", ITunsafe ), + ( "stdcall", ITstdcallconv), + ( "ccall", ITccallconv), ("_ccall_", ITccall (False, False, False)), ("_ccall_GC_", ITccall (False, False, True)), ("_casm_", ITccall (False, True, False)), diff --git a/ghc/compiler/parser/ParseUtil.lhs b/ghc/compiler/parser/ParseUtil.lhs index ce4f71bfcfb9..395d06c80f35 100644 --- a/ghc/compiler/parser/ParseUtil.lhs +++ b/ghc/compiler/parser/ParseUtil.lhs @@ -13,9 +13,10 @@ module ParseUtil ( , mkRecConstrOrUpdate -- HsExp -> [HsFieldUpdate] -> P HsExp , groupBindings + + , mkExtName -- Maybe ExtName -> RdrName -> ExtName , checkPrec -- String -> P String - , checkCallConv -- FAST_STRING -> P CallConv , checkContext -- HsType -> P HsContext , checkInstType -- HsType -> P HsType , checkAssertion -- HsType -> P HsAsst @@ -35,10 +36,11 @@ module ParseUtil ( -- pseudo-keywords, in var and tyvar forms (all :: RdrName) , as_var_RDR, hiding_var_RDR, qualified_var_RDR, forall_var_RDR , export_var_RDR, label_var_RDR, dynamic_var_RDR, unsafe_var_RDR + , stdcall_var_RDR, ccall_var_RDR , as_tyvar_RDR, hiding_tyvar_RDR, qualified_tyvar_RDR , export_tyvar_RDR, label_tyvar_RDR, dynamic_tyvar_RDR - , unsafe_tyvar_RDR + , unsafe_tyvar_RDR, stdcall_tyvar_RDR, ccall_tyvar_RDR , minus_RDR, pling_RDR, dot_RDR @@ -53,7 +55,7 @@ import RdrHsSyn import RdrName import CallConv import PrelMods ( pRELUDE_Name, mkUbxTupNameStr, mkTupNameStr ) -import OccName ( dataName, tcName, varName, tvName, setOccNameSpace ) +import OccName ( dataName, tcName, varName, tvName, setOccNameSpace, occNameFS ) import CmdLineOpts ( opt_NoImplicitPrelude ) import StringBuffer ( lexemeToString ) import FastString ( unpackFS ) @@ -354,6 +356,14 @@ mkRecConstrOrUpdate exp fs@(_:_) mkRecConstrOrUpdate _ _ = parseError "Empty record update" +-- supplying the ext_name in a foreign decl is optional ; if it +-- isn't there, the Haskell name is assumed. Note that no transformation +-- of the Haskell name is then performed, so if you foreign export (++), +-- it's external name will be "++". Too bad. +mkExtName :: Maybe ExtName -> RdrName -> ExtName +mkExtName Nothing rdrNm = ExtName (occNameFS (rdrNameOcc rdrNm)) Nothing +mkExtName (Just x) _ = x + ----------------------------------------------------------------------------- -- group function bindings into equation groups @@ -436,6 +446,8 @@ exportName = SLIT("export") labelName = SLIT("label") dynamicName = SLIT("dynamic") unsafeName = SLIT("unsafe") +stdcallName = SLIT("stdcall") +ccallName = SLIT("ccall") as_var_RDR = mkSrcUnqual varName asName hiding_var_RDR = mkSrcUnqual varName hidingName @@ -445,6 +457,8 @@ export_var_RDR = mkSrcUnqual varName exportName label_var_RDR = mkSrcUnqual varName labelName dynamic_var_RDR = mkSrcUnqual varName dynamicName unsafe_var_RDR = mkSrcUnqual varName unsafeName +stdcall_var_RDR = mkSrcUnqual varName stdcallName +ccall_var_RDR = mkSrcUnqual varName ccallName as_tyvar_RDR = mkSrcUnqual tvName asName hiding_tyvar_RDR = mkSrcUnqual tvName hidingName @@ -453,6 +467,8 @@ export_tyvar_RDR = mkSrcUnqual tvName exportName label_tyvar_RDR = mkSrcUnqual tvName labelName dynamic_tyvar_RDR = mkSrcUnqual tvName dynamicName unsafe_tyvar_RDR = mkSrcUnqual tvName unsafeName +stdcall_tyvar_RDR = mkSrcUnqual tvName stdcallName +ccall_tyvar_RDR = mkSrcUnqual tvName ccallName minus_RDR = mkSrcUnqual varName SLIT("-") pling_RDR = mkSrcUnqual varName SLIT("!") diff --git a/ghc/compiler/parser/Parser.y b/ghc/compiler/parser/Parser.y index 0a44b9420d04..239e64ba4f7e 100644 --- a/ghc/compiler/parser/Parser.y +++ b/ghc/compiler/parser/Parser.y @@ -1,10 +1,6 @@ {- ----------------------------------------------------------------------------- -<<<<<<< Parser.y -$Id: Parser.y,v 1.13 1999/07/27 09:25:49 simonmar Exp $ -======= -$Id: Parser.y,v 1.13 1999/07/27 09:25:49 simonmar Exp $ ->>>>>>> 1.10 +$Id: Parser.y,v 1.14 1999/09/01 14:08:19 sof Exp $ Haskell grammar. @@ -97,6 +93,8 @@ Conflicts: 14 shift/reduce 'label' { ITlabel } 'dynamic' { ITdynamic } 'unsafe' { ITunsafe } + 'stdcall' { ITstdcallconv } + 'ccall' { ITccallconv } '_ccall_' { ITccall (False, False, False) } '_ccall_GC_' { ITccall (False, False, True) } '_casm_' { ITccall (False, True, False) } @@ -348,13 +346,13 @@ topdecl :: { RdrBinding } | srcloc 'foreign' 'import' callconv ext_name unsafe_flag varid_no_unsafe '::' sigtype - { RdrHsDecl (ForD (ForeignDecl $7 (FoImport $6) $9 $5 $4 $1)) } + { RdrHsDecl (ForD (ForeignDecl $7 (FoImport $6) $9 (mkExtName $5 $7) $4 $1)) } | srcloc 'foreign' 'export' callconv ext_name varid '::' sigtype - { RdrHsDecl (ForD (ForeignDecl $6 FoExport $8 $5 $4 $1)) } + { RdrHsDecl (ForD (ForeignDecl $6 FoExport $8 (mkExtName $5 $6) $4 $1)) } | srcloc 'foreign' 'label' ext_name varid '::' sigtype - { RdrHsDecl (ForD (ForeignDecl $5 FoLabel $7 $4 + { RdrHsDecl (ForD (ForeignDecl $5 FoLabel $7 (mkExtName $4 $5) defaultCallConv $1)) } | decl { $1 } @@ -455,17 +453,19 @@ rule_var :: { RdrNameRuleBndr } -- Foreign import/export callconv :: { Int } - : VARID {% checkCallConv $1 } + : 'stdcall' { stdCallConv } + | 'ccall' { cCallConv } | {- empty -} { defaultCallConv } unsafe_flag :: { Bool } : 'unsafe' { True } | {- empty -} { False } -ext_name :: { ExtName } - : 'dynamic' { Dynamic } - | STRING { ExtName $1 Nothing } - | STRING STRING { ExtName $2 (Just $1) } +ext_name :: { Maybe ExtName } + : 'dynamic' { Just Dynamic } + | STRING { Just (ExtName $1 Nothing) } + | STRING STRING { Just (ExtName $2 (Just $1)) } + | {- empty -} { Nothing } ----------------------------------------------------------------------------- -- Types @@ -875,6 +875,8 @@ varid :: { RdrName } | 'label' { label_var_RDR } | 'dynamic' { dynamic_var_RDR } | 'unsafe' { unsafe_var_RDR } + | 'stdcall' { stdcall_var_RDR } + | 'ccall' { ccall_var_RDR } varid_no_unsafe :: { RdrName } : VARID { mkSrcUnqual varName $1 } @@ -885,6 +887,8 @@ varid_no_unsafe :: { RdrName } | 'export' { export_var_RDR } | 'label' { label_var_RDR } | 'dynamic' { dynamic_var_RDR } + | 'stdcall' { stdcall_var_RDR } + | 'ccall' { ccall_var_RDR } ----------------------------------------------------------------------------- -- ConIds @@ -981,10 +985,12 @@ tyvar :: { RdrName } | 'as' { as_tyvar_RDR } | 'qualified' { qualified_tyvar_RDR } | 'hiding' { hiding_tyvar_RDR } - | 'export' { export_var_RDR } - | 'label' { label_var_RDR } - | 'dynamic' { dynamic_var_RDR } - | 'unsafe' { unsafe_var_RDR } + | 'export' { export_tyvar_RDR } + | 'label' { label_tyvar_RDR } + | 'dynamic' { dynamic_tyvar_RDR } + | 'unsafe' { unsafe_tyvar_RDR } + | 'stdcall' { stdcall_tyvar_RDR } + | 'ccall' { ccall_tyvar_RDR } -- NOTE: no 'forall' ----------------------------------------------------------------------------- -- GitLab