- parseOps :: (Parser Token Op2) (Parser Token Expr) -> Parser Token Expr
- parseOps ops prev = prev >>= \e1->optional (
- ops >>= \op->parseOps ops prev >>= \e->pure (op, e)
- ) >>= \moe-> pure case moe of
- Nothing = e1
- (Just (op, e2)) = Op2Expr e1 op e2
+ parseOpRight :: (Parser Token Op2) (Parser Token Expr) -> Parser Token Expr
+ parseOpRight ops prev = prev >>= \e1->optional (
+ ops >>= \op->parseOpRight ops prev >>= \e->pure (op, e)
+ ) >>= \moe->pure $ maybe e1 (\(op,e2)->Op2Expr e1 op e2) moe
+
+ parseOpLeft :: (Parser Token Op2) (Parser Token Expr) -> Parser Token Expr
+ parseOpLeft ops prev = prev >>= \e1->many (
+ ops >>= \op->prev >>= \e->pure (op, e)
+ ) >>= \moe->foldM (\e->(\(op,e2)->pure $ Op2Expr e op e2)) e1 moe