From 2f07d890433bebedc136037ad9cce2eed25b0437 Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Wed, 14 Dec 2022 22:56:47 +0100 Subject: 10h vacuum cleaner sound --- app/Parser.hs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'app/Parser.hs') 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 -- cgit v1.2.3