summaryrefslogtreecommitdiff
path: root/DSL/Parsing.hs
diff options
context:
space:
mode:
authorMatthew Hall <hallmatthew314@gmail.com>2023-02-20 20:30:31 +1300
committerMatthew Hall <hallmatthew314@gmail.com>2023-02-20 20:30:31 +1300
commitb3fd71cf0344e1634fcda6da854f9094957d009b (patch)
tree65556343faa64ae29871eab8df3bd7c06aa3c8c1 /DSL/Parsing.hs
parent77d84c1539851f096b2c632cc6381ac72b2bfd1b (diff)
Add ELIF statements and refactor IF blocks
Diffstat (limited to 'DSL/Parsing.hs')
-rw-r--r--DSL/Parsing.hs37
1 files changed, 27 insertions, 10 deletions
diff --git a/DSL/Parsing.hs b/DSL/Parsing.hs
index 6dcc4bf..e0017bb 100644
--- a/DSL/Parsing.hs
+++ b/DSL/Parsing.hs
@@ -1,6 +1,7 @@
module DSL.Parsing where
import Data.Char (isDigit, isSpace)
+import Data.Maybe (fromMaybe)
import DSL.Types
import DSL.BaseParsers
@@ -28,6 +29,7 @@ commentL = buildDSLLexer go T_COMMENT
keywordL :: DSLLexer
keywordL = fromTableL [ ("PROC", T_PROC)
, ("IF", T_IF)
+ , ("ELIF", T_ELIF)
, ("ELSE", T_ELSE)
, ("WHILE", T_WHILE)
, ("DO", T_DO)
@@ -144,16 +146,32 @@ linearP = BLinear <$> mult1 operationP
ifP :: DSLParser Block
ifP = do
- c <- tagP T_IF *> mult blockP <* tagP T_DO
- b <- mult blockP <* tagP T_END
- return $ BIf c b
+ first <- (tagP T_IF *> bp <* tagP T_DO) `plus` bp
+ elifs <- mult $ (tagP T_ELIF *> bp <* tagP T_DO) `plus` bp
+ elze <- optionalMaybe $ tagP T_ELSE >> bp
+ _ <- tagP T_END
+ return $ go $ first:elifs ++ [elseToPair elze]
+ where
+ bp = mult blockP
+ go [] = BLinear []
+ go ((c, b):xs) = BIf c b $ [go xs]
+ elseToPair Nothing = ([BLinear [OpPushData $ StackBool True]], [])
+ elseToPair (Just bs) = ([BLinear [OpPushData $ StackBool True]], bs)
+
+--ifP = do
+-- c <- tagP T_IF *> mult blockP <* tagP T_DO
+-- b <- mult blockP <* tagP T_END
+-- return $ BIf c b
+
+{-
+exactly 1: IF [blocks] DO [blocks]
+0 or many: ELIF [blocks] DO [blocks]
+0 or 1: ELSE [blocks]
+exactly 1: END
+
+IF c1 DO b1 ELIF c2 DO b2 ELIF c3 DO b3 ELSE b4
+-}
-ifElseP :: DSLParser Block
-ifElseP = do
- c <- tagP T_IF *> mult blockP <* tagP T_DO
- b1 <- mult blockP <* tagP T_ELSE
- b2 <- mult blockP <* tagP T_END
- return $ BIfElse c b1 b2
whileP :: DSLParser Block
whileP = do
@@ -169,7 +187,6 @@ procP = front `plus` back
blockP :: DSLParser Block
blockP = firstOf [ whileP
- , ifElseP
, ifP
, linearP
]