Changeset 22171
- Timestamp:
- 09/06/08 17:32:06 (3 months ago)
- Files:
-
- 1 modified
-
src/Pugs/CodeGen/M0ld.hs (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/CodeGen/M0ld.hs
r22170 r22171 8 8 import Control.Monad.State 9 9 10 uniqueId = 11 do 12 modify (+1) 13 id <- get 14 return $ "$id"++(show id) 15 void = "$void" 16 10 17 class EmitM0ld a where 11 18 emit :: a -> [Char] -> State Int [Char] … … 16 23 emit PNil r = return "nil" 17 24 emit PPad {} r = return "pad" 18 emit PStmts{pStmt=stmt,pStmts=PNil} r = (emit stmt "void")25 emit PStmts{pStmt=stmt,pStmts=PNil} r = (emit stmt void) 19 26 emit PStmts{pStmt=stmt,pStmts=rest} r = do 20 stmt <- emit stmt "void"21 rest <- emit rest "void"27 stmt <- emit stmt void 28 rest <- emit rest void 22 29 return $ stmt ++ rest 23 30 24 31 instance EmitM0ld PIL_Stmt where 25 emit PPos {pNode=stmt} = emit stmt26 emit PNoop = \_-> return ";\n"27 emit PStmt {pExpr=expr} = emit expr32 emit PPos {pNode=stmt} r = emit stmt r 33 emit PNoop r = return "; #noop\n" 34 emit PStmt {pExpr=expr} r = emit expr r 28 35 29 36 instance EmitM0ld PIL_Expr where … … 31 38 emit PCode {pBody=body} r = 32 39 do 33 body <- emit body "void"34 let ret = "?"35 return ("my $" ++ r ++ " = $Code.\"new\"(mold {\n"40 ret <- uniqueId 41 body <- emit body ret 42 return ("my " ++ r ++ " = $Code.\"new\"(mold {\n" 36 43 ++ body 37 ++ "$interpreter.\"return\"($" ++ ret ++ ");\n"44 ++ void ++ " = $interpreter.\"return\"(" ++ ret ++ ");\n" 38 45 ++ "});\n") 39 46 … … 41 48 emit PApp {pFun=fun,pArgs=args,pInv=Nothing} r = 42 49 do 43 let fun_r = "?"44 fun <- emit fun fun_r45 return (fun ++ "my $" ++ r ++ " = $" ++ fun_r ++ ".\"postcircumfix:( )\"(" ++ (show args) ++ ");\n")50 fun_r <- uniqueId 51 fun_code <- emit fun fun_r 52 return (fun_code ++ "my " ++ r ++ " = " ++ fun_r ++ ".\"postcircumfix:( )\"(" ++ (show args) ++ ");\n") 46 53 emit PApp {pFun=fun,pArgs=args,pInv=Just inv} r = 47 54 do … … 51 58 emit PVar {pVarName=name} r = 52 59 do 53 return $ "my $" ++ r ++ " = $scope.\"postcircumfix:{ }\"(\"" ++ name ++ "\");\n"60 return $ "my " ++ r ++ " = $scope.\"postcircumfix:{ }\"(\"" ++ name ++ "\");\n" 54 61 emit x r = return $ show x 55 62
