@@ -1,17 +1,37 @@
1−module Parse.Binop (binops, OpTable) where
1+module Parse.Binop (infixOp, binops, OpTable) where
3+import Control.Monad (guard)
3import qualified Data.List as List
4import qualified Data.List as List
4import qualified Data.Map as Map
5import qualified Data.Map as Map
5−import Text.Parsec ((<|>), choice, getState, try)
6+import Text.Parsec ((<|>), choice, getState, lower, many1, notFollowedBy, satisfy, try)
7import AST.Declaration (Assoc(L, N, R))
8import AST.Declaration (Assoc(L, N, R))
8import AST.Expression.General (Expr'(Binop))
9import AST.Expression.General (Expr'(Binop))
9import qualified AST.Expression.Source as Source
10import qualified AST.Expression.Source as Source
11+import qualified AST.Helpers as Help
10import qualified AST.Variable as Var
12import qualified AST.Variable as Var
11−import Parse.Helpers (IParser, OpTable, commitIf, failure, whitespace)
13+import Parse.Helpers (IParser, OpTable, commitIf, expecting, failure, whitespace)
12import qualified Reporting.Annotation as A
14import qualified Reporting.Annotation as A
21+infixOp :: IParser String
23+ expecting "an infix operator like (+)" $
24+ do op <- many1 (satisfy (\c -> Help.isSymbol c && c /= '`'))
25+ guard (op `notElem` [ "=", "..", "->", "--", "|", ":" ])
27+ "." -> notFollowedBy lower >> return op
15opLevel :: OpTable -> String -> Int
35opLevel :: OpTable -> String -> Int
16opLevel table op =
36opLevel table op =
17 fst $ Map.findWithDefault (9,L) op table
37 fst $ Map.findWithDefault (9,L) op table
@@ -30,18 +50,17 @@ hasLevel table n (op,_) =
31 :: IParser Source.Expr
51 :: IParser Source.Expr
32 -> IParser Source.Expr
52 -> IParser Source.Expr
34 -> IParser Source.Expr
53 -> IParser Source.Expr
35−binops term last anyOp =
54+binops term last =
36 do e <- term
55 do e <- term
37 table <- getState
56 table <- getState
38 split table 0 e =<< nextOps
57 split table 0 e =<< nextOps
42− [ commitIf (whitespace >> anyOp) $
61+ [ commitIf (whitespace >> infixOp) $
43 do whitespace
62 do whitespace
44− op <- anyOp
63+ op <- infixOp
45 whitespace
64 whitespace
46 expr <- Left <$> try term <|> Right <$> last
65 expr <- Left <$> try term <|> Right <$> last
47 case expr of
66 case expr of