Changeset 12317 for src/Pugs/AST.hs
- Timestamp:
- 08/16/06 19:28:24 (2 years ago)
- Files:
-
- 1 modified
-
src/Pugs/AST.hs (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST.hs
r12176 r12317 31 31 import Pugs.Types 32 32 import qualified Data.Map as Map 33 import Pugs.AST.Internals.Instances 33 import qualified Data.Set as Set 34 import Pugs.AST.Internals.Instances () 34 35 import Pugs.AST.Internals 35 36 import Pugs.AST.Prag … … 100 101 (Is this correct?) 101 102 -} 102 genMultiSym :: MonadSTM m => String-> VRef -> m PadMutator103 genMultiSym :: MonadSTM m => Var -> VRef -> m PadMutator 103 104 genMultiSym name ref = do 104 105 --trace ("installing multi: " ++ name) $ return () … … 114 115 (right?), shadowing any earlier or outer definition. 115 116 -} 116 genSym :: MonadSTM m => String-> VRef -> m PadMutator117 genSym nameref = do117 genSym :: MonadSTM m => Var -> VRef -> m PadMutator 118 genSym var ref = do 118 119 --trace ("installing: " ++ name) $ return () 119 120 tvar <- liftSTM $ newTVar ref 120 121 fresh <- liftSTM $ newTVar True 121 return $ \(MkPad map) -> MkPad $ Map.insert name(MkEntry (fresh, tvar)) map122 return $ \(MkPad map) -> MkPad $ Map.insert var (MkEntry (fresh, tvar)) map 122 123 123 124 {-| … … 131 132 Pad _ _ exp -> isScalarLValue exp 132 133 Sym _ _ exp -> isScalarLValue exp 133 Var ('$':_)-> True134 Var var | SScalar <- v_sigil var -> True 134 135 Syn "${}" _ -> True -- XXX - Change tp App("&prefix:<$>") later 135 136 Syn "$::()" _ -> True … … 141 142 where 142 143 isSIMPLE x = case unwrap x of 143 App (Var ('&':'p':'r':'e':'f':'i':'x':':':op)) Nothing [y] 144 -> op `elem` coercePrefixOps || (op `elem` simplePrefixOps && isSIMPLE y) 145 App (Var ('&':'p':'r':'e':'f':'i':'x':':':op)) (Just y) [] 146 -> op `elem` coercePrefixOps || (op `elem` simplePrefixOps && isSIMPLE y) 147 App (Var ('&':'p':'o':'s':'t':'f':'i':'x':':':op)) Nothing [y] 148 -> op `elem` simplePostfixOps && isSIMPLE y 149 App (Var ('&':'p':'o':'s':'t':'f':'i':'x':':':op)) (Just y) [] 150 -> op `elem` simplePostfixOps && isSIMPLE y 151 App (Var ('&':'i':'n':'f':'i':'x':':':op)) Nothing [y, z] 152 -> op `elem` simpleInfixOps && isSIMPLE y && isSIMPLE z 153 App (Var ('&':'i':'n':'f':'i':'x':':':op)) (Just y) [z] 154 -> op `elem` simpleInfixOps && isSIMPLE y && isSIMPLE z 144 App (Var var) Nothing [y] 145 | C_prefix <- v_categ var 146 -> var `Set.member` coercePrefixOps 147 || (var `Set.member` simplePrefixOps && isSIMPLE y) 148 | C_postfix <- v_categ var 149 -> var `Set.member` simplePostfixOps && isSIMPLE y 150 App (Var var) (Just y) [] 151 | C_prefix <- v_categ var 152 -> var `Set.member` coercePrefixOps 153 || (var `Set.member` simplePrefixOps && isSIMPLE y) 154 | C_postfix <- v_categ var 155 -> var `Set.member` simplePostfixOps && isSIMPLE y 156 App (Var var) Nothing [x, y] 157 | C_infix <- v_categ var 158 -> var `Set.member` simpleInfixOps && isSIMPLE x && isSIMPLE y 159 App (Var var) (Just x) [y] 160 | C_infix <- v_categ var 161 -> var `Set.member` simpleInfixOps && isSIMPLE x && isSIMPLE y 155 162 _ -> isScalarLValue x 156 coercePrefixOps = 157 [ "!","+","-","~","?","$" ] 158 simplePrefixOps = 159 [ "++","--" 160 , "$","&","+^","~^","?^","\\","^","=" 161 ] 162 simplePostfixOps = ["++", "--"] 163 simpleInfixOps = 164 [ "**" 165 , "**=" 166 , "*","/","%","x","+&","+<","+>","~&","~<","~>" 167 , "*=","/=","%=","x=","+&=","+<=","+>=","~&=","~<=","~>=" 168 , "+","-","~","+|","+^","~|","~^" 169 , "+=","-=","~=","+|=","+^=","~|=","~^=" 170 ] 163 164 opSet :: VarCateg -> [String] -> Set Var 165 opSet cat posts = Set.fromList $ map doMakeVar posts 166 where 167 doMakeVar name = MkVar 168 { v_sigil = SCode 169 , v_twigil = TNone 170 , v_package = emptyPkg 171 , v_categ = cat 172 , v_name = cast name 173 } 174 175 coercePrefixOps, simplePrefixOps, simplePostfixOps, simpleInfixOps :: Set Var 176 coercePrefixOps = opSet C_prefix [ "!","+","-","~","?","$" ] 177 simplePrefixOps = opSet C_prefix 178 [ "++","--" 179 , "$","&","+^","~^","?^","\\","^","=" 180 ] 181 simplePostfixOps = opSet C_postfix ["++", "--"] 182 simpleInfixOps = opSet C_infix 183 [ "**" 184 , "**=" 185 , "*","/","%","x","+&","+<","+>","~&","~<","~>" 186 , "*=","/=","%=","x=","+&=","+<=","+>=","~&=","~<=","~>=" 187 , "+","-","~","+|","+^","~|","~^" 188 , "+=","-=","~=","+|=","+^=","~|=","~^=" 189 ] 190 191 171 192 172 193 … … 181 202 Syn "namespace" [kind, pkg, y] 182 203 mergeStmts x@(Ann ann (Syn syn _)) y | (syn ==) `any` words "subst match //" = 183 mergeStmts (Ann ann (App ( Var "&infix:~~") Nothing [Var "$_", x])) y204 mergeStmts (Ann ann (App (_Var "&infix:~~") Nothing [_Var "$_", x])) y 184 205 mergeStmts x y@(Ann ann (Syn syn _)) | (syn ==) `any` words "subst match //" = 185 mergeStmts x (Ann ann (App ( Var "&infix:~~") Nothing [Var "$_", y]))206 mergeStmts x (Ann ann (App (_Var "&infix:~~") Nothing [_Var "$_", y])) 186 207 mergeStmts (Ann ann (Syn "sub" [Val (VCode sub)])) y | subType sub == SubBlock = 187 208 -- bare Block in statement level; annul all its parameters and run it! … … 196 217 isEmptyParams :: [Param] -> Bool 197 218 isEmptyParams [] = True 198 isEmptyParams [x] | [_, '_'] <- paramName x = True 219 isEmptyParams [x] 220 | var <- paramName x 221 , _underscore == v_name var 222 , emptyPkg == v_package var 223 , TNone == v_twigil var 224 = True 199 225 isEmptyParams _ = False 226 227 _underscore :: ID 228 _underscore = cast "_" 200 229 201 230 newPackage :: String -> String -> [String] -> [String] -> Exp 202 231 newPackage cls name classes roles = Stmts metaObj (newType name) 203 232 where 204 metaObj = Sym SGlobal (':':'*':name) $! Syn ":="205 [ Var (':':'*':name)206 , App ( Var "&META::new")233 metaObj = _Sym SGlobal (':':'*':name) $! Syn ":=" 234 [ _Var (':':'*':name) 235 , App (_Var "&META::new") 207 236 (Just $ Val (VType $ mkType cls)) 208 237 [ Syn "named" … … 222 251 223 252 newType :: String -> Exp 224 newType name = Sym SGlobal ('&':'&':'*':name) $! Syn ":="225 [ Var ('&':'*':name)253 newType name = _Sym SGlobal ('&':'&':'*':name) $! Syn ":=" 254 [ _Var ('&':'*':name) 226 255 , typeMacro name (Val . VType . mkType $ name) 227 256 ] 228 257 229 258 newMetaType :: String -> Exp 230 newMetaType name = Sym SGlobal ('&':'&':'*':name) $! Syn ":="231 [ Var ('&':'*':name)232 , typeMacro name ( Var (':':'*':name))259 newMetaType name = _Sym SGlobal ('&':'&':'*':name) $! Syn ":=" 260 [ _Var ('&':'*':name) 261 , typeMacro name (_Var (':':'*':name)) 233 262 ] 234 263 … … 236 265 typeMacro name exp = Syn "sub" . (:[]) . Val . VCode $ MkCode 237 266 { isMulti = True 238 , subName = name267 , subName = cast ('&':name) 239 268 , subEnv = Nothing 240 269 , subType = SubMacro … … 259 288 fmap (MkPad . Map.fromAscList . catMaybes) . mapM checkPrim $ Map.toAscList pad 260 289 261 checkPrim :: (String, PadEntry) -> Eval (Maybe (String, PadEntry)) 262 checkPrim ((':':'*':_), _) = return Nothing 263 checkPrim e@((_, MkEntry (_, tv))) = do 264 rv <- isPrim tv 265 return $ if rv then Nothing else Just e 266 checkPrim (key, MkEntryMulti xs) = do 267 xs' <- filterM (fmap not . isPrim . snd) xs 268 return $ if null xs' then Nothing else Just (key, MkEntryMulti xs') 290 checkPrim :: (Var, PadEntry) -> Eval (Maybe (Var, PadEntry)) 291 checkPrim e@(var, entry) 292 | SType <- v_sigil var, isGlobalVar var = return Nothing 293 | MkEntry (_, tv) <- entry = do 294 rv <- isPrim tv 295 return $ if rv then Nothing else Just e 296 | otherwise = do 297 let MkEntryMulti xs = entry 298 xs' <- filterM (fmap not . isPrim . snd) xs 299 return $ if null xs' then Nothing else Just (var, MkEntryMulti xs') 269 300 270 301 isPrim :: TVar VRef -> Eval Bool … … 282 313 filterUserDefinedPad (MkPad pad) = MkPad $ Map.filterWithKey doFilter pad 283 314 where 284 doFilter key _ = not (key `elem` reserved) 285 reserved = words $ 286 "@*ARGS @*INC %*INC $*PUGS_HAS_HSPLUGINS $*EXECUTABLE_NAME " ++ 287 "$*PROGRAM_NAME $*PID $*UID $*EUID $*GID $*EGID @*CHECK @*INIT $*IN " ++ 288 "$*OUT $*ERR $*ARGS $/ %*ENV $*CWD @=POD $=POD $?PUGS_VERSION " ++ 289 "$*OS &?BLOCK_EXIT %?CONFIG $*_ $*AUTOLOAD" 290 315 doFilter key _ = key `Set.notMember` _reserved 316 317 _reserved :: Set Var 318 _reserved = Set.fromList . cast . words $ 319 "@*ARGS @*INC %*INC $*PUGS_HAS_HSPLUGINS $*EXECUTABLE_NAME " ++ 320 "$*PROGRAM_NAME $*PID $*UID $*EUID $*GID $*EGID @*CHECK @*INIT $*IN " ++ 321 "$*OUT $*ERR $*ARGS $/ %*ENV $*CWD @=POD $=POD $?PUGS_VERSION " ++ 322 "$*OS &?BLOCK_EXIT %?CONFIG $*_ $*AUTOLOAD"
