Added support for giving ranges an explicit type in Rain
This commit is contained in:
parent
0511c852da
commit
025eebf61d
|
@ -269,6 +269,7 @@ data ExprHelper =
|
||||||
| DirVar A.Direction String
|
| DirVar A.Direction String
|
||||||
| Lit A.Expression
|
| Lit A.Expression
|
||||||
| EHTrue
|
| EHTrue
|
||||||
|
| Range A.Type ExprHelper ExprHelper
|
||||||
|
|
||||||
buildExprPattern :: ExprHelper -> Pattern
|
buildExprPattern :: ExprHelper -> Pattern
|
||||||
buildExprPattern = (stopCaringPattern emptyMeta) . mkPattern . buildExpr
|
buildExprPattern = (stopCaringPattern emptyMeta) . mkPattern . buildExpr
|
||||||
|
@ -281,6 +282,8 @@ buildExpr (Var n) = A.ExprVariable emptyMeta $ variable n
|
||||||
buildExpr (DirVar dir n) = A.ExprVariable emptyMeta $ (A.DirectedVariable emptyMeta dir $ variable n)
|
buildExpr (DirVar dir n) = A.ExprVariable emptyMeta $ (A.DirectedVariable emptyMeta dir $ variable n)
|
||||||
buildExpr (Lit e) = e
|
buildExpr (Lit e) = e
|
||||||
buildExpr EHTrue = A.True emptyMeta
|
buildExpr EHTrue = A.True emptyMeta
|
||||||
|
buildExpr (Range t begin end) = A.ExprConstr emptyMeta $ A.RangeConstr emptyMeta t
|
||||||
|
(buildExpr begin) (buildExpr end)
|
||||||
|
|
||||||
-- | A simple definition of a variable
|
-- | A simple definition of a variable
|
||||||
simpleDef :: String -> A.SpecType -> A.NameDef
|
simpleDef :: String -> A.SpecType -> A.NameDef
|
||||||
|
|
|
@ -34,7 +34,7 @@ import qualified LexRain as L
|
||||||
import Metadata
|
import Metadata
|
||||||
import ParseUtils
|
import ParseUtils
|
||||||
import Pass
|
import Pass
|
||||||
|
import Utils
|
||||||
|
|
||||||
type RainState = CompState
|
type RainState = CompState
|
||||||
type RainParser = GenParser L.Token RainState
|
type RainParser = GenParser L.Token RainState
|
||||||
|
@ -233,9 +233,25 @@ literal = do {lr <- stringLiteral ; return $ A.Literal (findMeta lr) (A.List A.B
|
||||||
<|> listLiteral
|
<|> listLiteral
|
||||||
<?> "literal"
|
<?> "literal"
|
||||||
|
|
||||||
|
maybeParse :: RainParser a -> RainParser (Maybe a)
|
||||||
|
maybeParse p = option Nothing (p >>* Just)
|
||||||
|
|
||||||
range :: RainParser A.Expression
|
range :: RainParser A.Expression
|
||||||
range = try $ do {m <- sLeftQ ; begin <- literal; sDots ; end <- literal ;
|
range = try $ do m <- sLeftQ
|
||||||
sRightQ ; return $ A.ExprConstr m $ A.RangeConstr m (A.List A.Any) begin end}
|
optTy <- maybeParse $ try $ do t <- dataType
|
||||||
|
m <- sColon
|
||||||
|
return (t, m)
|
||||||
|
begin <- literal
|
||||||
|
sDots
|
||||||
|
end <- literal
|
||||||
|
sRightQ
|
||||||
|
case optTy of
|
||||||
|
Just (t, mc) -> return $ A.ExprConstr m $ A.RangeConstr m
|
||||||
|
(A.List t)
|
||||||
|
(A.Conversion mc A.DefaultConversion t begin)
|
||||||
|
(A.Conversion mc A.DefaultConversion t end)
|
||||||
|
Nothing -> return $ A.ExprConstr m $ A.RangeConstr m
|
||||||
|
(A.List A.Any) begin end
|
||||||
|
|
||||||
expression :: RainParser A.Expression
|
expression :: RainParser A.Expression
|
||||||
expression
|
expression
|
||||||
|
|
|
@ -46,6 +46,7 @@ import qualified LexRain as L
|
||||||
import Metadata (Meta,emptyMeta)
|
import Metadata (Meta,emptyMeta)
|
||||||
import qualified ParseRain as RP
|
import qualified ParseRain as RP
|
||||||
import Pattern
|
import Pattern
|
||||||
|
import TagAST
|
||||||
import TestUtils
|
import TestUtils
|
||||||
import TreeUtils
|
import TreeUtils
|
||||||
|
|
||||||
|
@ -196,6 +197,8 @@ testExprs =
|
||||||
passE (code,index,expr) = pass(code,RP.expression,assertPatternMatch ("testExprs " ++ show index) (buildExprPattern expr))
|
passE (code,index,expr) = pass(code,RP.expression,assertPatternMatch ("testExprs " ++ show index) (buildExprPattern expr))
|
||||||
failE x = fail (x,RP.expression)
|
failE x = fail (x,RP.expression)
|
||||||
|
|
||||||
|
--TODO add support for shared ? and shared !, as well as any2any channels etc
|
||||||
|
|
||||||
testLiteral :: [ParseTest A.Expression]
|
testLiteral :: [ParseTest A.Expression]
|
||||||
testLiteral =
|
testLiteral =
|
||||||
[
|
[
|
||||||
|
@ -277,9 +280,17 @@ testRange =
|
||||||
A.ExprConstr m $ A.RangeConstr m (A.List A.Any) (intLiteral 0) (intLiteral 10000))
|
A.ExprConstr m $ A.RangeConstr m (A.List A.Any) (intLiteral 0) (intLiteral 10000))
|
||||||
,pass("[-3..-1]", RP.expression, assertPatternMatch "testRange 2" $ pat $
|
,pass("[-3..-1]", RP.expression, assertPatternMatch "testRange 2" $ pat $
|
||||||
A.ExprConstr m $ A.RangeConstr m (A.List A.Any) (intLiteral $ -3) (intLiteral $ -1))
|
A.ExprConstr m $ A.RangeConstr m (A.List A.Any) (intLiteral $ -3) (intLiteral $ -1))
|
||||||
|
,pass("[sint16: 0..1]", RP.expression, rangePattern 4 (A.List A.Int16)
|
||||||
|
(buildExprPattern $ Cast A.Int16 (Lit $ intLiteral 0))
|
||||||
|
(buildExprPattern $ Cast A.Int16 (Lit $ intLiteral 1)))
|
||||||
|
|
||||||
--For now, at least, this should fail:
|
--For now, at least, this should fail:
|
||||||
,fail("[0..x]", RP.expression)
|
,fail("[0..x]", RP.expression)
|
||||||
]
|
]
|
||||||
|
where
|
||||||
|
rangePattern :: Int -> A.Type -> Pattern -> Pattern -> (A.Expression -> Assertion)
|
||||||
|
rangePattern n t start end = assertPatternMatch ("testRange " ++ show n) $
|
||||||
|
mExprConstr $ mRangeConstr t start end
|
||||||
|
|
||||||
--Helper function for ifs:
|
--Helper function for ifs:
|
||||||
makeIf :: [(A.Expression,A.Process)] -> A.Process
|
makeIf :: [(A.Expression,A.Process)] -> A.Process
|
||||||
|
|
Loading…
Reference in New Issue
Block a user