Changeset 12317 for src/Pugs/Compile.hs
- Timestamp:
- 08/16/06 19:28:24 (2 years ago)
- Files:
-
- 1 modified
-
src/Pugs/Compile.hs (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Compile.hs
r10842 r12317 73 73 return $ concat entries' 74 74 where 75 entries = sortBy padSort $ padToList pad75 entries = sortBy padSort [ (cast var, ref) | (var, ref) <- padToList pad ] 76 76 canCompile (name@('&':_), xs) | length xs > 1 = do 77 77 fmap concat $ mapM (\x -> canCompile (name, [x])) xs … … 136 136 rv <- readRef =<< liftSTM (readTVar ref) 137 137 case rv of 138 VCode sub -> return $ PRawName ( subName sub)138 VCode sub -> return $ PRawName (cast $ subName sub) 139 139 _ -> return $ PRawName name 140 140 compile (name, _) = return $ PRawName name … … 146 146 compile (Ann (Cxt cxt) rest) = enter cxt $ compile rest 147 147 compile (Ann _ rest) = compile rest 148 compile (Sym _ "" rest) = compile rest149 148 compile (Stmts (Pad SOur _ exp) rest) = do 150 149 compile $ mergeStmts exp rest 151 150 compile (Stmts (Pad scope pad exp) rest) = do 152 padC <- compile $ padToList pad 153 let symC = (map fst $ padToList pad) `zip` padC 154 exps = [ Syn ":=" [Var name, Var from] | (name, PRawName from) <- symC, name /= from ] 151 padC <- compile [ (cast var :: String, ref) | (var, ref) <- padToList pad ] 152 let symC = (map (cast . fst) $ padToList pad) `zip` padC 153 exps = [ Syn ":=" [_Var name, _Var from] 154 | (name, PRawName from) <- symC 155 , name /= from 156 ] 155 157 expC <- compile $ mergeStmts (foldl1 mergeStmts (exps ++ [exp])) rest 156 158 return $ PPad scope symC expC … … 179 181 thisC <- enter cxtVoid $ compile this 180 182 declC <- enter cxtVoid $ compile decl 181 restC <- enterPackage pkg$ compileStmts rest183 restC <- enterPackage (cast pkg) $ compileStmts rest 182 184 return $ PStmts thisC $ PStmts declC restC 183 185 where 184 186 -- XXX - kludge. 185 decl = App ( Var func) Nothing [(Val (VStr pkg))]187 decl = App (_Var func) Nothing [(Val (VStr pkg))] 186 188 func = "&" ++ (capitalize sym) ++ "::_create" 187 189 capitalize [] = [] … … 207 209 compile (Ann Prag{} rest) = compile rest -- fmap (PPos pos rest) $ compile rest 208 210 compile (Ann _ rest) = compile rest 209 compile (Sym _ "" rest) = compile rest210 211 compile Noop = return PNoop 211 212 compile (Val val) = do … … 231 232 bodyC <- compile body 232 233 postC <- compile post 233 funC <- compile ( Var "&statement_control:loop")234 funC <- compile (_Var "&statement_control:loop") 234 235 return . PStmt . PExp $ PApp TCxtVoid funC Nothing 235 236 [preC, pBlock condC, pBlock bodyC, pBlock postC] … … 242 243 expC <- compile exp 243 244 bodyC <- compile body 244 funC <- compile ( Var "&statement_control:for")245 funC <- compile (_Var "&statement_control:for") 245 246 return . PStmt . PExp $ PApp TCxtVoid funC Nothing [expC, bodyC] 246 compile (Syn "given" _) = compile ( Var "$_") -- XXX247 compile (Syn "when" _) = compile ( Var "$_") -- XXX247 compile (Syn "given" _) = compile (_Var "$_") -- XXX 248 compile (Syn "when" _) = compile (_Var "$_") -- XXX 248 249 compile exp = fmap PStmt $ compile exp 249 250 … … 284 285 compile (Ann (Cxt cxt) rest) = enter cxt $ compile rest 285 286 compile (Ann _ rest) = compile rest 286 compile (Sym _ "" rest) = compile rest287 287 -- XXX: pragmas? 288 compile (Var name) = return $ PVar name288 compile (Var name) = return $ _PVar name 289 289 compile (Syn (sigil:"::()") exps) = do 290 compile $ App ( Var "&Pugs::Internals::symbolic_deref") Nothing $290 compile $ App (_Var "&Pugs::Internals::symbolic_deref") Nothing $ 291 291 (Val . VStr $ sigil:""):exps 292 compile (App (Var "&goto") (Just inv) args)= do292 compile (App (Var var) (Just inv) args) | var == cast "&goto" = do 293 293 cxt <- askTCxt 294 294 funC <- compile inv … … 313 313 isLogicalLazy _ = False 314 314 compile exp@(Syn "if" _) = compConditional exp 315 compile (Syn "{}" (x:xs)) = compile $ App ( Var "&postcircumfix:{}") (Just x) xs315 compile (Syn "{}" (x:xs)) = compile $ App (_Var "&postcircumfix:{}") (Just x) xs 316 316 compile (Syn "[]" (x:xs)) = do 317 compile (App ( Var "&postcircumfix:[]") (Just x) xs)317 compile (App (_Var "&postcircumfix:[]") (Just x) xs) 318 318 compile (Syn "," exps) = do 319 compile (App ( Var "&infix:,") Nothing exps)319 compile (App (_Var "&infix:,") Nothing exps) 320 320 -- Minor hack, my $a = [] is parsed as my $a = [Noop], resulting in my $a = 321 321 -- [undef], which is wrong. 322 322 compile (Syn "\\[]" [Noop]) = do 323 compile (App ( Var "&circumfix:[]") Nothing [])323 compile (App (_Var "&circumfix:[]") Nothing []) 324 324 compile (Syn "\\[]" exps) = do 325 compile (App ( Var "&circumfix:[]") Nothing exps)325 compile (App (_Var "&circumfix:[]") Nothing exps) 326 326 compile (Syn name@(sigil:"{}") exps) | (sigil ==) `any` "$@%&" = do 327 compile (App ( Var $ "&circumfix:" ++ name) Nothing exps)327 compile (App (_Var $ "&circumfix:" ++ name) Nothing exps) 328 328 compile (Syn "\\{}" exps) = do 329 compile (App ( Var "&circumfix:{}") Nothing exps)329 compile (App (_Var "&circumfix:{}") Nothing exps) 330 330 compile (Syn "*" exps) = do 331 compile (App ( Var "&prefix:*") Nothing exps)331 compile (App (_Var "&prefix:*") Nothing exps) 332 332 compile (Syn "=" [lhs, rhs]) = do 333 333 lhsC <- enterLValue $ compile lhs … … 339 339 compile (Syn syn [lhs, exp]) | last syn == '=' = do 340 340 let op = "&infix:" ++ init syn 341 compile $ Syn "=" [lhs, App ( Var op) Nothing [lhs, exp]]341 compile $ Syn "=" [lhs, App (_Var op) Nothing [lhs, exp]] 342 342 compile (Syn "but" [obj, block]) = 343 compile $ App ( Var "&Pugs::Internals::but_block") Nothing [obj, block]343 compile $ App (_Var "&Pugs::Internals::but_block") Nothing [obj, block] 344 344 compile exp@(Syn "namespace" _) = do 345 345 -- XXX - Is there a better way to wrap Stmts as LValue? … … 354 354 -- For now, using &Pugs::Internals::named_pair is probably ok. 355 355 compile (Syn "named" kv@[_, _]) = do 356 compile $ App ( Var "&Pugs::Internals::named_pair") Nothing kv356 compile $ App (_Var "&Pugs::Internals::named_pair") Nothing kv 357 357 compile exp = compError exp 358 358 … … 362 362 condC <- enter (CxtItem $ mkType "Bool") $ compile cond 363 363 bodyC <- enter CxtVoid $ compile body 364 funC <- compile ( Var $ "&statement_control:" ++ name)364 funC <- compile (_Var $ "&statement_control:" ++ name) 365 365 return . PStmt . PExp $ PApp cxt funC Nothing [pBlock condC, pBlock bodyC] 366 366 compLoop exp = compError exp … … 372 372 compConditional (Syn name exps) = do 373 373 [condC, trueC, falseC] <- compile exps 374 funC <- compile $ Var ("&statement_control:" ++ name)374 funC <- compile $ _Var ("&statement_control:" ++ name) 375 375 cxt <- askTCxt 376 376 return $ PApp cxt funC Nothing [condC, PThunk trueC, PThunk falseC] 377 377 compConditional exp = compError exp 378 379 _PVar :: Var -> PIL_LValue 380 _PVar = PVar . cast 378 381 379 382 {-| Compiles various 'Exp's to 'PIL_Expr's. -} … … 383 386 compile (Ann (Cxt cxt) rest) = enter cxt $ compile rest 384 387 compile (Ann _ rest) = compile rest 385 compile (Sym _ "" rest) = compile rest386 388 -- XXX: pragmas? 387 compile (Var name) = return . PExp $ PVar name389 compile (Var name) = return . PExp $ _PVar name 388 390 compile exp@(Val (VCode _)) = compile $ Syn "sub" [exp] 389 391 compile (Val val) = fmap PLit $ compile val … … 422 424 423 425 -- utility functions 424 padSort :: ( Var, [(TVar Bool, TVar VRef)]) -> (String, [(a, b)]) -> Ordering426 padSort :: (String, [(TVar Bool, TVar VRef)]) -> (String, [(a, b)]) -> Ordering 425 427 padSort (a, [(_, _)]) (b, [(_, _)]) 426 428 | (head a == ':' && head b == '&') = LT
