Changeset 5169
- Timestamp:
- 07/04/05 00:35:58 (4 years ago)
- svk:copy_cache_prev:
- 6965
- Location:
- src/Pugs
- Files:
-
- 4 modified
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST.hs
r4155 r5169 124 124 mergeStmts (Sym scope name x) y = Sym scope name (mergeStmts x y) 125 125 mergeStmts (Pad scope lex x) y = Pad scope lex (mergeStmts x y) 126 mergeStmts (Syn "package" [pkg@(Val (VStr _))]) y = 127 Syn "namespace" [pkg, y] 126 128 mergeStmts x@(Pos pos (Syn syn _)) y | (syn ==) `any` words "subst match //" = 127 129 mergeStmts (Pos pos (App (Var "&infix:~~") Nothing [Var "$_", x])) y -
src/Pugs/Eval.hs
r5126 r5169 105 105 evaluateMain exp = do 106 106 -- S04: INIT {...}* at run time, ASAP 107 initAV <- evalVar "@ ?INIT"107 initAV <- evalVar "@*INIT" 108 108 initSubs <- fromVals initAV 109 109 enterContext CxtVoid $ do … … 246 246 case v of 247 247 Just var -> evalRef var 248 _ | (':':rest) <- name -> return $ VType (mkType rest) 249 _ -> retError "Undeclared variable" name 248 _ -> case name of 249 (':':rest) -> return $ VType (mkType rest) 250 (_:'*':_) -> evalExp (Sym SGlobal name (Var name)) 251 _ -> case isQualified name of 252 Just _ -> evalExp (Sym SGlobal name (Var name)) 253 _ -> retError "Undeclared variable" name 250 254 251 255 reduceStmts :: Exp -> Exp -> Eval Val … … 303 307 304 308 reduceSym _ name exp = do 305 ref <- newObject (typeOfSigil $ head name) 306 sym <- case name of 307 ('&':_) -> genMultiSym name ref 308 _ -> genSym name ref 309 ref <- newObject (typeOfSigil $ head name) 310 name' <- toQualified name 311 sym <- case name' of 312 ('&':_) -> genMultiSym name' ref 313 _ -> genSym name' ref 309 314 addGlobalSym sym 310 315 evalExp exp … … 648 653 retEmpty 649 654 650 reduceSyn " package" [exp] = do655 reduceSyn "namespace" [exp, body] = do 651 656 val <- evalExp exp 652 657 writeVar "$*PACKAGE" val 653 retEmpty 654 655 reduceSyn "module" [exp] = do 656 val <- evalExp exp 657 writeVar "$?MODULE" val 658 writeVar "$*PACKAGE" val 659 retEmpty 658 str <- fromVal val 659 enterPackage str $ evalExp body 660 660 661 661 reduceSyn "inline" [langExp, _] = do … … 664 664 when (lang /= "Haskell") $ 665 665 retError "Inline: Unknown language" langVal 666 modVal <- readVar "$ ?MODULE"666 modVal <- readVar "$*PACKAGE" 667 667 mod <- fromVal modVal 668 668 #ifndef HADDOCK … … 985 985 "Hash" -> fmap (VRef . hashRef) (fromVal v :: Eval VHash) 986 986 "Array" -> fmap (VRef . arrayRef) (fromVal v :: Eval VArray) 987 _ -> return (VRef $ scalarRef v) 987 _ -> case v of 988 VRef (MkRef (IScalar _)) -> return (VRef $ scalarRef v) 989 VRef _ -> return v -- XXX - preserving ref 990 _ -> return (VRef $ scalarRef v) 988 991 (False, False) -> return v -- XXX reduce to val? 989 992 (False, True) -> do -
src/Pugs/Parser.hs
r5117 r5169 296 296 let subExp = Val . VCode $ MkCode 297 297 { isMulti = isMulti 298 , subName = name '298 , subName = nameQualified 299 299 , subEnv = Just env 300 300 , subType = if "primitive" `elem` traits … … 311 311 } 312 312 pkg = envPackage env 313 name' | ':' `elem` name = name 314 | scope <= SMy = name 315 | otherwise = (head name:pkg) ++ "::" ++ tail name 313 nameQualified | ':' `elem` name = name 314 | scope <= SMy = name 315 | isBuiltin = (head name:'*':tail name) 316 | otherwise = (head name:pkg) ++ "::" ++ tail name 316 317 self :: [Param] 317 318 self | styp > SubMethod = [] 318 319 | (prm:_) <- params, isInvocant prm = [] 319 320 | otherwise = [selfParam $ envPackage env] 320 exp = Syn ":=" [Var name, Syn "sub" [subExp]] 321 exp' = Syn ":=" [Var name', Syn "sub" [subExp]] 322 isExported = (pkg == "main" || "export" `elem` traits) 321 mkExp n = Syn ":=" [Var n, Syn "sub" [subExp]] 322 mkSym n = Sym scope n (mkExp n) 323 isExported = ("export" `elem` traits) 324 isBuiltin = ("builtin" `elem` traits) 323 325 -- Don't add the sub if it's unsafe and we're in safemode. 324 if "unsafe" `elem` traits && safeMode 325 then return emptyExp 326 else case scope of 327 -- XXX FIXME - the "main" here is a horrible hack 328 SGlobal | name' /= name && isExported -> do 329 unsafeEvalExp (Sym scope name exp) 330 unsafeEvalExp (Sym scope name' exp') 331 return emptyExp 332 SGlobal -> do 333 unsafeEvalExp (Sym scope name' exp') 334 return emptyExp 335 _ -> do 336 lexDiff <- unsafeEvalLexDiff (Sym scope name' emptyExp) 337 return $ Pad scope lexDiff exp 326 if "unsafe" `elem` traits && safeMode then return emptyExp else case scope of 327 SGlobal | isExported -> do 328 let caller = maybe "main" envPackage (envCaller env) 329 nameExported = (head name:caller) ++ "::" ++ tail name 330 unsafeEvalExp $ mkSym nameExported 331 unsafeEvalExp $ mkSym nameQualified 332 return emptyExp 333 SGlobal -> do 334 unsafeEvalExp $ mkSym nameQualified 335 return emptyExp 336 _ -> do 337 lexDiff <- unsafeEvalLexDiff $ mkSym nameQualified 338 return $ Pad scope lexDiff $ mkExp name 338 339 339 340 -- | A Param representing the default (unnamed) invocant of a method on the given type. … … 574 575 ruleModuleDeclaration = rule "module declaration" $ do 575 576 _ <- choice $ map symbol (words "package module class grammar") 576 (name, v, a) <- rulePackageHead577 (name, _, _) <- rulePackageHead 577 578 env <- getRuleEnv 578 579 putRuleEnv env{ envPackage = name, envClasses = envClasses env `addNode` mkType name } 579 580 body <- option emptyExp $ between (symbol "{") (char '}') ruleBlockBody 580 let moduleDef = Syn "module" [Val . VStr $ name ++ v ++ a] -- XXX581 let pkgVal = Val . VStr $ name -- ++ v ++ a 581 582 case body of 582 Noop -> return moduleDef583 Noop -> return $ Syn "package" [pkgVal] 583 584 _ -> do 584 585 env' <- getRuleEnv 585 586 putRuleEnv env'{ envPackage = envPackage env } 586 return $ S tmts moduleDef body587 return $ Syn "namespace" [pkgVal, body] 587 588 588 589 ruleDoBlock :: RuleParser Exp -
src/Pugs/Parser/Program.hs
r4422 r5169 43 43 eof 44 44 -- S04: CHECK {...}* at compile time, ALAP 45 -- $_() for @ ?CHECK45 -- $_() for @*CHECK 46 46 rv <- unsafeEvalExp $ Syn "for" 47 [ Var "@ ?CHECK"47 [ Var "@*CHECK" 48 48 , Syn "sub" 49 49 [ Val . VCode $ mkSub … … 53 53 ] 54 54 ] 55 -- If there was a exit() in a CHECK block, we 've to exit.55 -- If there was a exit() in a CHECK block, we have to exit. 56 56 possiblyExit rv 57 57 env' <- getRuleEnv
