Rain: implemented the pass to record the types of integer literals

This commit is contained in:
Neil Brown 2007-09-15 10:55:53 +00:00
parent 97cc82e235
commit bad3f0818a
2 changed files with 27 additions and 2 deletions

View File

@ -40,7 +40,11 @@ rainPasses =
[ ("AST Validity check, Rain #1", excludeNonRainFeatures)
,("Resolve Int -> Int64",transformInt)
,("Uniquify variable declarations, record declared types and resolve variable names",uniquifyAndResolveVars) --depends on transformInt
,("Record inferred name types in dictionary",recordInfNameTypes) --depends on uniquifyAndResolveVars
,("Fold all constant expressions",constantFoldPass) -- depends on transformInt and possibly depends on uniquifyAndResolveVars, not sure
,("Annotate integer literal types",annnotateIntLiteralTypes) --depends on transformInt and constantFoldPass
,("Record inferred name types in dictionary",recordInfNameTypes) --depends on uniquifyAndResolveVars and annnotateIntLiteralTypes
,("Find and tag the main function",findMain) --depends on uniquifyAndResolveVars
,("Check parameters in process calls",matchParamPass) --depends on uniquifyAndResolveVars and recordInfNameTypes
,("Convert seqeach/pareach loops over ranges into simple replicated SEQ/PAR",transformEachRange)

View File

@ -69,4 +69,25 @@ annnotateIntLiteralTypes :: Data t => t -> PassM t
annnotateIntLiteralTypes = everywhereASTM doExpression
where
doExpression :: A.Expression -> PassM A.Expression
doExpression = return
doExpression (A.Literal m t (A.IntLiteral m' s))
= do t' <-
if (t == A.Int64) then --it's a signed literal
(if (n >= 2^63 || n < (-(2^63)))
then dieP m $ "Signed integer literal too large to fit into 64 bits: " ++ s
else
if (n < (-(2^31)) || n >= 2^31)
then return A.Int64
else
if (n < (-(2^15)) || n >= 2^15)
then return A.Int32
else
if (n < (-(2^7)) || n >= 2^7)
then return A.Int16
else return A.Int8
)
else
dieP m $ "Unsigned literals currently unsupported"
return $ A.Literal m t' (A.IntLiteral m' s)
where
n = read s
doExpression e = return e