Changeset 7035
- Timestamp:
- 09/17/05 22:55:58 (3 years ago)
- Files:
-
- 4 added
- 6 modified
-
src/Pugs/AST.hs (modified) (2 diffs)
-
src/Pugs/AST/Internals.hs (modified) (6 diffs)
-
src/Pugs/AST/Prag.hs (added)
-
src/Pugs/Eval.hs (modified) (4 diffs)
-
src/Pugs/Monads.hs (modified) (1 diff)
-
src/Pugs/Parser.hs (modified) (1 diff)
-
src/Pugs/Prim.hs (modified) (3 diffs)
-
t/packages/lexical_pragmas.t (added)
-
t/packages/pragma (added)
-
t/packages/pragma/Demo.pm (added)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST.hs
r6594 r7035 21 21 22 22 module Pugs.AST.Internals, 23 module Pugs.AST.Prag, 23 24 module Pugs.AST.Pos, 24 25 module Pugs.AST.Scope, … … 31 32 32 33 import Pugs.AST.Internals 34 import Pugs.AST.Prag 33 35 import Pugs.AST.Pos 34 36 import Pugs.AST.Scope -
src/Pugs/AST/Internals.hs
r6934 r7035 9 9 Val(..), -- uses V.* (which ones?) 10 10 Value(..), -- uses Val, Eval 11 InitDat(..), 11 12 12 13 EvalT(..), ContT(..), … … 79 80 80 81 import Pugs.Parser.Number 82 import Pugs.AST.Prag 81 83 import Pugs.AST.Pos 82 84 import Pugs.AST.Scope … … 862 864 | Cxt !Cxt !Exp -- ^ Context 863 865 | Pos !Pos !Exp -- ^ Position 866 | Prag !Pragmas !Exp -- ^ Lexical pragmas 864 867 | Pad !Scope !Pad !Exp -- ^ Lexical pad 865 868 | Sym !Scope !Var !Exp -- ^ Symbol declaration … … 904 907 unwrap (Cxt _ exp) = unwrap exp 905 908 unwrap (Pos _ exp) = unwrap exp 909 unwrap (Prag _ exp) = unwrap exp 906 910 unwrap (Pad _ _ exp) = unwrap exp 907 911 unwrap (Sym _ _ exp) = unwrap exp … … 954 958 | otherwise 955 959 = (Var name, vs) 960 extract (Prag prag ex) vs = ((Prag prag ex'), vs') 961 where 962 (ex', vs') = extract ex vs 956 963 extract (Pos pos ex) vs = ((Pos pos ex'), vs') 957 964 where … … 1043 1050 , envDebug :: !DebugInfo -- ^ Debug info map 1044 1051 , envPos :: !Pos -- ^ Source position range 1052 , envPragmas :: !Pragmas -- ^ List of pragmas in effect 1053 , envInitDat :: !(TVar InitDat) -- ^ BEGIN result information 1054 } deriving (Show, Eq, Ord, Typeable) 1055 1056 {-| 1057 Module initialization information. 1058 1059 When a module is loaded and initialized (i.e., its &import routine is 1060 called), it may need to communicate information back to the parser. 1061 This information is held in a TVar to which the parser has access. 1062 Currently we use this for keeping track of lexical pragma change 1063 requests, but the possiblyExit mechanism may be refactored to use 1064 this as well. 1065 -} 1066 data InitDat = MkInitDat 1067 { initPragmas :: [Pragma] -- ^ Pragma values being installed 1045 1068 } deriving (Show, Eq, Ord, Typeable) 1046 1069 -
src/Pugs/Eval.hs
r6918 r7035 61 61 syms <- initSyms 62 62 glob <- newTVar (combine (pad ++ syms) $ mkPad []) 63 init <- newTVar $ MkInitDat { initPragmas=[] } 63 64 return $ MkEnv 64 65 { envContext = CxtVoid … … 77 78 , envDebug = Just ref -- Set to "Nothing" to disable debugging 78 79 , envPos = MkPos name 1 1 1 1 80 , envPragmas = PrNil 81 , envInitDat = init 79 82 } 80 83 … … 229 232 reduce (Stmts this rest) = reduceStmts this rest 230 233 234 reduce (Prag prag exp) = reducePrag prag exp 235 231 236 reduce (Pos pos exp) = reducePos pos exp 232 237 … … 283 288 return . VControl $ ControlEnv env 284 289 _ -> reduce rest 290 291 reducePrag :: Pragmas -> Exp -> Eval Val 292 reducePrag prag exp = do 293 local (\e -> e{ envPragmas = prag }) $ do 294 evalExp exp 285 295 286 296 {-| -
src/Pugs/Monads.hs
r6672 r7035 71 71 72 72 {-| 73 Evaluate the specified wxpression in the specified (Perl 6) context ('Cxt').73 Evaluate the specified expression in the specified (Perl 6) context ('Cxt'). 74 74 75 75 (Subsequent chained 'Eval's do /not/ see this new scope.) -
src/Pugs/Parser.hs
r7033 r7035 898 898 "BEGIN" -> do 899 899 -- We've to exit if the user has written code like BEGIN { exit }. 900 possiblyExit =<< unsafeEvalExp (checkForIOLeak fun) 900 val <- possiblyExit =<< unsafeEvalExp (checkForIOLeak fun) 901 -- And install any pragmas they've requested. 902 env <- getRuleEnv 903 let idat = unsafePerformIO $ liftSTM $ readTVar $ envInitDat env 904 install $ initPragmas idat 905 return val 901 906 "CHECK" -> vcode2checkBlock code 902 907 "INIT" -> vcode2initBlock code 903 908 "FIRST" -> vcode2firstBlock code 904 909 _ -> fail "" 910 where 911 install [] = return () 912 install (x:xs) = do 913 env' <- getRuleEnv 914 let env'' = envCaller env' -- not sure about this. 915 case env'' of 916 Just target -> do 917 putRuleEnv target { envPragmas = 918 PrPrags{ pragma = x 919 , pragmas = envPragmas target} } 920 install xs 921 _ -> fail "no caller env to install pragma in" 905 922 906 923 {-| Wraps a call to @&Pugs::Internals::check_for_io_leak@ around the input -
src/Pugs/Prim.hs
r6918 r7035 598 598 VRule MkRulePCRE{rxAdverbs=hash} -> return hash 599 599 _ -> fail $ "Not a rule: " ++ show v 600 op1 "Pugs::Internals::current_pragma_value" = \v -> do 601 name <- fromVal v 602 prags <- asks envPragmas 603 return $ findPrag name prags 604 where 605 findPrag :: String -> Pragmas -> Val 606 findPrag _ PrNil = VUndef 607 findPrag n PrPrags {pragma=this, pragmas=rest} 608 | n == pragName this = VInt $ toInteger $ pragDat this 609 | otherwise = findPrag n rest 610 op1 "Pugs::Internals::caller_pragma_value" = \v -> do 611 caller <- asks envCaller 612 case caller of 613 Just env -> local (const env) (op1 "Pugs::Internals::current_pragma_value" v) 614 _ -> return $ VUndef 600 615 op1 other = \_ -> fail ("Unimplemented unaryOp: " ++ other) 601 616 … … 927 942 op2 "IO::print" = op2Print hPutStr 928 943 op2 "BUILDALL" = op1WalkAll reverse "BUILD" 944 op2 "Pugs::Internals::install_pragma_value" = \x y -> do 945 name <- fromVal x 946 val <- fromVal y 947 idat <- asks envInitDat 948 idatval <- liftSTM $ readTVar idat 949 trace ("installing " ++ name ++ "/" ++ (show val)) $ return () 950 let prag = initPragmas idatval 951 liftSTM $ writeTVar idat idatval{initPragmas = 952 prag ++ [MkPrag{ pragName=name, pragDat=val }]} 953 return (VBool True) 929 954 op2 other = \_ _ -> fail ("Unimplemented binaryOp: " ++ other) 930 955 … … 1678 1703 \\n Str pre Pugs::Internals::rule_pattern safe (Pugs::Internals::VRule)\ 1679 1704 \\n Hash pre Pugs::Internals::rule_adverbs safe (Pugs::Internals::VRule)\ 1705 \\n Int pre Pugs::Internals::install_pragma_value safe (Str, Int)\ 1706 \\n Bool pre Pugs::Internals::current_pragma_value safe (Str)\ 1707 \\n Bool pre Pugs::Internals::caller_pragma_value safe (Str)\ 1680 1708 \\n"
