From a39d95add4941903bf38b3159611710b281ebb91 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Wed, 22 Aug 2007 10:14:51 +0000 Subject: [PATCH] Rain: refactored the parser a little (drawing out the each loops) --- RainParse.hs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/RainParse.hs b/RainParse.hs index 295c4fd..2fc9496 100644 --- a/RainParse.hs +++ b/RainParse.hs @@ -208,6 +208,13 @@ lvalue :: RainParser A.Variable --For now, only handle plain variables: lvalue = variableId +each :: RainParser A.Process +each = do { m <- sPareach ; sLeftR ; n <- name ; sColon ; exp <- expression ; sRightR ; st <- statement ; + return $ A.Par m A.PlainPar $ A.Rep m (A.ForEach m n exp) $ A.OnlyP m st } + <|> 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 } + + statement :: RainParser A.Process statement = do { m <- sWhile ; sLeftR ; exp <- expression ; sRightR ; st <- statement ; return $ A.While m exp st} @@ -216,10 +223,7 @@ 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 - <|> do { m <- sPareach ; sLeftR ; n <- name ; sColon ; exp <- expression ; sRightR ; st <- statement ; - return $ A.Par m A.PlainPar $ A.Rep m (A.ForEach m n exp) $ A.OnlyP m st } - <|> 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 } + <|> each <|> 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)]))