@@ -9,6 +9,7 @@ import qualified Data.ByteString as B
99
1010import qualified AST.Source as Src
1111import qualified AST.Valid as Valid
12+import qualified Elm.Package as Pkg
1213import qualified Parse.Declaration as Decl
1314import qualified Parse.Module as Module
1415import qualified Parse.Primitives as P
@@ -21,9 +22,13 @@ import qualified Validate
2122-- PROGRAM
2223
2324
24−program :: B.ByteString -> Result.Result i w Error.Error Valid.Module
25−program src =
26− case P.run chompProgram src of
25+program :: Pkg.Name -> B.ByteString -> Result.Result i w Error.Error Valid.Module
26+program pkg src =
27+ let
28+ parser =
29+ if Pkg.isKernel pkg then fancyParser else normalParser
30+ in
31+ case P.run parser src of
2732 Right modul ->
2833 Validate.validate modul
2934
@@ -31,13 +36,27 @@ program src =
3136 Result.throw syntaxError
3237
3338
34−chompProgram :: P.Parser (Src.Module [Src.Decl])
35−chompProgram =
39+-- CHOMP PROGRAMS
40+
41+
42+normalParser :: P.Parser (Src.Module [Src.Decl])
43+normalParser =
3644 do srcModule <- Module.module_ (chompDeclarations [])
3745 P.endOfFile
3846 return srcModule
3947
4048
49+fancyParser :: P.Parser (Src.Module [Src.Decl])
50+fancyParser =
51+ do srcModule <- Module.module_ (chompDeclarations =<< chompInfixes [])
52+ P.endOfFile
53+ return srcModule
54+
55+
56+
57+-- CHOMP DECLARATIONS
58+
59+
4160chompDeclarations :: [Src.Decl] -> P.Parser [Src.Decl]
4261chompDeclarations decls =
4362 do (decl, _, pos) <- Decl.declaration
@@ -46,3 +65,12 @@ chompDeclarations decls =
4665 chompDeclarations (decl:decls)
4766 , return (reverse (decl:decls))
4867 ]
68+
69+
70+chompInfixes :: [Src.Decl] -> P.Parser [Src.Decl]
71+chompInfixes decls =
72+ do decl <- Decl.infix_
73+ P.oneOf
74+ [ chompInfixes (decl:decls)
75+ , return (decl:decls)
76+ ]