Rain: added parsing of output statements

This commit is contained in:
Neil Brown 2007-08-22 10:21:20 +00:00
parent a39d95add4
commit 262913fabd
2 changed files with 23 additions and 6 deletions

View File

@ -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"

View File

@ -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: