Changeset 21929 for src/Pugs/Lexer.hs
- Timestamp:
- 08/18/08 08:49:33 (3 months ago)
- Files:
-
- 1 modified
-
src/Pugs/Lexer.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Lexer.hs
r21790 r21929 273 273 -- | Backslashed non-alphanumerics (except for @\^@) translate into themselves. 274 274 escapeCode :: RuleParser String 275 escapeCode = charNum <|> ch charEsc <|> ch charAscii <|> ch charControl <|> ch anyChar275 escapeCode = charNum <|> ch charEsc <|> ch charAscii <|> charControl <|> ch anyChar 276 276 <?> "escape code" 277 277 where 278 278 ch = fmap (:[]) 279 279 280 charControl :: RuleParser Char280 charControl :: RuleParser String 281 281 charControl = do 282 282 char 'c' 283 code <- upper <|> oneOf "@[" 283 code <- upper <|> oneOf "@[" <|> digit 284 284 case code of 285 285 '[' -> do 286 charName <- many (satisfy (/= ']'))286 charNames <- many1 (noneOf ",]") `sepBy1` many1 ruleComma 287 287 char ']' 288 case nameToCode charName of 289 Just c -> return (chr c) 290 _ -> error $ "Invalid unicode character name: " ++ charName 291 _ -> return (toEnum (fromEnum code - fromEnum '@')) 288 forM charNames $ \charName -> do 289 if all isDigit charName 290 then return $ chr (read charName) 291 else case nameToCode charName of 292 Just c -> return (chr c) 293 _ -> fail $ "Invalid unicode character name: " ++ charName 294 _ | isDigit code -> do 295 cs <- many digit 296 return [chr $ read (code:cs)] 297 _ -> return [toEnum (fromEnum code - fromEnum '@')] 292 298 293 299 -- This is currently the only escape that can return multiples. … … 302 308 , based 'o' 8 octDigit 303 309 , based 'x' 16 hexDigit 304 , based 'c' 10 digit310 -- , based 'c' 10 digit 305 311 ] 306 312 return $ map (toEnum . fromInteger) codes
