diff options
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 |
