on master help sign in
introduce the `padded` function to use fewer `whitespace` markers
commit90e007730d67b28b2943dc116bbdab165f4ed810 authorEvan Czaplicki <info@elm-lang.org> dateSat 2 Nov 2013, 19:21 (13 years ago) parent934e590
3 files changed+35−31
compiler/Parse/Declaration.hs+9−10 compiler/Parse/Expression.hs+15−19 compiler/Parse/Helpers.hs+11−2
compiler/Parse/Declaration.hs+9−10
@@ -27,7 +27,7 @@ alias = do
2727 forcedWS
2828 alias <- capVar
2929 args <- spacePrefix lowVar
30− whitespace ; string "=" ; whitespace
30+ padded equals
3131 tipe <- Type.expr
3232 return (TypeAlias alias args tipe)
3333
@@ -37,7 +37,7 @@ datatype = do
3737 forcedWS
3838 name <- capVar <?> "name of data-type"
3939 args <- spacePrefix lowVar
40− whitespace ; string "=" ; whitespace
40+ padded equals
4141 tcs <- pipeSep1 Type.constructor
4242 return $ Datatype name args tcs
4343
@@ -47,7 +47,7 @@ infixDecl = do
4747 assoc <- choice [ reserved "infixl" >> return L
4848 , reserved "infix" >> return N
4949 , reserved "infixr" >> return R ]
50− whitespace
50+ forcedWS
5151 n <- digit
5252 forcedWS
5353 Fixity assoc (read [n]) <$> anyOp
@@ -61,11 +61,11 @@ foreignDef = do
6161
6262exportEvent :: IParser (Declaration t v)
6363exportEvent = do
64− try (reserved "export") >> whitespace >> reserved "jsevent" >> whitespace
64+ try (reserved "export") >> padded (reserved "jsevent")
6565 eventName <- jsVar
6666 whitespace
6767 elmVar <- lowVar
68− whitespace ; hasType ; whitespace
68+ padded hasType
6969 tipe <- Type.expr
7070 case tipe of
7171 T.Data "Signal" [t] ->
@@ -76,13 +76,12 @@ exportEvent = do
7676
7777importEvent :: IParser (Declaration t v)
7878importEvent = do
79− try (reserved "import") >> whitespace >> reserved "jsevent" >> whitespace
79+ try (reserved "import") >> padded (reserved "jsevent")
8080 eventName <- jsVar
81− whitespace
82− baseValue <- Expr.term <?> "Base case for imported signal (signals cannot be undefined)"
83− whitespace
81+ baseValue <- padded Expr.term
82+ <?> "Base case for imported signal (signals cannot be undefined)"
8483 elmVar <- lowVar <?> "Name of imported signal"
85− whitespace ; hasType ; whitespace
84+ padded hasType
8685 tipe <- Type.expr
8786 case tipe of
8887 T.Data "Signal" [t] ->
compiler/Parse/Expression.hs+15−19
@@ -51,7 +51,7 @@ listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
5151 where
5252 range = do
5353 lo <- expr
54− whitespace >> string ".." >> whitespace
54+ padded (string "..")
5555 Range lo <$> expr
5656
5757 markdown' = do
@@ -66,9 +66,7 @@ listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
6666
6767 interpolation uid md exprs = do
6868 try (string "{{")
69− whitespace
70− e <- expr
71− whitespace
69+ e <- padded expr
7270 string "}}"
7371 return (md ++ span uid (length exprs), exprs ++ [e])
7472
@@ -100,7 +98,7 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
10098 where field = do
10199 label <- rLabel
102100 patterns <- spacePrefix Pattern.term
103− whitespace >> string "=" >> whitespace
101+ padded equals
104102 body <- expr
105103 return (label, makeFunction patterns body)
106104
@@ -108,24 +106,21 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
108106
109107 change = do
110108 lbl <- rLabel
111− whitespace >> string "<-" >> whitespace
109+ padded (string "<-")
112110 (,) lbl <$> expr
113111
114112 remove r = addLocation (string "-" >> whitespace >> Remove r <$> rLabel)
115113
116114 insert r = addLocation $ do
117115 string "|" >> whitespace
118− Insert r <$> rLabel <*>
119− (whitespace >> string "=" >> whitespace >> expr)
116+ Insert r <$> rLabel <*> (padded equals >> expr)
120117
121118 modify r = addLocation
122119 (string "|" >> whitespace >> Modify r <$> commaSep1 change)
123120
124121 misc = try $ do
125122 record <- addLocation (Var <$> rLabel)
126− whitespace
127− opt <- optionMaybe (remove record)
128− whitespace
123+ opt <- padded (optionMaybe (remove record))
129124 case opt of
130125 Just e -> try (insert e) <|> return e
131126 Nothing -> try (insert record) <|> try (modify record)
@@ -159,7 +154,7 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
159154 where
160155 normal = do
161156 bool <- expr
162− whitespace ; reserved "then" ; whitespace
157+ padded (reserved "then")
163158 thenBranch <- expr
164159 whitespace <?> "an 'else' branch" ; reserved "else" <?> "an 'else' branch" ; whitespace
165160 elseBranch <- expr
@@ -167,14 +162,14 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
167162 (Location.sameAs elseBranch (Var "otherwise"), elseBranch)]
168163 multiIf = MultiIf <$> spaceSep1 iff
169164 where iff = do string "|" ; whitespace
170− b <- expr ; whitespace ; string "->" ; whitespace
165+ b <- expr ; padded arrow
171166 (,) b <$> expr
172167
173168lambdaExpr :: IParser (LExpr t v)
174169lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
175170 whitespace
176171 args <- spaceSep1 Pattern.term
177− whitespace ; arrow ; whitespace
172+ padded arrow
178173 body <- expr
179174 return (makeFunction args body)
180175
@@ -185,14 +180,15 @@ letExpr :: IParser (Expr t v)
185180letExpr = do
186181 reserved "let" ; whitespace
187182 defs <- defSet
188− whitespace ; reserved "in" ; whitespace
183+ padded (reserved "in")
189184 Let defs <$> expr
190185
191186caseExpr :: IParser (Expr t v)
192187caseExpr = do
193− reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
188+ reserved "case"; e <- padded expr; reserved "of"; whitespace
194189 Case e <$> (with <|> without)
195− where case_ = do p <- Pattern.expr; whitespace; arrow; whitespace
190+ where case_ = do p <- Pattern.expr
191+ padded arrow
196192 (,) p <$> expr
197193 with = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
198194 without = block (do c <- case_ ; whitespace ; return c)
@@ -229,7 +225,7 @@ makeFunction args body@(L s _) =
229225definition :: IParser (Def t v)
230226definition = withPos $ do
231227 (name:args) <- defStart
232− whitespace >> string "=" >> whitespace
228+ padded equals
233229 body <- expr
234230 return . Def name $ makeFunction args body
235231
@@ -238,7 +234,7 @@ typeAnnotation = TypeAnnotation <$> try start <*> Type.expr
238234 where
239235 start = do
240236 v <- lowVar <|> parens symOp
241− whitespace ; hasType ; whitespace
237+ padded hasType
242238 return v
243239
244240def :: IParser (Def t v)
compiler/Parse/Helpers.hs+11−2
@@ -93,6 +93,15 @@ symOp = do op <- many1 (satisfy Help.isSymbol)
9393 "\8728" -> return "."
9494 _ -> return op
9595
96+padded :: IParser a -> IParser a
97+padded p = do whitespace
98+ out <- p
99+ whitespace
100+ return out
101+
102+equals :: IParser String
103+equals = string "="
104+
96105arrow :: IParser String
97106arrow = string "->" <|> string "\8594" <?> "arrow (->)"
98107
@@ -106,7 +115,7 @@ commitIf check p = commit <|> try p
106115spaceySepBy1 :: IParser b -> IParser a -> IParser [a]
107116spaceySepBy1 sep p = do
108117 a <- p
109− (a:) <$> many (commitIf (whitespace >> sep) (whitespace >> sep >> whitespace >> p))
118+ (a:) <$> many (commitIf (whitespace >> sep) (padded sep >> p))
110119
111120
112121commaSep1 :: IParser a -> IParser [a]
@@ -154,7 +163,7 @@ betwixt a b c = do char a ; out <- c
154163 char b <?> "closing '" ++ [b] ++ "'" ; return out
155164
156165surround a z name p = do
157− char a ; whitespace ; v <- p ; whitespace
166+ char a ; v <- padded p
158167 char z <?> unwords ["closing", name, show z]
159168 return v
160169