Parse lists
Correctly printing them comes next.
This commit is contained in:
parent
adebcdd26c
commit
0d52c07f68
1 changed files with 20 additions and 1 deletions
|
|
@ -33,6 +33,9 @@ symbol = L.symbol space
|
||||||
parens :: Parser a -> Parser a
|
parens :: Parser a -> Parser a
|
||||||
parens = between (symbol "(") (symbol ")")
|
parens = between (symbol "(") (symbol ")")
|
||||||
|
|
||||||
|
brackets :: Parser a -> Parser a
|
||||||
|
brackets = between (symbol "[") (symbol "]")
|
||||||
|
|
||||||
-- Building blocks
|
-- Building blocks
|
||||||
|
|
||||||
pName :: Parser T.Text
|
pName :: Parser T.Text
|
||||||
|
|
@ -44,6 +47,18 @@ pName = lexeme $ unquotedName <|> quotedName
|
||||||
pVarName :: Parser T.Text
|
pVarName :: Parser T.Text
|
||||||
pVarName = lexeme $ takeWhile1P (Just "uppercase character") isUpper
|
pVarName = lexeme $ takeWhile1P (Just "uppercase character") isUpper
|
||||||
|
|
||||||
|
pCons :: Parser (Term T.Text)
|
||||||
|
pCons = brackets $ do
|
||||||
|
elems <- pTerm `sepBy1` symbol ","
|
||||||
|
void $ symbol "|"
|
||||||
|
rest <- pTerm
|
||||||
|
pure $ foldr (\a b -> Stat "[|]" [a, b]) rest elems
|
||||||
|
|
||||||
|
pList :: Parser (Term T.Text)
|
||||||
|
pList = do
|
||||||
|
elems <- brackets $ pTerm `sepBy` symbol ","
|
||||||
|
pure $ foldr (\a b -> Stat "[|]" [a, b]) (Stat "[]" []) elems
|
||||||
|
|
||||||
pStat :: Parser (T.Text, [Term T.Text])
|
pStat :: Parser (T.Text, [Term T.Text])
|
||||||
pStat = do
|
pStat = do
|
||||||
name <- pName
|
name <- pName
|
||||||
|
|
@ -51,7 +66,11 @@ pStat = do
|
||||||
pure (name, terms)
|
pure (name, terms)
|
||||||
|
|
||||||
pTerm :: Parser (Term T.Text)
|
pTerm :: Parser (Term T.Text)
|
||||||
pTerm = (Var <$> pVarName) <|> (uncurry Stat <$> pStat)
|
pTerm
|
||||||
|
= (Var <$> pVarName)
|
||||||
|
<|> (uncurry Stat <$> pStat)
|
||||||
|
<|> try pCons
|
||||||
|
<|> pList
|
||||||
|
|
||||||
pTerms :: Parser [Term T.Text]
|
pTerms :: Parser [Term T.Text]
|
||||||
pTerms = (pTerm `sepBy1` symbol ",") <* symbol "."
|
pTerms = (pTerm `sepBy1` symbol ",") <* symbol "."
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue