on master help sign in
Move operator parser infixOp into Parser.Binop
commitbb54ad6fd16e693087cc227e4a093806b0ba6f02 authorEvan Czaplicki <evancz@users.noreply.github.com> dateFri 5 Aug 2016, 17:39 (10 years ago) parent7a2e15f
6 files changed+36−29
src/Docs/Check.hs+2−1 src/Parse/Binop.hs+26−7 src/Parse/Declaration.hs+2−1 src/Parse/Expression.hs+4−4 src/Parse/Helpers.hs+1−16 src/Parse/Module.hs+1
src/Docs/Check.hs+2−1
@@ -11,8 +11,9 @@ import qualified AST.Variable as Var
1111import qualified Docs.AST as Docs
1212import qualified Elm.Compiler.Type as Type
1313import Elm.Utils ((|>))
14+import Parse.Binop (infixOp)
1415import Parse.Helpers
15− ( addLocation, anyUntil, commaSep1, iParse, parens, simpleNewline, infixOp
16+ ( addLocation, anyUntil, commaSep1, iParse, parens, simpleNewline
1617 , var, whitespace
1718 )
1819import qualified Reporting.Annotation as A
src/Parse/Binop.hs+26−7
@@ -1,17 +1,37 @@
1−module Parse.Binop (binops, OpTable) where
1+module Parse.Binop (infixOp, binops, OpTable) where
22
3+import Control.Monad (guard)
34import qualified Data.List as List
45import qualified Data.Map as Map
5−import Text.Parsec ((<|>), choice, getState, try)
6+import Text.Parsec ((<|>), choice, getState, lower, many1, notFollowedBy, satisfy, try)
67
78import AST.Declaration (Assoc(L, N, R))
89import AST.Expression.General (Expr'(Binop))
910import qualified AST.Expression.Source as Source
11+import qualified AST.Helpers as Help
1012import qualified AST.Variable as Var
11−import Parse.Helpers (IParser, OpTable, commitIf, failure, whitespace)
13+import Parse.Helpers (IParser, OpTable, commitIf, expecting, failure, whitespace)
1214import qualified Reporting.Annotation as A
1315
1416
17+
18+-- INFIX OPERATORS
19+
20+
21+infixOp :: IParser String
22+infixOp =
23+ expecting "an infix operator like (+)" $
24+ do op <- many1 (satisfy (\c -> Help.isSymbol c && c /= '`'))
25+ guard (op `notElem` [ "=", "..", "->", "--", "|", ":" ])
26+ case op of
27+ "." -> notFollowedBy lower >> return op
28+ _ -> return op
29+
30+
31+
32+-- BINARY EXPRESSIONS
33+
34+
1535opLevel :: OpTable -> String -> Int
1636opLevel table op =
1737 fst $ Map.findWithDefault (9,L) op table
@@ -30,18 +50,17 @@ hasLevel table n (op,_) =
3050binops
3151 :: IParser Source.Expr
3252 -> IParser Source.Expr
33− -> IParser String
3453 -> IParser Source.Expr
35−binops term last anyOp =
54+binops term last =
3655 do e <- term
3756 table <- getState
3857 split table 0 e =<< nextOps
3958 where
4059 nextOps =
4160 choice
42− [ commitIf (whitespace >> anyOp) $
61+ [ commitIf (whitespace >> infixOp) $
4362 do whitespace
44− op <- anyOp
63+ op <- infixOp
4564 whitespace
4665 expr <- Left <$> try term <|> Right <$> last
4766 case expr of
src/Parse/Declaration.hs+2−1
@@ -4,6 +4,7 @@ module Parse.Declaration where
44import Text.Parsec ( (<?>), choice, digit, optionMaybe, string, try )
55
66import qualified AST.Declaration as Decl
7+import qualified Parse.Binop as Binop
78import qualified Parse.Expression as Expr
89import Parse.Helpers as Help
910import qualified Parse.Type as Type
@@ -79,7 +80,7 @@ infixDecl =
7980 forcedWS
8081 n <- digit
8182 forcedWS
82− op <- infixOp
83+ op <- Binop.infixOp
8384 return $ Decl.Fixity (Decl.Infix op assoc (read [n]))
8485
8586
src/Parse/Expression.hs+4−4
@@ -121,7 +121,7 @@ parensTerm =
121121 in
122122 do (start, mkExpr, end) <-
123123 located $ choice $
124− [ mkBinop <$> try (parens infixOp)
124+ [ mkBinop <$> try (parens Binop.infixOp)
125125 , parens (tupleFn <|> parenedExpr)
126126 ]
127127 return (mkExpr start end)
@@ -202,7 +202,7 @@ expr =
202202
203203binaryExpr :: IParser Source.Expr
204204binaryExpr =
205− Binop.binops appExpr lastExpr infixOp
205+ Binop.binops appExpr lastExpr
206206 where
207207 lastExpr =
208208 addLocation (choice [ letExpr, caseExpr, ifExpr ])
@@ -296,7 +296,7 @@ annotation :: (String -> T.Raw -> a) -> IParser (A.Located a)
296296annotation creator =
297297 let
298298 start =
299− do v <- lowVar <|> parens infixOp
299+ do v <- lowVar <|> parens Binop.infixOp
300300 padded hasType
301301 return v
302302 in
@@ -325,6 +325,6 @@ makeFunction args body@(A.A ann _) =
325325defStart :: IParser (P.Raw, [P.Raw])
326326defStart =
327327 expecting "the definition of a value (x = ...)" $
328− do starter <- try Pattern.term <|> addLocation (P.Var <$> parens infixOp)
328+ do starter <- try Pattern.term <|> addLocation (P.Var <$> parens Binop.infixOp)
329329 args <- spacePrefix Pattern.term
330330 return (starter, args)
src/Parse/Helpers.hs+1−16
@@ -1,7 +1,7 @@
11module Parse.Helpers where
22
33import Prelude hiding (until)
4−import Control.Monad (guard, join)
4+import Control.Monad (join)
55import Control.Monad.State (State)
66import Data.Char (isUpper)
77import qualified Data.Map as Map
@@ -14,7 +14,6 @@ import qualified Text.Parsec.Token as T
1414import qualified AST.Declaration as Decl
1515import qualified AST.Expression.General as E
1616import qualified AST.Expression.Source as Source
17−import qualified AST.Helpers as Help
1817import qualified AST.Literal as L
1918import qualified AST.Variable as Variable
2019import qualified Reporting.Annotation as A
@@ -111,20 +110,6 @@ reserved word =
111110
112111
113112
114−-- INFIX OPERATORS
115−
116−
117−infixOp :: IParser String
118−infixOp =
119− expecting "an infix operator like (+)" $
120− do op <- many1 (satisfy (\c -> Help.isSymbol c && c /= '`'))
121− guard (op `notElem` [ "=", "..", "->", "--", "|", ":" ])
122− case op of
123− "." -> notFollowedBy lower >> return op
124− _ -> return op
125−
126−
127−
128113-- COMMON SYMBOLS
129114
130115
src/Parse/Module.hs+1
@@ -3,6 +3,7 @@ module Parse.Module (moduleDecl, header, getModuleName) where
33
44import Text.Parsec hiding (newline, spaces)
55
6+import Parse.Binop (infixOp)
67import Parse.Helpers
78import qualified AST.Module as Module
89import qualified AST.Module.Name as ModuleName