Rain: added parsing of output statements
This commit is contained in:
parent
a39d95add4
commit
262913fabd
10
RainParse.hs
10
RainParse.hs
|
@ -214,6 +214,9 @@ each = do { m <- sPareach ; sLeftR ; n <- name ; sColon ; exp <- expression ; sR
|
|||
<|> do { m <- sSeqeach ; sLeftR ; n <- name ; sColon ; exp <- expression ; sRightR ; st <- statement ;
|
||||
return $ A.Seq m $ A.Rep m (A.ForEach m n exp) $ A.OnlyP m st }
|
||||
|
||||
comm :: RainParser A.Process
|
||||
comm = do { lv <- lvalue ; sOut ; exp <- expression ; sSemiColon ;
|
||||
return $ A.Output (findMeta lv) lv [A.OutExpression (findMeta exp) exp] }
|
||||
|
||||
statement :: RainParser A.Process
|
||||
statement
|
||||
|
@ -223,12 +226,13 @@ statement
|
|||
(do {sElse ; elSt <- statement ; return (A.If m $ A.Several m [A.OnlyC m (A.Choice m exp st), A.OnlyC m (A.Choice m (A.True m) elSt)])})
|
||||
}
|
||||
<|> block
|
||||
<|> each
|
||||
<|> do { lv <- lvalue ; op <- assignOp ; exp <- expression ; sSemiColon ;
|
||||
<|> each
|
||||
<|> try comm
|
||||
<|> try (do { lv <- lvalue ; op <- assignOp ; exp <- expression ; sSemiColon ;
|
||||
case op of
|
||||
(m', Just dyOp) -> return (A.Assign m' [lv] (A.ExpressionList m' [(A.Dyadic m' dyOp (A.ExprVariable (findMeta lv) lv) exp)]))
|
||||
(m', Nothing) -> return (A.Assign m' [lv] (A.ExpressionList (findMeta exp) [exp]))
|
||||
}
|
||||
})
|
||||
<|> do { m <- sSemiColon ; return $ A.Skip m}
|
||||
<?> "statement"
|
||||
|
||||
|
|
|
@ -249,9 +249,21 @@ testDataType =
|
|||
,fail ("??",RP.dataType)
|
||||
,fail ("int?",RP.dataType)
|
||||
,fail ("bool!",RP.dataType)
|
||||
,fail ("int?int",RP.dataType)
|
||||
|
||||
|
||||
,fail ("int?int",RP.dataType)
|
||||
]
|
||||
|
||||
testComm :: [ParseTest A.Process]
|
||||
testComm =
|
||||
[
|
||||
pass ("c ! x;",RP.statement,assertEqual "testComm 0" $ A.Output m (variable "c") [A.OutExpression m (exprVariable "x")])
|
||||
,pass ("c!x;",RP.statement,assertEqual "testComm 1" $ A.Output m (variable "c") [A.OutExpression m (exprVariable "x")])
|
||||
,pass ("c!0+x;",RP.statement,assertEqual "testComm 2" $ A.Output m (variable "c") [A.OutExpression m $ A.Dyadic m A.Add (intLiteral 0) (exprVariable "x")])
|
||||
,fail ("c!x",RP.statement)
|
||||
,fail ("c!x!y;",RP.statement)
|
||||
,fail ("c!x,y;",RP.statement)
|
||||
,fail ("c!;",RP.statement)
|
||||
,fail ("!x;",RP.statement)
|
||||
,fail ("c!!x;",RP.statement)
|
||||
]
|
||||
|
||||
--Returns the list of tests:
|
||||
|
@ -266,6 +278,7 @@ tests = TestList
|
|||
parseTests testIf,
|
||||
parseTests testAssign,
|
||||
parseTests testDataType,
|
||||
parseTests testComm,
|
||||
parseTests testTopLevelDecl
|
||||
]
|
||||
--TODO test:
|
||||
|
|
Loading…
Reference in New Issue
Block a user