From 923eefe3176903f70322a2b40bdf3c16d9740fd0 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Mon, 20 Aug 2007 22:06:56 +0000 Subject: [PATCH] Rain: refactored the parsing of blocks --- RainParse.hs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/RainParse.hs b/RainParse.hs index 6145c74..508ac24 100644 --- a/RainParse.hs +++ b/RainParse.hs @@ -228,12 +228,16 @@ subExpression <|> literal "[sub-]expression" -block :: RainParser A.Structured -block = do {m <- md ; sLeftC ; procs <- (many statement) ; sts <- sequence (map wrapProc procs) ; sRightC ; return $ A.Several m sts} +innerBlock :: RainParser A.Structured +innerBlock = do {m <- md ; sLeftC ; procs <- (many statement) ; sts <- sequence (map wrapProc procs) ; sRightC ; return $ A.Several m sts} where wrapProc :: A.Process -> RainParser A.Structured wrapProc x = return (A.OnlyP emptyMeta x) +block :: RainParser A.Process +block = do { m <- md ; optionalSeq ; b <- innerBlock ; return $ A.Seq m b} + <|> do { m <- md ; sPar ; b <- innerBlock ; return $ A.Par m A.PlainPar b} + optionalSeq :: RainParser () optionalSeq = option () sSeq @@ -256,8 +260,7 @@ statement option (A.If m $ A.Several m [A.OnlyC m (A.Choice m exp st), A.OnlyC m (A.Choice m (A.True m) (A.Skip m))]) (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)])}) } - <|> do { m <- md ; optionalSeq ; b <- block ; return $ A.Seq m b} - <|> do { m <- md ; sPar ; b <- block ; return $ A.Par m A.PlainPar b} + <|> block <|> do { m <- md ; 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 <- md ; sSeqeach ; sLeftR ; n <- name ; sColon ; exp <- expression ; sRightR ; st <- statement ;