Changeset 5169

Show
Ignore:
Timestamp:
07/04/05 00:35:58 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
6965
Message:

* our variables in packages now generate qualified symbols.

Location:
src/Pugs
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/AST.hs

    r4155 r5169  
    124124mergeStmts (Sym scope name x) y = Sym scope name (mergeStmts x y) 
    125125mergeStmts (Pad scope lex x) y = Pad scope lex (mergeStmts x y) 
     126mergeStmts (Syn "package" [pkg@(Val (VStr _))]) y = 
     127    Syn "namespace" [pkg, y] 
    126128mergeStmts x@(Pos pos (Syn syn _)) y | (syn ==) `any` words "subst match //"  = 
    127129    mergeStmts (Pos pos (App (Var "&infix:~~") Nothing [Var "$_", x])) y 
  • src/Pugs/Eval.hs

    r5126 r5169  
    105105evaluateMain exp = do 
    106106    -- S04: INIT {...}*      at run time, ASAP 
    107     initAV   <- evalVar "@?INIT" 
     107    initAV   <- evalVar "@*INIT" 
    108108    initSubs <- fromVals initAV 
    109109    enterContext CxtVoid $ do 
     
    246246    case v of 
    247247        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 
    250254 
    251255reduceStmts :: Exp -> Exp -> Eval Val 
     
    303307 
    304308reduceSym _ 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 
    309314    addGlobalSym sym 
    310315    evalExp exp 
     
    648653    retEmpty 
    649654 
    650 reduceSyn "package" [exp] = do 
     655reduceSyn "namespace" [exp, body] = do 
    651656    val <- evalExp exp 
    652657    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 
    660660 
    661661reduceSyn "inline" [langExp, _] = do 
     
    664664    when (lang /= "Haskell") $ 
    665665        retError "Inline: Unknown language" langVal 
    666     modVal  <- readVar "$?MODULE" 
     666    modVal  <- readVar "$*PACKAGE" 
    667667    mod     <- fromVal modVal 
    668668#ifndef HADDOCK 
     
    985985                        "Hash"  -> fmap (VRef . hashRef) (fromVal v :: Eval VHash) 
    986986                        "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)  
    988991                (False, False)  -> return v -- XXX reduce to val? 
    989992                (False, True)   -> do 
  • src/Pugs/Parser.hs

    r5117 r5169  
    296296    let subExp = Val . VCode $ MkCode 
    297297            { isMulti       = isMulti 
    298             , subName       = name' 
     298            , subName       = nameQualified 
    299299            , subEnv        = Just env 
    300300            , subType       = if "primitive" `elem` traits 
     
    311311            } 
    312312        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 
    316317        self :: [Param] 
    317318        self | styp > SubMethod = [] 
    318319             | (prm:_) <- params, isInvocant prm = [] 
    319320             | 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) 
    323325    -- 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 
    338339 
    339340-- | A Param representing the default (unnamed) invocant of a method on the given type. 
     
    574575ruleModuleDeclaration = rule "module declaration" $ do 
    575576    _       <- choice $ map symbol (words "package module class grammar") 
    576     (name, v, a)    <- rulePackageHead 
     577    (name, _, _)    <- rulePackageHead 
    577578    env     <- getRuleEnv 
    578579    putRuleEnv env{ envPackage = name, envClasses = envClasses env `addNode` mkType name } 
    579580    body    <- option emptyExp $ between (symbol "{") (char '}') ruleBlockBody 
    580     let moduleDef = Syn "module" [Val . VStr $ name ++ v ++ a] -- XXX 
     581    let pkgVal = Val . VStr $ name -- ++ v ++ a 
    581582    case body of 
    582         Noop -> return moduleDef 
     583        Noop -> return $ Syn "package" [pkgVal] 
    583584        _    -> do 
    584585            env' <- getRuleEnv 
    585586            putRuleEnv env'{ envPackage = envPackage env } 
    586             return $ Stmts moduleDef body 
     587            return $ Syn "namespace" [pkgVal, body] 
    587588 
    588589ruleDoBlock :: RuleParser Exp 
  • src/Pugs/Parser/Program.hs

    r4422 r5169  
    4343    eof 
    4444    -- S04: CHECK {...}*      at compile time, ALAP 
    45     --  $_() for @?CHECK 
     45    --  $_() for @*CHECK 
    4646    rv <- unsafeEvalExp $ Syn "for" 
    47         [ Var "@?CHECK" 
     47        [ Var "@*CHECK" 
    4848        , Syn "sub" 
    4949            [ Val . VCode $ mkSub 
     
    5353            ] 
    5454        ] 
    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. 
    5656    possiblyExit rv 
    5757    env' <- getRuleEnv