on master help sign in
Add parsing for infix declarations. No support for actually using this
8590c6bEvan Czaplicki
compiler/Parse/Declaration.hs+13−5
@@ -11,27 +11,24 @@ import Parse.Helpers
11import qualified Parse.Expression as Expr
11import qualified Parse.Expression as Expr
12import qualified SourceSyntax.Type as T
12import qualified SourceSyntax.Type as T
13import qualified Parse.Type as Type
13import qualified Parse.Type as Type
14−
15−import SourceSyntax.Declaration (Declaration(..))
14+import SourceSyntax.Declaration (Declaration(..), Assoc(..))
16
15
17import Unique
16import Unique
18
17
19declaration :: IParser (Declaration t v)
18declaration :: IParser (Declaration t v)
20−declaration = alias <|> datatype <|> foreignDef <|> definition
19+declaration = alias <|> datatype <|> infixDecl <|> foreignDef <|> definition
21
20
22definition :: IParser (Declaration t v)
21definition :: IParser (Declaration t v)
23definition = Definition <$> Expr.def
22definition = Definition <$> Expr.def
24
23
25alias :: IParser (Declaration t v)
24alias :: IParser (Declaration t v)
26alias = do
25alias = do
27− start <- getPosition
28 reserved "type" <?> "type alias (type Point = {x:Int, y:Int})"
26 reserved "type" <?> "type alias (type Point = {x:Int, y:Int})"
29 forcedWS
27 forcedWS
30 alias <- capVar
28 alias <- capVar
31 args <- spacePrefix lowVar
29 args <- spacePrefix lowVar
32 whitespace ; string "=" ; whitespace
30 whitespace ; string "=" ; whitespace
33 tipe <- Type.expr
31 tipe <- Type.expr
34− end <- getPosition
35 return (TypeAlias alias args tipe)
32 return (TypeAlias alias args tipe)
36
33
37datatype :: IParser (Declaration t v)
34datatype :: IParser (Declaration t v)
@@ -45,6 +42,17 @@ datatype = do
45 return $ Datatype name args tcs
42 return $ Datatype name args tcs
46
43
47
44
45+infixDecl :: IParser (Declaration t v)
46+infixDecl = do
47+ assoc <- choice [ reserved "infixl" >> return L
48+ , reserved "infix" >> return N
49+ , reserved "infixr" >> return R ]
50+ whitespace
51+ n <- digit
52+ whitespace
53+ Fixity assoc (read [n]) <$> anyOp
54+
55+
48foreignDef :: IParser (Declaration t v)
56foreignDef :: IParser (Declaration t v)
49foreignDef = do
57foreignDef = do
50 try (reserved "foreign")
58 try (reserved "foreign")