Changeset 22172 for src/Pugs/CodeGen
- Timestamp:
- 09/06/08 18:03:57 (3 months ago)
- Files:
-
- 1 modified
-
src/Pugs/CodeGen/M0ld.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/CodeGen/M0ld.hs
r22171 r22172 8 8 import Control.Monad.State 9 9 10 uniqueId = 11 do 12 modify (+1) 13 id <- get 14 return $ "$id"++(show id) 10 uniqueId = do 11 modify (+1) 12 id <- get 13 return $ "$id"++(show id) 15 14 void = "$void" 16 15 … … 19 18 20 19 instance EmitM0ld PIL_Environment where 21 emit x r = emit (pilMain x) r20 emit env r = emit (pilMain env) r 22 21 instance EmitM0ld PIL_Stmts where 23 emit PNil r = return "nil" 24 emit PPad {} r = return "pad" 25 emit PStmts{pStmt=stmt,pStmts=PNil} r = (emit stmt void) 26 emit PStmts{pStmt=stmt,pStmts=rest} r = do 27 stmt <- emit stmt void 28 rest <- emit rest void 29 return $ stmt ++ rest 22 emit statement r = case statement of 23 PNil -> return "nil" 24 PPad {} -> return "pad" 25 PStmts{pStmt=stmt,pStmts=PNil} -> emit stmt r 26 PStmts{pStmt=stmt,pStmts=rest} -> do 27 stmt <- emit stmt void 28 rest <- emit rest void 29 return $ stmt ++ rest 30 30 31 31 instance EmitM0ld PIL_Stmt where 32 emit PPos {pNode=stmt} r = emit stmt r 33 emit PNoop r = return "; #noop\n" 34 emit PStmt {pExpr=expr} r = emit expr r 32 emit statement r = case statement of 33 PPos {pNode=stmt} -> emit stmt r 34 PNoop -> return "; #noop\n" 35 PStmt {pExpr=expr} -> emit expr r 35 36 36 37 instance EmitM0ld PIL_Expr where 37 emit PExp {pLV=lv} r = emit lv r38 emit PCode {pBody=body} r =39 do40 ret <- uniqueId41 body <- emit body ret42 return ("my " ++ r ++ " = $Code.\"new\"(mold {\n"43 ++ body44 ++ void ++ " = $interpreter.\"return\"(" ++ ret ++ ");\n"45 ++ "});\n")38 emit expr r = case expr of 39 PExp {pLV=lv} -> emit lv r 40 PCode {pBody=body} -> do 41 ret <- uniqueId 42 body <- emit body ret 43 return ("my " ++ r ++ " = $Code.\"new\"(mold {\n" 44 ++ body 45 ++ void ++ " = $interpreter.\"return\"(" ++ ret ++ ");\n" 46 ++ "});\n") 46 47 47 48 instance EmitM0ld PIL_LValue where 48 emit PApp {pFun=fun,pArgs=args,pInv=Nothing} r = 49 do 50 fun_r <- uniqueId 51 fun_code <- emit fun fun_r 52 return (fun_code ++ "my " ++ r ++ " = " ++ fun_r ++ ".\"postcircumfix:( )\"(" ++ (show args) ++ ");\n") 53 emit PApp {pFun=fun,pArgs=args,pInv=Just inv} r = 54 do 55 inv <- emit inv r 56 fun <- emit fun r 57 return (inv ++ ".(" ++ fun ++ ")(" ++ (show args) ++ ")") 58 emit PVar {pVarName=name} r = 59 do 60 return $ "my " ++ r ++ " = $scope.\"postcircumfix:{ }\"(\"" ++ name ++ "\");\n" 61 emit x r = return $ show x 49 emit lvalue r = case lvalue of 50 PApp {pFun=fun,pArgs=args,pInv=Nothing} -> do 51 fun_r <- uniqueId 52 fun_code <- emit fun fun_r 53 return (fun_code ++ "my " ++ r ++ " = " ++ fun_r ++ ".\"postcircumfix:( )\"(" ++ (show args) ++ ");\n") 54 PApp {pFun=fun,pArgs=args,pInv=Just inv} -> do 55 inv <- emit inv r 56 fun <- emit fun r 57 return (inv ++ ".(" ++ fun ++ ")(" ++ (show args) ++ ")") 58 PVar {pVarName=name} -> do 59 return $ "my " ++ r ++ " = $scope.\"postcircumfix:{ }\"(\"" ++ name ++ "\");\n" 60 other -> return $ show other 62 61 63 62 genM0ld :: FilePath -> Eval Val 64 63 genM0ld filepath = do 65 64 penv <- compile () :: Eval PIL_Environment 66 return $ VStr $ (evalState (emit penv "out") 0) ++ "\n"65 return $ VStr $ (evalState (emit penv void) 0) ++ "\n"
