forked from GitHub/gf-core
a bit more refactoring
This commit is contained in:
@@ -15,8 +15,7 @@ import GF.Grammar.Lookup(lookupOrigInfo,allOrigInfos,allParamValues)
|
|||||||
import GF.Grammar.Macros(typeForm,collectOp,collectPattOp,composSafeOp,mkAbs,mkApp,term2patt,sortRec)
|
import GF.Grammar.Macros(typeForm,collectOp,collectPattOp,composSafeOp,mkAbs,mkApp,term2patt,sortRec)
|
||||||
import GF.Grammar.Lockfield(isLockLabel)
|
import GF.Grammar.Lockfield(isLockLabel)
|
||||||
import GF.Grammar.Predef(cPredef,cInts)
|
import GF.Grammar.Predef(cPredef,cInts)
|
||||||
-- import GF.Compile.Compute.Value(Predefined(..))
|
import GF.Infra.Ident(ModuleName(..),Ident,identW,ident2raw,rawIdentS,showIdent)
|
||||||
import GF.Infra.Ident(ModuleName(..),Ident,ident2raw,rawIdentS,showIdent,isWildIdent)
|
|
||||||
import GF.Infra.Option(Options,optionsPGF)
|
import GF.Infra.Option(Options,optionsPGF)
|
||||||
import GF.Infra.CheckM
|
import GF.Infra.CheckM
|
||||||
import PGF2(Literal(..))
|
import PGF2(Literal(..))
|
||||||
@@ -399,7 +398,7 @@ class FromIdent i where
|
|||||||
gId :: Ident -> i
|
gId :: Ident -> i
|
||||||
|
|
||||||
instance FromIdent VarId where
|
instance FromIdent VarId where
|
||||||
gId i = if isWildIdent i then Anonymous else VarId (ident2raw i)
|
gId i = if i == identW then Anonymous else VarId (ident2raw i)
|
||||||
|
|
||||||
instance FromIdent C.FunId where gId = C.FunId . ident2raw
|
instance FromIdent C.FunId where gId = C.FunId . ident2raw
|
||||||
instance FromIdent CatId where gId = CatId . ident2raw
|
instance FromIdent CatId where gId = CatId . ident2raw
|
||||||
|
|||||||
@@ -332,7 +332,7 @@ renameContext :: Status -> Context -> Check Context
|
|||||||
renameContext b = renc [] where
|
renameContext b = renc [] where
|
||||||
renc vs cont = case cont of
|
renc vs cont = case cont of
|
||||||
(bt,x,t) : xts
|
(bt,x,t) : xts
|
||||||
| isWildIdent x -> do
|
| x == identW -> do
|
||||||
t' <- ren vs t
|
t' <- ren vs t
|
||||||
xts' <- renc vs xts
|
xts' <- renc vs xts
|
||||||
return $ (bt,x,t') : xts'
|
return $ (bt,x,t') : xts'
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ inferLType gr g trm = case trm of
|
|||||||
case fty' of
|
case fty' of
|
||||||
Prod bt z arg val -> do
|
Prod bt z arg val -> do
|
||||||
a' <- justCheck g a arg
|
a' <- justCheck g a arg
|
||||||
ty <- if isWildIdent z
|
ty <- if z == identW
|
||||||
then return val
|
then return val
|
||||||
else substituteLType [(bt,z,a')] val
|
else substituteLType [(bt,z,a')] val
|
||||||
return (App f' a',ty)
|
return (App f' a',ty)
|
||||||
@@ -472,7 +472,7 @@ checkLType gr g trm typ0 = do
|
|||||||
Abs bt x c -> do
|
Abs bt x c -> do
|
||||||
case typ of
|
case typ of
|
||||||
Prod bt' z a b -> do
|
Prod bt' z a b -> do
|
||||||
(c',b') <- if isWildIdent z
|
(c',b') <- if z == identW
|
||||||
then checkLType gr ((bt,x,a):g) c b
|
then checkLType gr ((bt,x,a):g) c b
|
||||||
else do b' <- checkIn (pp "abs") $ substituteLType [(bt',z,Vr x)] b
|
else do b' <- checkIn (pp "abs") $ substituteLType [(bt',z,Vr x)] b
|
||||||
checkLType gr ((bt,x,a):g) c b'
|
checkLType gr ((bt,x,a):g) c b'
|
||||||
|
|||||||
@@ -28,17 +28,6 @@ import PGF2.Transactions(Symbol(..))
|
|||||||
-- Please change this every time when the GFO format is changed
|
-- Please change this every time when the GFO format is changed
|
||||||
gfoVersion = "GF05"
|
gfoVersion = "GF05"
|
||||||
|
|
||||||
instance Binary Ident where
|
|
||||||
put id = put (ident2utf8 id)
|
|
||||||
get = do bs <- get
|
|
||||||
if bs == BS.pack "_"
|
|
||||||
then return identW
|
|
||||||
else return (identC (rawIdentC bs))
|
|
||||||
|
|
||||||
instance Binary ModuleName where
|
|
||||||
put (MN id) = put id
|
|
||||||
get = fmap MN get
|
|
||||||
|
|
||||||
instance Binary Grammar where
|
instance Binary Grammar where
|
||||||
put = put . modules
|
put = put . modules
|
||||||
get = fmap mGrammar get
|
get = fmap mGrammar get
|
||||||
|
|||||||
@@ -727,7 +727,7 @@ listCatDef (L loc (id,cont,size)) = [catd,nilfund,consfund]
|
|||||||
niltyp = mkProdSimple (cont' ++ replicate size cd) lc
|
niltyp = mkProdSimple (cont' ++ replicate size cd) lc
|
||||||
constyp = mkProdSimple (cont' ++ [cd, mkHypo lc]) lc
|
constyp = mkProdSimple (cont' ++ [cd, mkHypo lc]) lc
|
||||||
|
|
||||||
mkId x i = if isWildIdent x then (varX i) else x
|
mkId x i = if x == identW then (varX i) else x
|
||||||
|
|
||||||
tryLoc (c,mty,Just e) = return (c,(mty,e))
|
tryLoc (c,mty,Just e) = return (c,(mty,e))
|
||||||
tryLoc (c,_ ,_ ) = fail ("local definition of" +++ showIdent c +++ "without value")
|
tryLoc (c,_ ,_ ) = fail ("local definition of" +++ showIdent c +++ "without value")
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ module GF.Infra.Ident (-- ** Identifiers
|
|||||||
identS, identC, identW,
|
identS, identC, identW,
|
||||||
-- *** Special identifiers for internal use
|
-- *** Special identifiers for internal use
|
||||||
identV,
|
identV,
|
||||||
varStr, varX, isWildIdent, varIndex,
|
varStr, varX, varIndex,
|
||||||
-- *** Raw identifiers
|
-- *** Raw identifiers
|
||||||
RawIdent, rawIdentS, rawIdentC, ident2raw, prefixRawIdent,
|
RawIdent, rawIdentS, rawIdentC, ident2raw, prefixRawIdent,
|
||||||
isPrefixOf, showRawIdent
|
isPrefixOf, showRawIdent
|
||||||
@@ -42,6 +42,9 @@ moduleNameS = MN . identS
|
|||||||
instance Show ModuleName where showsPrec d (MN m) = showsPrec d m
|
instance Show ModuleName where showsPrec d (MN m) = showsPrec d m
|
||||||
instance Pretty ModuleName where pp (MN m) = pp m
|
instance Pretty ModuleName where pp (MN m) = pp m
|
||||||
|
|
||||||
|
instance Binary ModuleName where
|
||||||
|
put (MN id) = put id
|
||||||
|
get = fmap MN get
|
||||||
|
|
||||||
-- | the constructors labelled /INTERNAL/ are
|
-- | the constructors labelled /INTERNAL/ are
|
||||||
-- internal representation never returned by the parser
|
-- internal representation never returned by the parser
|
||||||
@@ -69,6 +72,13 @@ showRawIdent = unpack . rawId2utf8
|
|||||||
prefixRawIdent (Id x) (Id y) = Id (BS.append x y)
|
prefixRawIdent (Id x) (Id y) = Id (BS.append x y)
|
||||||
isPrefixOf (Id x) (Id y) = BS.isPrefixOf x y
|
isPrefixOf (Id x) (Id y) = BS.isPrefixOf x y
|
||||||
|
|
||||||
|
instance Binary Ident where
|
||||||
|
put id = put (ident2utf8 id)
|
||||||
|
get = do bs <- get
|
||||||
|
if bs == wild
|
||||||
|
then return identW
|
||||||
|
else return (identC (rawIdentC bs))
|
||||||
|
|
||||||
instance Binary RawIdent where
|
instance Binary RawIdent where
|
||||||
put = put . rawId2utf8
|
put = put . rawId2utf8
|
||||||
get = fmap rawIdentC get
|
get = fmap rawIdentC get
|
||||||
@@ -79,7 +89,7 @@ ident2utf8 :: Ident -> UTF8.ByteString
|
|||||||
ident2utf8 i = case i of
|
ident2utf8 i = case i of
|
||||||
IC (Id s) -> s
|
IC (Id s) -> s
|
||||||
IV (Id s) n -> BS.append s (pack ('_':show n))
|
IV (Id s) n -> BS.append s (pack ('_':show n))
|
||||||
IW -> pack "_"
|
IW -> wild
|
||||||
|
|
||||||
ident2raw :: Ident -> RawIdent
|
ident2raw :: Ident -> RawIdent
|
||||||
ident2raw = Id . ident2utf8
|
ident2raw = Id . ident2utf8
|
||||||
@@ -113,13 +123,7 @@ varStr = identS "str"
|
|||||||
varX :: Int -> Ident
|
varX :: Int -> Ident
|
||||||
varX = identV (rawIdentS "x")
|
varX = identV (rawIdentS "x")
|
||||||
|
|
||||||
isWildIdent :: Ident -> Bool
|
wild = pack "_"
|
||||||
isWildIdent x = case x of
|
|
||||||
IW -> True
|
|
||||||
IC s | s == wild -> True
|
|
||||||
_ -> False
|
|
||||||
|
|
||||||
wild = Id (pack "_")
|
|
||||||
|
|
||||||
varIndex :: Ident -> Int
|
varIndex :: Ident -> Int
|
||||||
varIndex (IV _ n) = n
|
varIndex (IV _ n) = n
|
||||||
|
|||||||
Reference in New Issue
Block a user