@@ -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
15−import SourceSyntax.Declaration (Declaration(..))
14+import SourceSyntax.Declaration (Declaration(..), Assoc(..))
17import Unique
16import Unique
19declaration :: IParser (Declaration t v)
18declaration :: IParser (Declaration t v)
20−declaration = alias <|> datatype <|> foreignDef <|> definition
19+declaration = alias <|> datatype <|> infixDecl <|> foreignDef <|> definition
22definition :: IParser (Declaration t v)
21definition :: IParser (Declaration t v)
23definition = Definition <$> Expr.def
22definition = Definition <$> Expr.def
25alias :: IParser (Declaration t v)
24alias :: IParser (Declaration t v)
28 reserved "type" <?> "type alias (type Point = {x:Int, y:Int})"
26 reserved "type" <?> "type alias (type Point = {x:Int, y:Int})"
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
35 return (TypeAlias alias args tipe)
32 return (TypeAlias alias args tipe)
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
45+infixDecl :: IParser (Declaration t v)
47+ assoc <- choice [ reserved "infixl" >> return L
48+ , reserved "infix" >> return N
49+ , reserved "infixr" >> return R ]
53+ Fixity assoc (read [n]) <$> anyOp
48foreignDef :: IParser (Declaration t v)
56foreignDef :: IParser (Declaration t v)
49foreignDef = do
57foreignDef = do
50 try (reserved "foreign")
58 try (reserved "foreign")