expr fixups
This commit is contained in:
@@ -45,6 +45,9 @@ symbol = L.symbol sc
|
|||||||
sc :: Parser ()
|
sc :: Parser ()
|
||||||
sc = L.space hspace1 (void lineComment) (void blockComment)
|
sc = L.space hspace1 (void lineComment) (void blockComment)
|
||||||
|
|
||||||
|
scn :: Parser ()
|
||||||
|
scn = L.space space1 (void lineComment) (void blockComment)
|
||||||
|
|
||||||
-- TODO: return comment text
|
-- TODO: return comment text
|
||||||
-- TODO: '---' should not start a comment
|
-- TODO: '---' should not start a comment
|
||||||
lineComment :: Parser Text
|
lineComment :: Parser Text
|
||||||
@@ -72,27 +75,35 @@ standaloneOf :: Parser a -> Parser a
|
|||||||
standaloneOf = (<* eof)
|
standaloneOf = (<* eof)
|
||||||
|
|
||||||
partialExpr :: Parser PartialExpr'
|
partialExpr :: Parser PartialExpr'
|
||||||
partialExpr = choice
|
partialExpr = (choice . fmap foldedLexeme)
|
||||||
[ try $ fmap Fix $ mkB <$> partialExpr1' <*> lexeme infixOp <*> partialExpr'
|
[ try application
|
||||||
, foldl1' papp <$> some partialExpr1
|
, Fix <$> infixExpr
|
||||||
]
|
]
|
||||||
<?> "expression"
|
<?> "expression"
|
||||||
where
|
where
|
||||||
|
application = foldl1' mkApp <$> some partialExpr1
|
||||||
|
infixExpr = mkB <$> partialExpr1' <*> infixOp' <*> partialExpr'
|
||||||
|
|
||||||
mkB a f b = B f a b
|
mkB a f b = B f a b
|
||||||
partialExpr1' = unFix <$> partialExpr1
|
partialExpr1' = unFix <$> partialExpr1
|
||||||
partialExpr' = unFix <$> partialExpr
|
partialExpr' = unFix <$> partialExpr
|
||||||
|
infixOp' = foldedLexeme infixOp
|
||||||
|
|
||||||
papp :: PartialExpr' -> PartialExpr' -> PartialExpr'
|
mkApp :: PartialExpr' -> PartialExpr' -> PartialExpr'
|
||||||
papp f x = Fix . E $ f `AppEF` x
|
mkApp f x = Fix . E $ f `AppEF` x
|
||||||
|
|
||||||
|
foldedLexeme :: Parser a -> Parser a
|
||||||
|
foldedLexeme p = L.lineFold scn $ \sc' -> L.lexeme sc' p
|
||||||
|
|
||||||
partialExpr1 :: Parser PartialExpr'
|
partialExpr1 :: Parser PartialExpr'
|
||||||
partialExpr1 = choice
|
partialExpr1 = (choice . fmap foldedLexeme)
|
||||||
[ try $ char '(' *> (hoistFix P <$> partialExpr) <* char ')'
|
[ foldedLexeme "(" *> partialExpr' <* foldedLexeme ")"
|
||||||
, fmap Fix $ varid'
|
, Fix <$> varid'
|
||||||
, fmap Fix $ lit'
|
, Fix <$> lit'
|
||||||
]
|
]
|
||||||
<?> "expression"
|
<?> "expression"
|
||||||
where
|
where
|
||||||
|
partialExpr' = wrapFix . P . unwrapFix <$> partialExpr
|
||||||
varid' = E . VarEF <$> varid
|
varid' = E . VarEF <$> varid
|
||||||
lit' = E . LitEF <$> lit
|
lit' = E . LitEF <$> lit
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user