diff options
| author | Mirek Kratochvil <exa.exa@gmail.com> | 2022-12-14 22:56:47 +0100 |
|---|---|---|
| committer | Mirek Kratochvil <exa.exa@gmail.com> | 2022-12-14 22:56:47 +0100 |
| commit | 2f07d890433bebedc136037ad9cce2eed25b0437 (patch) | |
| tree | 3c1bce09493565a4a1ae200a34d6e54f58fbe986 /app/Parser.hs | |
| parent | 71992db7d0e51f87934f7d9c0cf9ddbd3a8d0300 (diff) | |
| download | prlg-2f07d890433bebedc136037ad9cce2eed25b0437.tar.gz prlg-2f07d890433bebedc136037ad9cce2eed25b0437.tar.bz2 | |
10h vacuum cleaner sound
Diffstat (limited to 'app/Parser.hs')
| -rw-r--r-- | app/Parser.hs | 26 |
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 |
