Changeset 12317 for src/Pugs/Compile
- Timestamp:
- 08/16/06 19:28:24 (2 years ago)
- Location:
- src/Pugs/Compile
- Files:
-
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Compile/Haskell.hs
r8153 r12317 52 52 argC = compile stmt 53 53 argRest = compile rest 54 compile (App (Var op) Nothing [])= [| op0 op [] |]55 compile (App (Var ('&':op)) Nothing [arg])= [| do54 compile (App (Var var) Nothing []) | op <- cast var = [| op0 op [] |] 55 compile (App (Var var) Nothing [arg]) | ('&':op) <- cast var = [| do 56 56 val <- $(argC) 57 57 op1 op val 58 58 |] where 59 59 argC = compile arg 60 compile (App (Var ('&':op)) Nothing [arg1, arg2])= [| do60 compile (App (Var var) Nothing [arg1, arg2]) | ('&':op) <- cast var = [| do 61 61 val1 <- $(argC1) 62 62 val2 <- $(argC2) -
src/Pugs/Compile/PIL2.hs
r10842 r12317 18 18 import Text.PrettyPrint 19 19 20 import qualified Data.ByteString.Char8 as Str 21 20 22 tcVoid, tcLValue :: TCxt 21 23 tcVoid = TCxtVoid … … 64 66 return $ concat entries' 65 67 where 66 entries = sortBy padSort $ padToList pad68 entries = sortBy padSort [ (cast var, ref) | (var, ref) <- padToList pad ] 67 69 canCompile (name@('&':_), xs) | length xs > 1 = do 68 70 fmap concat $ mapM (\x -> canCompile (name, [x])) xs … … 127 129 rv <- readRef =<< liftSTM (readTVar ref) 128 130 case rv of 129 VCode sub -> return $ PRawName ( subName sub)131 VCode sub -> return $ PRawName (cast $ subName sub) 130 132 _ -> return $ PRawName name 131 133 compile (name, _) = return $ PRawName name … … 137 139 compile (Ann (Cxt cxt) rest) = enter cxt $ compile rest 138 140 compile (Ann _ rest) = compile rest 139 compile (Sym _ "" rest) = compile rest140 141 compile (Stmts (Pad SOur _ exp) rest) = do 141 142 compile $ mergeStmts exp rest 142 143 compile (Stmts (Pad scope pad exp) rest) = do 143 padC <- compile $ padToList pad 144 let symC = (map fst $ padToList pad) `zip` padC 145 exps = [ Syn ":=" [Var name, Var from] | (name, PRawName from) <- symC, name /= from ] 144 padC <- compile [ (cast var :: String, ref) | (var, ref) <- padToList pad ] 145 let symC = (map (cast . fst) $ padToList pad) `zip` padC 146 exps = [ Syn ":=" [_Var name, _Var from] 147 | (name, PRawName from) <- symC 148 , name /= from 149 ] 146 150 expC <- compile $ mergeStmts (foldl1 mergeStmts (exps ++ [exp])) rest 147 151 return $ PPad scope symC expC … … 170 174 thisC <- enter cxtVoid $ compile this 171 175 declC <- enter cxtVoid $ compile decl 172 restC <- enterPackage pkg$ compileStmts rest176 restC <- enterPackage (cast pkg) $ compileStmts rest 173 177 return $ PStmts thisC $ PStmts declC restC 174 178 where 175 179 -- XXX - kludge. 176 decl = App ( Var func) Nothing [(Val (VStr pkg))]180 decl = App (_Var func) Nothing [(Val (VStr pkg))] 177 181 func = "&" ++ (capitalize sym) ++ "::_create" 178 182 capitalize [] = [] … … 198 202 compile (Ann Prag{} rest) = compile rest -- fmap (PPos pos rest) $ compile rest 199 203 compile (Ann _ rest) = compile rest 200 compile (Sym _ "" rest) = compile rest201 204 compile Noop = return PNoop 202 205 compile (Val val) = do … … 222 225 bodyC <- compile body 223 226 postC <- compile post 224 funC <- compile ( Var "&statement_control:loop")227 funC <- compile (_Var "&statement_control:loop") 225 228 return . PStmt . PExp $ PApp TCxtVoid funC Nothing 226 229 [preC, pBlock condC, pBlock bodyC, pBlock postC] … … 233 236 expC <- compile exp 234 237 bodyC <- compile body 235 funC <- compile ( Var "&statement_control:for")238 funC <- compile (_Var "&statement_control:for") 236 239 return . PStmt . PExp $ PApp TCxtVoid funC Nothing [expC, bodyC] 237 compile (Syn "given" _) = compile ( Var "$_") -- XXX238 compile (Syn "when" _) = compile ( Var "$_") -- XXX240 compile (Syn "given" _) = compile (_Var "$_") -- XXX 241 compile (Syn "when" _) = compile (_Var "$_") -- XXX 239 242 compile exp = fmap PStmt $ compile exp 240 243 … … 275 278 compile (Ann (Cxt cxt) rest) = enter cxt $ compile rest 276 279 compile (Ann _ rest) = compile rest 277 compile (Sym _ "" rest) = compile rest278 280 -- XXX: pragmas? 279 compile (Var name) = return $ PVar name281 compile (Var name) = return $ _PVar name 280 282 compile (Syn (sigil:"::()") exps) = do 281 compile $ App ( Var "&Pugs::Internals::symbolic_deref") Nothing $283 compile $ App (_Var "&Pugs::Internals::symbolic_deref") Nothing $ 282 284 (Val . VStr $ sigil:""):exps 283 compile (App (Var "&goto") (Just inv) args)= do285 compile (App (Var var) (Just inv) args) | var == cast "&goto" = do 284 286 cxt <- askTCxt 285 287 funC <- compile inv … … 304 306 isLogicalLazy _ = False 305 307 compile exp@(Syn "if" _) = compConditional exp 306 compile (Syn "{}" (x:xs)) = compile $ App ( Var "&postcircumfix:{}") (Just x) xs308 compile (Syn "{}" (x:xs)) = compile $ App (_Var "&postcircumfix:{}") (Just x) xs 307 309 compile (Syn "[]" (x:xs)) = do 308 compile (App ( Var "&postcircumfix:[]") (Just x) xs)310 compile (App (_Var "&postcircumfix:[]") (Just x) xs) 309 311 compile (Syn "," exps) = do 310 compile (App ( Var "&infix:,") Nothing exps)312 compile (App (_Var "&infix:,") Nothing exps) 311 313 -- Minor hack, my $a = [] is parsed as my $a = [Noop], resulting in my $a = 312 314 -- [undef], which is wrong. 313 315 compile (Syn "\\[]" [Noop]) = do 314 compile (App ( Var "&circumfix:[]") Nothing [])316 compile (App (_Var "&circumfix:[]") Nothing []) 315 317 compile (Syn "\\[]" exps) = do 316 compile (App ( Var "&circumfix:[]") Nothing exps)318 compile (App (_Var "&circumfix:[]") Nothing exps) 317 319 compile (Syn name@(sigil:"{}") exps) | (sigil ==) `any` "$@%&" = do 318 compile (App ( Var $ "&circumfix:" ++ name) Nothing exps)320 compile (App (_Var $ "&circumfix:" ++ name) Nothing exps) 319 321 compile (Syn "\\{}" exps) = do 320 compile (App ( Var "&circumfix:{}") Nothing exps)322 compile (App (_Var "&circumfix:{}") Nothing exps) 321 323 compile (Syn "*" exps) = do 322 compile (App ( Var "&prefix:*") Nothing exps)324 compile (App (_Var "&prefix:*") Nothing exps) 323 325 compile (Syn "=" [lhs, rhs]) = do 324 326 lhsC <- enterLValue $ compile lhs … … 330 332 compile (Syn syn [lhs, exp]) | last syn == '=' = do 331 333 let op = "&infix:" ++ init syn 332 compile $ Syn "=" [lhs, App ( Var op) Nothing [lhs, exp]]334 compile $ Syn "=" [lhs, App (_Var op) Nothing [lhs, exp]] 333 335 compile (Syn "but" [obj, block]) = 334 compile $ App ( Var "&Pugs::Internals::but_block") Nothing [obj, block]336 compile $ App (_Var "&Pugs::Internals::but_block") Nothing [obj, block] 335 337 compile exp@(Syn "namespace" _) = do 336 338 -- XXX - Is there a better way to wrap Stmts as LValue? … … 345 347 -- For now, using &Pugs::Internals::named_pair is probably ok. 346 348 compile (Syn "named" kv@[_, _]) = do 347 compile $ App ( Var "&Pugs::Internals::named_pair") Nothing kv349 compile $ App (_Var "&Pugs::Internals::named_pair") Nothing kv 348 350 compile exp = compError exp 349 351 … … 353 355 condC <- enter (CxtItem $ mkType "Bool") $ compile cond 354 356 bodyC <- enter CxtVoid $ compile body 355 funC <- compile ( Var $ "&statement_control:" ++ name)357 funC <- compile (_Var $ "&statement_control:" ++ name) 356 358 return . PStmt . PExp $ PApp cxt funC Nothing [pBlock condC, pBlock bodyC] 357 359 compLoop exp = compError exp … … 363 365 compConditional (Syn name exps) = do 364 366 [condC, trueC, falseC] <- compile exps 365 funC <- compile $ Var ("&statement_control:" ++ name)367 funC <- compile $ _Var ("&statement_control:" ++ name) 366 368 cxt <- askTCxt 367 369 return $ PApp cxt funC Nothing [condC, PThunk trueC, PThunk falseC] 368 370 compConditional exp = compError exp 371 372 _PVar :: Var -> PIL_LValue 373 _PVar = PVar . cast 369 374 370 375 {-| Compiles various 'Exp's to 'PIL_Expr's. -} … … 374 379 compile (Ann (Cxt cxt) rest) = enter cxt $ compile rest 375 380 compile (Ann _ rest) = compile rest 376 compile (Sym _ "" rest) = compile rest377 381 -- XXX: pragmas? 378 compile (Var name) = return . PExp $ PVar name382 compile (Var name) = return . PExp $ _PVar name 379 383 compile exp@(Val (VCode _)) = compile $ Syn "sub" [exp] 380 384 compile (Val val) = fmap PLit $ compile val … … 413 417 414 418 -- utility functions 415 padSort :: ( Var, [(TVar Bool, TVar VRef)]) -> (String, [(a, b)]) -> Ordering419 padSort :: (String, [(TVar Bool, TVar VRef)]) -> (String, [(a, b)]) -> Ordering 416 420 padSort (a, [(_, _)]) (b, [(_, _)]) 417 421 | (head a == ':' && head b == '&') = LT -
src/Pugs/Compile/Pugs.hs
r12204 r12317 70 70 71 71 72 instance Compile (String, [(TVar Bool, TVar VRef)]) where 73 compile ((':':'*':_), _) = return Str.empty -- XXX - :*Bool etc; punt for now 74 compile (n, tvars) = do 75 tvarsC <- fmap (filter (not . Str.null)) $ mapM compile tvars 76 if null tvarsC then return Str.empty else do 77 return $ Str.concat [pl, Str.pack (show n), Str.pack ", [", joinMany tvarsC, br, pr] 72 instance Compile (Var, [(TVar Bool, TVar VRef)]) where 73 compile (var, tvars) 74 | SType <- v_sigil var, isGlobalVar var = return Str.empty 75 | otherwise = do 76 tvarsC <- fmap (filter (not . Str.null)) $ mapM compile tvars 77 if null tvarsC then return Str.empty else do 78 return $ Str.concat [pl, Str.pack (cast var), Str.pack ", [", joinMany tvarsC, br, pr] 78 79 79 80 instance (Typeable a) => Compile (Maybe (TVar a)) where
