summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Hall <hallmatthew314@gmail.com>2023-02-15 16:34:28 +1300
committerMatthew Hall <hallmatthew314@gmail.com>2023-02-15 16:34:28 +1300
commit7dd05d975c3f7b8eab2b3699dde7f5190cfcb70d (patch)
tree6b8938bd7c9531d89a1e9e95631a8316575e325d
parent7057209137185b0b18822a4f2156104eabd053c8 (diff)
Parser refactor
-rw-r--r--DSL.hs28
1 files changed, 9 insertions, 19 deletions
diff --git a/DSL.hs b/DSL.hs
index d3001fb..72e48fe 100644
--- a/DSL.hs
+++ b/DSL.hs
@@ -154,12 +154,11 @@ stripWhitespace = filter $ not . (==T_WHITESPACE) . tData
-- Parsing
------------------------------------------------------------------------------
+tokenDataP :: TokenData -> DSLParser DSLToken
+tokenDataP t = satisfy $ (==t) . tData
+
wsP :: DSLParser ()
-wsP = do
- t <- anyToken
- case tData t of
- T_WHITESPACE -> result ()
- _ -> flunk
+wsP = () <$ tokenDataP T_WHITESPACE
dataLiteralP :: DSLParser StackData
dataLiteralP = do
@@ -189,25 +188,16 @@ linearP = BLinear <$> mult1 operationP
ifP :: DSLParser Block
ifP = do
- _ <- satisfy $ (==T_IF) . tData
- c <- cond
- _ <- satisfy $ (==T_DO) . tData
- b <- body
- _ <- satisfy $ (==T_END) . tData
+ c <- tokenDataP T_IF *> mult blockP <* tokenDataP T_DO
+ b <- mult blockP <* tokenDataP T_END
return $ BIf c b
- where
- cond = mult blockP
- body = mult blockP
ifElseP :: DSLParser Block
ifElseP = do
- c <- satisfy ((==T_IF) . tData) *> cond <* satisfy ((==T_DO) . tData)
- b1 <- body <* satisfy ((==T_ELSE) . tData)
- b2 <- body <* satisfy ((==T_END) . tData)
+ c <- tokenDataP T_IF *> mult blockP <* tokenDataP T_DO
+ b1 <- mult blockP <* tokenDataP T_ELSE
+ b2 <- mult blockP <* tokenDataP T_END
return $ BIfElse c b1 b2
- where
- cond = mult blockP
- body = mult blockP
blockP :: DSLParser Block
blockP = firstOf [ ifElseP