Skip to content
Snippets Groups Projects
Commit 5f1979b7 authored by sof's avatar sof
Browse files

[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.
parent 835564a7
No related merge requests found
...@@ -128,6 +128,8 @@ data Token ...@@ -128,6 +128,8 @@ data Token
| ITlabel | ITlabel
| ITdynamic | ITdynamic
| ITunsafe | ITunsafe
| ITstdcallconv
| ITccallconv
| ITinterface -- interface keywords | ITinterface -- interface keywords
| IT__export | IT__export
...@@ -280,6 +282,8 @@ ghcExtensionKeywordsFM = listToUFM $ ...@@ -280,6 +282,8 @@ ghcExtensionKeywordsFM = listToUFM $
( "label", ITlabel ), ( "label", ITlabel ),
( "dynamic", ITdynamic ), ( "dynamic", ITdynamic ),
( "unsafe", ITunsafe ), ( "unsafe", ITunsafe ),
( "stdcall", ITstdcallconv),
( "ccall", ITccallconv),
("_ccall_", ITccall (False, False, False)), ("_ccall_", ITccall (False, False, False)),
("_ccall_GC_", ITccall (False, False, True)), ("_ccall_GC_", ITccall (False, False, True)),
("_casm_", ITccall (False, True, False)), ("_casm_", ITccall (False, True, False)),
......
...@@ -13,9 +13,10 @@ module ParseUtil ( ...@@ -13,9 +13,10 @@ module ParseUtil (
, mkRecConstrOrUpdate -- HsExp -> [HsFieldUpdate] -> P HsExp , mkRecConstrOrUpdate -- HsExp -> [HsFieldUpdate] -> P HsExp
, groupBindings , groupBindings
, mkExtName -- Maybe ExtName -> RdrName -> ExtName
, checkPrec -- String -> P String , checkPrec -- String -> P String
, checkCallConv -- FAST_STRING -> P CallConv
, checkContext -- HsType -> P HsContext , checkContext -- HsType -> P HsContext
, checkInstType -- HsType -> P HsType , checkInstType -- HsType -> P HsType
, checkAssertion -- HsType -> P HsAsst , checkAssertion -- HsType -> P HsAsst
...@@ -35,10 +36,11 @@ module ParseUtil ( ...@@ -35,10 +36,11 @@ module ParseUtil (
-- pseudo-keywords, in var and tyvar forms (all :: RdrName) -- pseudo-keywords, in var and tyvar forms (all :: RdrName)
, as_var_RDR, hiding_var_RDR, qualified_var_RDR, forall_var_RDR , as_var_RDR, hiding_var_RDR, qualified_var_RDR, forall_var_RDR
, export_var_RDR, label_var_RDR, dynamic_var_RDR, unsafe_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 , as_tyvar_RDR, hiding_tyvar_RDR, qualified_tyvar_RDR
, export_tyvar_RDR, label_tyvar_RDR, dynamic_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 , minus_RDR, pling_RDR, dot_RDR
...@@ -53,7 +55,7 @@ import RdrHsSyn ...@@ -53,7 +55,7 @@ import RdrHsSyn
import RdrName import RdrName
import CallConv import CallConv
import PrelMods ( pRELUDE_Name, mkUbxTupNameStr, mkTupNameStr ) 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 CmdLineOpts ( opt_NoImplicitPrelude )
import StringBuffer ( lexemeToString ) import StringBuffer ( lexemeToString )
import FastString ( unpackFS ) import FastString ( unpackFS )
...@@ -354,6 +356,14 @@ mkRecConstrOrUpdate exp fs@(_:_) ...@@ -354,6 +356,14 @@ mkRecConstrOrUpdate exp fs@(_:_)
mkRecConstrOrUpdate _ _ mkRecConstrOrUpdate _ _
= parseError "Empty record update" = 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 -- group function bindings into equation groups
...@@ -436,6 +446,8 @@ exportName = SLIT("export") ...@@ -436,6 +446,8 @@ exportName = SLIT("export")
labelName = SLIT("label") labelName = SLIT("label")
dynamicName = SLIT("dynamic") dynamicName = SLIT("dynamic")
unsafeName = SLIT("unsafe") unsafeName = SLIT("unsafe")
stdcallName = SLIT("stdcall")
ccallName = SLIT("ccall")
as_var_RDR = mkSrcUnqual varName asName as_var_RDR = mkSrcUnqual varName asName
hiding_var_RDR = mkSrcUnqual varName hidingName hiding_var_RDR = mkSrcUnqual varName hidingName
...@@ -445,6 +457,8 @@ export_var_RDR = mkSrcUnqual varName exportName ...@@ -445,6 +457,8 @@ export_var_RDR = mkSrcUnqual varName exportName
label_var_RDR = mkSrcUnqual varName labelName label_var_RDR = mkSrcUnqual varName labelName
dynamic_var_RDR = mkSrcUnqual varName dynamicName dynamic_var_RDR = mkSrcUnqual varName dynamicName
unsafe_var_RDR = mkSrcUnqual varName unsafeName unsafe_var_RDR = mkSrcUnqual varName unsafeName
stdcall_var_RDR = mkSrcUnqual varName stdcallName
ccall_var_RDR = mkSrcUnqual varName ccallName
as_tyvar_RDR = mkSrcUnqual tvName asName as_tyvar_RDR = mkSrcUnqual tvName asName
hiding_tyvar_RDR = mkSrcUnqual tvName hidingName hiding_tyvar_RDR = mkSrcUnqual tvName hidingName
...@@ -453,6 +467,8 @@ export_tyvar_RDR = mkSrcUnqual tvName exportName ...@@ -453,6 +467,8 @@ export_tyvar_RDR = mkSrcUnqual tvName exportName
label_tyvar_RDR = mkSrcUnqual tvName labelName label_tyvar_RDR = mkSrcUnqual tvName labelName
dynamic_tyvar_RDR = mkSrcUnqual tvName dynamicName dynamic_tyvar_RDR = mkSrcUnqual tvName dynamicName
unsafe_tyvar_RDR = mkSrcUnqual tvName unsafeName unsafe_tyvar_RDR = mkSrcUnqual tvName unsafeName
stdcall_tyvar_RDR = mkSrcUnqual tvName stdcallName
ccall_tyvar_RDR = mkSrcUnqual tvName ccallName
minus_RDR = mkSrcUnqual varName SLIT("-") minus_RDR = mkSrcUnqual varName SLIT("-")
pling_RDR = mkSrcUnqual varName SLIT("!") pling_RDR = mkSrcUnqual varName SLIT("!")
......
{- {-
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
<<<<<<< Parser.y $Id: Parser.y,v 1.14 1999/09/01 14:08:19 sof Exp $
$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
Haskell grammar. Haskell grammar.
...@@ -97,6 +93,8 @@ Conflicts: 14 shift/reduce ...@@ -97,6 +93,8 @@ Conflicts: 14 shift/reduce
'label' { ITlabel } 'label' { ITlabel }
'dynamic' { ITdynamic } 'dynamic' { ITdynamic }
'unsafe' { ITunsafe } 'unsafe' { ITunsafe }
'stdcall' { ITstdcallconv }
'ccall' { ITccallconv }
'_ccall_' { ITccall (False, False, False) } '_ccall_' { ITccall (False, False, False) }
'_ccall_GC_' { ITccall (False, False, True) } '_ccall_GC_' { ITccall (False, False, True) }
'_casm_' { ITccall (False, True, False) } '_casm_' { ITccall (False, True, False) }
...@@ -348,13 +346,13 @@ topdecl :: { RdrBinding } ...@@ -348,13 +346,13 @@ topdecl :: { RdrBinding }
| srcloc 'foreign' 'import' callconv ext_name | srcloc 'foreign' 'import' callconv ext_name
unsafe_flag varid_no_unsafe '::' sigtype 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 | 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 | 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)) } defaultCallConv $1)) }
| decl { $1 } | decl { $1 }
...@@ -455,17 +453,19 @@ rule_var :: { RdrNameRuleBndr } ...@@ -455,17 +453,19 @@ rule_var :: { RdrNameRuleBndr }
-- Foreign import/export -- Foreign import/export
callconv :: { Int } callconv :: { Int }
: VARID {% checkCallConv $1 } : 'stdcall' { stdCallConv }
| 'ccall' { cCallConv }
| {- empty -} { defaultCallConv } | {- empty -} { defaultCallConv }
unsafe_flag :: { Bool } unsafe_flag :: { Bool }
: 'unsafe' { True } : 'unsafe' { True }
| {- empty -} { False } | {- empty -} { False }
ext_name :: { ExtName } ext_name :: { Maybe ExtName }
: 'dynamic' { Dynamic } : 'dynamic' { Just Dynamic }
| STRING { ExtName $1 Nothing } | STRING { Just (ExtName $1 Nothing) }
| STRING STRING { ExtName $2 (Just $1) } | STRING STRING { Just (ExtName $2 (Just $1)) }
| {- empty -} { Nothing }
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- Types -- Types
...@@ -875,6 +875,8 @@ varid :: { RdrName } ...@@ -875,6 +875,8 @@ varid :: { RdrName }
| 'label' { label_var_RDR } | 'label' { label_var_RDR }
| 'dynamic' { dynamic_var_RDR } | 'dynamic' { dynamic_var_RDR }
| 'unsafe' { unsafe_var_RDR } | 'unsafe' { unsafe_var_RDR }
| 'stdcall' { stdcall_var_RDR }
| 'ccall' { ccall_var_RDR }
varid_no_unsafe :: { RdrName } varid_no_unsafe :: { RdrName }
: VARID { mkSrcUnqual varName $1 } : VARID { mkSrcUnqual varName $1 }
...@@ -885,6 +887,8 @@ varid_no_unsafe :: { RdrName } ...@@ -885,6 +887,8 @@ varid_no_unsafe :: { RdrName }
| 'export' { export_var_RDR } | 'export' { export_var_RDR }
| 'label' { label_var_RDR } | 'label' { label_var_RDR }
| 'dynamic' { dynamic_var_RDR } | 'dynamic' { dynamic_var_RDR }
| 'stdcall' { stdcall_var_RDR }
| 'ccall' { ccall_var_RDR }
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- ConIds -- ConIds
...@@ -981,10 +985,12 @@ tyvar :: { RdrName } ...@@ -981,10 +985,12 @@ tyvar :: { RdrName }
| 'as' { as_tyvar_RDR } | 'as' { as_tyvar_RDR }
| 'qualified' { qualified_tyvar_RDR } | 'qualified' { qualified_tyvar_RDR }
| 'hiding' { hiding_tyvar_RDR } | 'hiding' { hiding_tyvar_RDR }
| 'export' { export_var_RDR } | 'export' { export_tyvar_RDR }
| 'label' { label_var_RDR } | 'label' { label_tyvar_RDR }
| 'dynamic' { dynamic_var_RDR } | 'dynamic' { dynamic_tyvar_RDR }
| 'unsafe' { unsafe_var_RDR } | 'unsafe' { unsafe_tyvar_RDR }
| 'stdcall' { stdcall_tyvar_RDR }
| 'ccall' { ccall_tyvar_RDR }
-- NOTE: no 'forall' -- NOTE: no 'forall'
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment