This commit is contained in:
crumbtoo
2024-01-08 20:14:18 -07:00
parent 936f24148f
commit 97ce9b48ae

View File

@@ -64,11 +64,18 @@ decl = choice
funD :: Parser PartialDecl' funD :: Parser PartialDecl'
funD = FunD <$> varid <*> many pat1 <*> (symbol "=" *> fmap Const partialExpr) funD = FunD <$> varid <*> many pat1 <*> (symbol "=" *> fmap Const partialExpr)
standalonePartialExpr :: Parser PartialExpr'
standalonePartialExpr = standaloneOf partialExpr
standaloneOf :: Parser a -> Parser a
standaloneOf = (<* eof)
partialExpr :: Parser PartialExpr' partialExpr :: Parser PartialExpr'
partialExpr = choice partialExpr = choice
[ try $ fmap Fix $ mkB <$> partialExpr1' <*> lexeme infixOp <*> partialExpr' [ try $ fmap Fix $ mkB <$> partialExpr1' <*> lexeme infixOp <*> partialExpr'
, foldl1' papp <$> some partialExpr1 , foldl1' papp <$> some partialExpr1
] ]
<?> "expression"
where where
mkB a f b = B f a b mkB a f b = B f a b
partialExpr1' = unFix <$> partialExpr1 partialExpr1' = unFix <$> partialExpr1
@@ -83,12 +90,13 @@ partialExpr1 = choice
, fmap Fix $ varid' , fmap Fix $ varid'
, fmap Fix $ lit' , fmap Fix $ lit'
] ]
<?> "expression"
where where
varid' = E . VarEF <$> varid varid' = E . VarEF <$> varid
lit' = E . LitEF <$> lit lit' = E . LitEF <$> lit
infixOp :: Parser Name infixOp :: Parser Name
infixOp = symvar <|> symcon infixOp = symvar <|> symcon <?> "infix operator"
symvar :: Parser Name symvar :: Parser Name
symvar = T.pack <$> symvar = T.pack <$>
@@ -100,6 +108,7 @@ symcon = T.pack <$>
pat1 :: Parser Pat' pat1 :: Parser Pat'
pat1 = VarP <$> varid pat1 = VarP <$> varid
<?> "pattern"
varid :: Parser VarId varid :: Parser VarId
varid = NameVar <$> lexeme namevar varid = NameVar <$> lexeme namevar
@@ -126,6 +135,7 @@ dataD = undefined
lit :: Parser Lit' lit :: Parser Lit'
lit = int lit = int
<?> "literal"
where where
int = IntL <$> L.decimal int = IntL <$> L.decimal