Changeset 6359
- Timestamp:
- 08/19/05 13:37:26 (3 years ago)
- svk:copy_cache_prev:
- 8581
- Location:
- src
- Files:
-
- 3 modified
-
DrIFT/Binary.hs (modified) (4 diffs)
-
Pugs/Lexer.hs (modified) (3 diffs)
-
Pugs/Parser/Types.hs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/DrIFT/Binary.hs
r6257 r6359 108 108 -} 109 109 110 -- #define SIZEOF_HSINT 4110 -- #define SIZEOF_HSINT 4 111 111 112 112 type BinArray = IOUArray Int Word8 … … 401 401 402 402 instance Binary Int where 403 -- #if SIZEOF_HSINT == 4403 -- #if SIZEOF_HSINT == 4 404 404 put_ bh i = put_ bh (fromIntegral i :: Int32) 405 405 get bh = do 406 406 x <- get bh 407 407 return $! (fromIntegral (x :: Int32)) 408 -- #elif SIZEOF_HSINT == 8408 -- #elif SIZEOF_HSINT == 8 409 409 -- put_ bh i = put_ bh (fromIntegral i :: Int64) 410 410 -- get bh = do 411 411 -- x <- get bh 412 412 -- return $! (fromIntegral (x :: Int64)) 413 -- #else414 -- #error "unsupported sizeof(HsInt)"415 -- #endif413 -- #else 414 -- #error "unsupported sizeof(HsInt)" 415 -- #endif 416 416 417 417 instance Binary ClockTime where … … 559 559 560 560 -} 561 -- #ifdef __GLASGOW_HASKELL__561 -- #ifdef __GLASGOW_HASKELL__ 562 562 563 563 instance Binary Integer where … … 625 625 put_ bh (a :% b) = do put_ bh a; put_ bh b 626 626 get bh = do a <- get bh; b <- get bh; return (a :% b) 627 -- #endif627 -- #endif 628 628 629 629 instance Binary (Bin a) where -
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 '}') -
src/Pugs/Parser/Types.hs
r4422 r6359 13 13 import Pugs.Internals 14 14 15 {-| 16 Cache holding dynamically-generated parsers for user-defined operators. This 17 means we don't have to rebuild them for each token. 18 19 The cache is generated inside 'Pugs.Parser.parseOpWith'. 20 It is cleared each time we do compile-time evaluation with 21 'Pugs.Parser.Unsafe.unsafeEvalExp', by calling 'clearDynParsers'. 22 23 Stored inside 'RuleState', the state component of 'RuleParser'. 24 -} 15 25 data DynParsers = MkDynParsersEmpty | MkDynParsers 16 26 { dynParseOp :: !(RuleParser Exp) … … 19 29 } 20 30 31 {-| 32 State object that gets passed around during the parsing process. 33 -} 21 34 data RuleState = MkRuleState 22 35 { ruleEnv :: !Env 23 , ruleDynParsers :: !DynParsers 36 , ruleDynParsers :: !DynParsers -- ^ Cache for dynamically-generated 37 -- parsers 24 38 } 25 39 40 {-| 41 A parser that operates on @Char@s, and maintains state in a 'RuleState'. 42 -} 26 43 type RuleParser a = GenParser Char RuleState a 44 27 45 data ParensOption = ParensMandatory | ParensOptional 28 46 deriving (Show, Eq) … … 35 53 type RuleOperatorTable a = OperatorTable Char RuleState a 36 54 55 {-| 56 Retrieve the 'Pugs.AST.Internals.Env' from the current state of the parser. 57 -} 37 58 getRuleEnv :: RuleParser Env 38 59 getRuleEnv = gets ruleEnv 39 60 61 {-| 62 Update the 'Pugs.AST.Internals.Env' in the parser's state by applying a transformation function. 63 -} 40 64 modifyRuleEnv :: (MonadState RuleState m) => (Env -> Env) -> m () 41 65 modifyRuleEnv f = modify $ \state -> state{ ruleEnv = f (ruleEnv state) } 42 66 67 {-| 68 Replace the 'Pugs.AST.Internals.Env' in the parser's state with a new one. 69 -} 43 70 putRuleEnv :: Env -> RuleParser () 44 71 putRuleEnv = modifyRuleEnv . const 45 72 73 {-| 74 Clear the parser's cache of dynamically-generated parsers for user-defined 75 operators. 76 77 These will be re-generated by 'Pugs.Parser.parseOpWith' when needed. 78 -} 46 79 clearDynParsers :: RuleParser () 47 80 clearDynParsers = modify $ \state -> state{ ruleDynParsers = MkDynParsersEmpty }
