@@ -13,9 +13,9 @@ import Prelude hiding (between)
1313
1414import Control.Alt ((<|>))
1515import Data.Foldable (foldl , foldr )
16- import Data.List (List (..), (:))
16+ import Data.List (List (..), reverse , (:))
1717import Parsing (ParserT )
18- import Parsing.Combinators (choice , (<?>))
18+ import Parsing.Combinators (choice , many , (<?>))
1919
2020data Assoc = AssocNone | AssocLeft | AssocRight
2121
@@ -72,8 +72,8 @@ makeParser term ops = do
7272 prefixOp = choice accum.prefix <?> " "
7373 postfixOp = choice accum.postfix <?> " "
7474
75- postfixP = chainP (>>>) postfixOp
76- prefixP = chainP (<<<) prefixOp
75+ postfixP = rchainP postfixOp
76+ prefixP = lchainP prefixOp
7777
7878splitOp :: forall m s a . Operator m s a -> SplitAccum m s a -> SplitAccum m s a
7979splitOp (Infix op AssocNone ) accum = accum { nassoc = op : accum.nassoc }
@@ -108,13 +108,11 @@ nassocP x nassocOp prefixP term postfixP = do
108108 y <- termP prefixP term postfixP
109109 pure (f x y)
110110
111- chainP :: forall m s a . ((a -> a ) -> (a -> a ) -> (a -> a )) -> ParserT s m (a -> a ) -> ParserT s m (a -> a )
112- chainP comp p =
113- do
114- op <- p
115- rest <- chainP comp p
116- pure (comp op rest)
117- <|> pure identity
111+ rchainP :: forall m s a . ParserT s m (a -> a ) -> ParserT s m (a -> a )
112+ rchainP p = flip (foldl (\acc f -> f acc)) <$> many p
113+
114+ lchainP :: forall m s a . ParserT s m (a -> a ) -> ParserT s m (a -> a )
115+ lchainP p = flip (foldl (\acc f -> f acc)) <$> reverse <$> many p
118116
119117termP :: forall m s a b c . ParserT s m (a -> b ) -> ParserT s m a -> ParserT s m (b -> c ) -> ParserT s m c
120118termP prefixP term postfixP = do
0 commit comments