on master help sign in
Fix issue #397. Core issue was that scanning for infix declarations was not clever about strings.
34913d5Evan Czaplicki
compiler/Parse/Helpers.hs+21−2
@@ -274,7 +274,8 @@ ignoreUntil :: IParser a -> IParser (Maybe a)
274ignoreUntil end = go
274ignoreUntil end = go
275 where
275 where
276 ignore p = const () <$> p
276 ignore p = const () <$> p
277− filler = choice [ ignore multiComment
277+ filler = choice [ ignore str
278+ , ignore multiComment
278 , ignore (markdown (\_ _ -> mzero))
279 , ignore (markdown (\_ _ -> mzero))
279 , ignore anyChar
280 , ignore anyChar
280 ]
281 ]
@@ -317,4 +318,22 @@ markdown interpolation = try (string "[markdown|") >> closeMarkdown "" []
317 , uncurry closeMarkdown =<< interpolation md stuff
318 , uncurry closeMarkdown =<< interpolation md stuff
318 , do c <- anyChar
319 , do c <- anyChar
319 closeMarkdown (md ++ [c]) stuff
320 closeMarkdown (md ++ [c]) stuff
320− ]
321+ ]
322+
323+str :: IParser String
324+str = choice [ quote >> dewindows <$> manyTill (backslashed <|> anyChar) quote
325+ , liftM dewindows . expecting "string" . betwixt '"' '"' . many $
326+ backslashed <|> satisfy (/='"')
327+ ]
328+ where
329+ quote = try (string "\"\"\"")
330+
331+ -- Remove \r from strings to fix generated JavaScript
332+ dewindows [] = []
333+ dewindows cs =
334+ let (pre, suf) = break (`elem` ['\r','\n']) cs
335+ in pre ++ case suf of
336+ ('\r':'\n':rest) -> '\n' : dewindows rest
337+ ('\n':rest) -> '\n' : dewindows rest
338+ ('\r':rest) -> '\n' : dewindows rest
339+ _ -> []
compiler/Parse/Literal.hs+2−21
@@ -8,7 +8,7 @@ import Text.Parsec.Indent
8import Parse.Helpers
8import Parse.Helpers
9import SourceSyntax.Literal
9import SourceSyntax.Literal
10
10
11−literal = num <|> str <|> chr
11+literal = num <|> (Str <$> str) <|> chr
12
12
13num :: IParser Literal
13num :: IParser Literal
14num = fmap toLit (preNum <?> "number")
14num = fmap toLit (preNum <?> "number")
@@ -24,23 +24,4 @@ num = fmap toLit (preNum <?> "number")
24
24
25chr :: IParser Literal
25chr :: IParser Literal
26chr = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))
26chr = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))
27− <?> "character"
27+ <?> "character"
28−
29−str :: IParser Literal
30−str = choice [ quote >> str <$> manyTill (backslashed <|> anyChar) quote
31− , liftM Str . expecting "string" . betwixt '"' '"' . many $
32− backslashed <|> satisfy (/='"')
33− ]
34− where
35− quote = try (string "\"\"\"")
36− str = Str . dewindows
37−
38− -- Remove \r from strings to fix generated JavaScript
39− dewindows [] = []
40− dewindows cs =
41− let (pre, suf) = break (`elem` ['\r','\n']) cs
42− in pre ++ case suf of
43− ('\r':'\n':rest) -> '\n' : dewindows rest
44− ('\n':rest) -> '\n' : dewindows rest
45− ('\r':rest) -> '\n' : dewindows rest
46− _ -> []