Skip to content

Commit ed21a3b

Browse files
committed
stack safety
1 parent f25601f commit ed21a3b

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

src/Parsing/Expr.purs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import Prelude hiding (between)
1313

1414
import Control.Alt ((<|>))
1515
import Data.Foldable (foldl, foldr)
16-
import Data.List (List(..), (:))
16+
import Data.List (List(..), reverse, (:))
1717
import Parsing (ParserT)
18-
import Parsing.Combinators (choice, (<?>))
18+
import Parsing.Combinators (choice, many, (<?>))
1919

2020
data 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

7878
splitOp :: forall m s a. Operator m s a -> SplitAccum m s a -> SplitAccum m s a
7979
splitOp (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

119117
termP :: forall m s a b c. ParserT s m (a -> b) -> ParserT s m a -> ParserT s m (b -> c) -> ParserT s m c
120118
termP prefixP term postfixP = do

0 commit comments

Comments
 (0)