| 9 | | -- XXX: do something useful with the filename arg |
| | 10 | class EmitM0ld a where |
| | 11 | emit :: a -> [Char] -> State Int [Char] |
| | 12 | |
| | 13 | instance EmitM0ld PIL_Environment where |
| | 14 | emit x r = emit (pilMain x) r |
| | 15 | instance EmitM0ld PIL_Stmts where |
| | 16 | emit PNil r = return "nil" |
| | 17 | emit PPad {} r = return "pad" |
| | 18 | emit PStmts{pStmt=stmt,pStmts=PNil} r = (emit stmt "void") |
| | 19 | emit PStmts{pStmt=stmt,pStmts=rest} r = do |
| | 20 | stmt <- emit stmt "void" |
| | 21 | rest <- emit rest "void" |
| | 22 | return $ stmt ++ rest |
| | 23 | |
| | 24 | instance EmitM0ld PIL_Stmt where |
| | 25 | emit PPos {pNode=stmt} = emit stmt |
| | 26 | emit PNoop = \_-> return ";\n" |
| | 27 | emit PStmt {pExpr=expr} = emit expr |
| | 28 | |
| | 29 | instance EmitM0ld PIL_Expr where |
| | 30 | emit PExp {pLV=lv} r = emit lv r |
| | 31 | emit PCode {pBody=body} r = |
| | 32 | do |
| | 33 | body <- emit body "void" |
| | 34 | let ret = "?" |
| | 35 | return ("my $" ++ r ++ " = $Code.\"new\"(mold {\n" |
| | 36 | ++ body |
| | 37 | ++ "$interpreter.\"return\"($" ++ ret ++ ");\n" |
| | 38 | ++ "});\n") |
| | 39 | |
| | 40 | instance EmitM0ld PIL_LValue where |
| | 41 | emit PApp {pFun=fun,pArgs=args,pInv=Nothing} r = |
| | 42 | do |
| | 43 | let fun_r = "?" |
| | 44 | fun <- emit fun fun_r |
| | 45 | return (fun ++ "my $" ++ r ++ " = $" ++ fun_r ++ ".\"postcircumfix:( )\"(" ++ (show args) ++ ");\n") |
| | 46 | emit PApp {pFun=fun,pArgs=args,pInv=Just inv} r = |
| | 47 | do |
| | 48 | inv <- emit inv r |
| | 49 | fun <- emit fun r |
| | 50 | return (inv ++ ".(" ++ fun ++ ")(" ++ (show args) ++ ")") |
| | 51 | emit PVar {pVarName=name} r = |
| | 52 | do |
| | 53 | return $ "my $" ++ r ++ " = $scope.\"postcircumfix:{ }\"(\"" ++ name ++ "\");\n" |
| | 54 | emit x r = return $ show x |
| | 55 | |