From 262913fabd0af8c134de9cb03961e03c0544f888 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Wed, 22 Aug 2007 10:21:20 +0000 Subject: [PATCH] Rain: added parsing of output statements --- RainParse.hs | 10 +++++++--- RainParseTest.hs | 19 ++++++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/RainParse.hs b/RainParse.hs index 2fc9496..3369837 100644 --- a/RainParse.hs +++ b/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" diff --git a/RainParseTest.hs b/RainParseTest.hs index 6c0681f..8818a2d 100644 --- a/RainParseTest.hs +++ b/RainParseTest.hs @@ -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: