on master help sign in
Better error when bad backslashing is used in strings
07187bdEvan Czaplicki
compiler/Parse/Helpers.hs+10−2
@@ -14,6 +14,7 @@ import SourceSyntax.PrettyPrint
14import SourceSyntax.Declaration (Assoc)
14import SourceSyntax.Declaration (Assoc)
15import Text.Parsec hiding (newline,spaces,State)
15import Text.Parsec hiding (newline,spaces,State)
16import Text.Parsec.Indent
16import Text.Parsec.Indent
17+import Text.Read (readMaybe)
17
18
18reserveds = [ "if", "then", "else"
19reserveds = [ "if", "then", "else"
19 , "case", "of"
20 , "case", "of"
@@ -50,8 +51,15 @@ iParseWithTable sourceName table aParser input =
50 runIndent sourceName $ runParserT aParser table sourceName input
51 runIndent sourceName $ runParserT aParser table sourceName input
51
52
52backslashed :: IParser Char
53backslashed :: IParser Char
53−backslashed = do { char '\\'; c <- anyChar
54+backslashed = do
55+ char '\\'
56+ c <- anyChar
57+ case readMaybe ['\'','\\',c,'\''] of
54− ; return . read $ ['\'','\\',c,'\''] }
58+ Just chr -> return chr
59+ Nothing ->
60+ fail $ "Did not recognize character '\\" ++ [c] ++
61+ "'. If the backslash is meant to be a character of its own, " ++
62+ "it should be escaped like this: \"\\\\" ++ [c] ++ "\""
55
63
56var :: IParser String
64var :: IParser String
57var = makeVar (letter <|> char '_' <?> "variable")
65var = makeVar (letter <|> char '_' <?> "variable")