summaryrefslogtreecommitdiff
path: root/app/Parser.hs
diff options
context:
space:
mode:
authorMirek Kratochvil <exa.exa@gmail.com>2022-12-14 22:56:47 +0100
committerMirek Kratochvil <exa.exa@gmail.com>2022-12-14 22:56:47 +0100
commit2f07d890433bebedc136037ad9cce2eed25b0437 (patch)
tree3c1bce09493565a4a1ae200a34d6e54f58fbe986 /app/Parser.hs
parent71992db7d0e51f87934f7d9c0cf9ddbd3a8d0300 (diff)
downloadprlg-2f07d890433bebedc136037ad9cce2eed25b0437.tar.gz
prlg-2f07d890433bebedc136037ad9cce2eed25b0437.tar.bz2
10h vacuum cleaner sound
Diffstat (limited to 'app/Parser.hs')
-rw-r--r--app/Parser.hs26
1 files changed, 12 insertions, 14 deletions
diff --git a/app/Parser.hs b/app/Parser.hs
index 864cdc5..acc8104 100644
--- a/app/Parser.hs
+++ b/app/Parser.hs
@@ -172,29 +172,27 @@ literal = Literal . unTok <$> free (satisfy isNormalTok <* notFollowedBy lParen)
call = do
fn <- unTok <$> satisfy isNormalTok -- not free
- Seq inner <- free parens
- return $ Call fn $ splitOn [Literal ","] inner
+ (Call fn [] <$ try emptyParens) <|> do
+ Seq inner <- free parens
+ return $ Call fn $ splitOn [Literal ","] inner
parens = Seq <$> (free lParen *> some seqItem <* free rParen)
+emptyParens = Literal "()" <$ (free lParen >> free rParen)
+
list = do
free lBracket
- choice
- [ List [] Nothing <$ free rBracket
- , do items <- splitOn [Literal ","] <$> some seqItem
- choice
- [ List items Nothing <$ free rBracket
- , List items . Just <$>
- (free listTail *> some seqItem <* free rBracket)
- ]
- ]
+ (List [] Nothing <$ free rBracket) <|> do
+ items <- splitOn [Literal ","] <$> some seqItem
+ (List items Nothing <$ free rBracket) <|>
+ (List items . Just <$> (free listTail *> some seqItem <* free rBracket))
-seqItem = choice [try call, literal, parens, list]
+seqItem = choice [try call, literal, try emptyParens, parens, list]
simpleTok :: String -> Parser ()
simpleTok s = void $ single (Tok s)
-comma = simpleTok "."
+period = simpleTok "."
lParen = simpleTok "("
@@ -207,7 +205,7 @@ listTail = simpleTok "|"
rBracket = simpleTok "]"
clause :: Parser PAST
-clause = Seq <$> some (free seqItem) <* free comma
+clause = Seq <$> some (free seqItem) <* free period
parsePrlg :: Parser [PAST]
parsePrlg = ws *> many clause <* eof