Changeset 6359 for src/Pugs/Lexer.hs
- Timestamp:
- 08/19/05 13:37:26 (3 years ago)
- svk:copy_cache_prev:
- 8581
- Files:
-
- 1 modified
-
src/Pugs/Lexer.hs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Lexer.hs
r6187 r6359 136 136 aheadSym x y = y `elem` ";!" || x /= y 137 137 138 interpolatingStringLiteral :: RuleParser String -- ^ Opening delimiter139 -> RuleParser String-- ^ Closing delimiter140 -> RuleParser Exp-- ^ Interpolator141 -> RuleParser Exp-- ^ Entire string142 -- ^(without delims)138 interpolatingStringLiteral :: RuleParser String -- ^ Opening delimiter 139 -> RuleParser String -- ^ Closing delimiter 140 -> RuleParser Exp -- ^ Interpolator 141 -> RuleParser Exp -- ^ Entire string 142 -- (without delims) 143 143 interpolatingStringLiteral startrule endrule interpolator = do 144 144 list <- stringList 0 … … 154 154 155 155 stringList :: Int -> RuleParser [Exp] 156 stringList i = try (do 157 parse <- interpolator 158 rest <- stringList i 159 return (parse:rest)) 160 <|> try (do 161 ch <- endrule 162 if i == 0 then return [] 163 else do rest <- stringList (i-1) 164 return (Val (VStr ch):rest)) 165 <|> try (do 166 ch <- startrule 167 rest <- stringList (i+1) 168 return (Val (VStr ch):rest)) 169 <|> do 170 char <- anyChar 171 rest <- stringList i 172 return (Val (VStr [char]):rest) 173 174 -- | backslahed nonalphanumerics (except for \^) translate into themselves 156 stringList i = tryChoice 157 [ do 158 parse <- interpolator 159 rest <- stringList i 160 return (parse:rest) 161 , do 162 ch <- endrule 163 if i == 0 164 then return [] 165 else do 166 rest <- stringList (i-1) 167 return (Val (VStr ch):rest) 168 , do 169 ch <- startrule 170 rest <- stringList (i+1) 171 return (Val (VStr ch):rest) 172 , do 173 char <- anyChar 174 rest <- stringList i 175 return (Val (VStr [char]):rest) 176 ] 177 178 -- | Backslashed non-alphanumerics (except for @\^@) translate into themselves. 175 179 escapeCode :: GenParser Char st Char 176 180 escapeCode = charEsc <|> charNum <|> charAscii <|> charControl <|> anyChar … … 306 310 return (lead:rest) 307 311 308 tryChoice :: [GenParser tok st a] -> GenParser tok st a 312 {-| 313 Attempt each of the given parsers in turn until one succeeds, but if one of 314 them fails we backtrack (i.e. retroactively consume no input) before trying 315 the next one. 316 -} 317 tryChoice :: [GenParser tok st a] -- ^ List of candidate parsers 318 -> GenParser tok st a 309 319 tryChoice = choice . map try 310 320 321 {-| 322 Match '@(@', followed by the given parser, followed by '@)@'. 323 -} 311 324 verbatimParens :: GenParser Char st a -> GenParser Char st a 312 325 verbatimParens = between (lexeme $ char '(') (char ')') 313 326 327 {-| 328 Match '@\[@', followed by the given parser, followed by '@\]@'. 329 -} 314 330 verbatimBrackets :: GenParser Char st a -> GenParser Char st a 315 331 verbatimBrackets = between (lexeme $ char '[') (char ']') 316 332 333 {-| 334 Match '@{@', followed by the given parser, followed by '@}@'. 335 -} 317 336 verbatimBraces :: GenParser Char st a -> GenParser Char st a 318 337 verbatimBraces = between (lexeme $ char '{') (char '}')
