Made the Rain parser actually record an unknown (to-be-inferred) type for numeric literals
This commit is contained in:
parent
cd0c8d2901
commit
ab0301a342
|
@ -112,7 +112,8 @@ data CompState = CompState {
|
||||||
csAdditionalArgs :: Map String [A.Actual],
|
csAdditionalArgs :: Map String [A.Actual],
|
||||||
csParProcs :: Set A.Name,
|
csParProcs :: Set A.Name,
|
||||||
csUnifyLookup :: Map UnifyIndex UnifyValue,
|
csUnifyLookup :: Map UnifyIndex UnifyValue,
|
||||||
csUnifyPairs :: [(UnifyValue, UnifyValue)]
|
csUnifyPairs :: [(UnifyValue, UnifyValue)],
|
||||||
|
csUnifyId :: Int
|
||||||
}
|
}
|
||||||
deriving (Data, Typeable)
|
deriving (Data, Typeable)
|
||||||
|
|
||||||
|
@ -144,7 +145,8 @@ emptyState = CompState {
|
||||||
csAdditionalArgs = Map.empty,
|
csAdditionalArgs = Map.empty,
|
||||||
csParProcs = Set.empty,
|
csParProcs = Set.empty,
|
||||||
csUnifyLookup = Map.empty,
|
csUnifyLookup = Map.empty,
|
||||||
csUnifyPairs = []
|
csUnifyPairs = [],
|
||||||
|
csUnifyId = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
-- | Class of monads which keep a CompState.
|
-- | Class of monads which keep a CompState.
|
||||||
|
@ -368,3 +370,10 @@ ghostVarPrefix = "##"
|
||||||
-- | A suffix put on all ghost variables, such as Rain's timers
|
-- | A suffix put on all ghost variables, such as Rain's timers
|
||||||
ghostVarSuffix :: String
|
ghostVarSuffix :: String
|
||||||
ghostVarSuffix = "_##"
|
ghostVarSuffix = "_##"
|
||||||
|
|
||||||
|
-- | A new identifer for the unify types in the tree
|
||||||
|
getUniqueIdentifer :: CSM m => m Int
|
||||||
|
getUniqueIdentifer = do st <- get
|
||||||
|
let n = csUnifyId st
|
||||||
|
put st {csUnifyId = n + 1}
|
||||||
|
return n
|
|
@ -40,6 +40,15 @@ import Utils
|
||||||
type RainState = CompState
|
type RainState = CompState
|
||||||
type RainParser = GenParser L.Token RainState
|
type RainParser = GenParser L.Token RainState
|
||||||
|
|
||||||
|
instance CSMR (GenParser tok CompState) where
|
||||||
|
getCompState = getState
|
||||||
|
|
||||||
|
-- We can expose only part of the state to make it look like we are only using
|
||||||
|
-- CompState:
|
||||||
|
instance MonadState CompState (GenParser tok CompState) where
|
||||||
|
get = getState
|
||||||
|
put = setState
|
||||||
|
|
||||||
instance Die (GenParser tok st) where
|
instance Die (GenParser tok st) where
|
||||||
dieReport (Just m, err) = fail $ packMeta m err
|
dieReport (Just m, err) = fail $ packMeta m err
|
||||||
dieReport (Nothing, err) = fail err
|
dieReport (Nothing, err) = fail err
|
||||||
|
@ -195,16 +204,19 @@ literalCharacter
|
||||||
testToken (L.TokCharLiteral c) = Just c
|
testToken (L.TokCharLiteral c) = Just c
|
||||||
testToken _ = Nothing
|
testToken _ = Nothing
|
||||||
|
|
||||||
integer :: RainParser A.LiteralRepr
|
integer :: RainParser (Integer, A.LiteralRepr)
|
||||||
integer
|
integer
|
||||||
= do (m,d) <- getToken testToken
|
= do (m,d) <- getToken testToken
|
||||||
return $ A.IntLiteral m d
|
return $ (read d, A.IntLiteral m d)
|
||||||
where
|
where
|
||||||
testToken (L.TokDecimalLiteral d) = Just d
|
testToken (L.TokDecimalLiteral d) = Just d
|
||||||
testToken _ = Nothing
|
testToken _ = Nothing
|
||||||
|
|
||||||
integerLiteral :: RainParser A.Expression
|
integerLiteral :: RainParser A.Expression
|
||||||
integerLiteral = do {i <- integer ; return $ A.Literal (findMeta i) A.Int i}
|
integerLiteral = do (val, i) <- integer
|
||||||
|
u <- getUniqueIdentifer
|
||||||
|
let m = findMeta i
|
||||||
|
return $ A.Literal m (A.UnknownNumLitType m u val) i
|
||||||
|
|
||||||
listLiteral :: RainParser A.Expression
|
listLiteral :: RainParser A.Expression
|
||||||
listLiteral
|
listLiteral
|
||||||
|
|
Loading…
Reference in New Issue
Block a user