@@ -1,5 +1,6 @@
11module Parse.Binop (binops, infixStmt, OpTable) where
22
3+import Control.Applicative ((<$>))
34import Control.Monad.Error
45import Data.List (intercalate)
56import qualified Data.Map as Map
@@ -38,15 +39,22 @@ opAssoc table op = Map.findWithDefault R op dict
3839hasLevel :: OpTable -> Int -> (String, LExpr t v) -> Bool
3940hasLevel table n (op,_) = opLevel table op == n
4041
41−binops :: OpTable -> IParser (LExpr t v) -> IParser String -> IParser (LExpr t v)
42−binops table term anyOp =
42+binops :: OpTable
43+ -> IParser (LExpr t v)
44+ -> IParser (LExpr t v)
45+ -> IParser String
46+ -> IParser (LExpr t v)
47+binops table term last anyOp =
4348 do e <- term
44− split (table ++ preludeTable) 0 e =<< many nextOp
49+ split (table ++ preludeTable) 0 e =<< nextOps
4550 where
46− nextOp = commitIf (whitespace >> anyOp) $ do
47− whitespace ; op <- anyOp
48− whitespace ; e <- term
49− return (op,e)
51+ nextOps = choice [ commitIf (whitespace >> anyOp) $ do
52+ whitespace ; op <- anyOp ; whitespace
53+ expr <- Left <$> try term <|> Right <$> last
54+ case expr of
55+ Left t -> (:) (op,t) <$> nextOps
56+ Right e -> return [(op,e)]
57+ , return [] ]
5058
5159split :: OpTable
5260 -> Int