Changeset 22170 for src/Pugs/CodeGen

Show
Ignore:
Timestamp:
09/06/08 17:02:15 (3 months ago)
Author:
pmurias
Message:

[pugs] pre-working (ugly) start of the m0ld pugs backend

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/CodeGen/M0ld.hs

    r21930 r22170  
    66import Pugs.PIL1.Instances () 
    77import Pugs.PIL1 
     8import Control.Monad.State 
    89 
    9 -- XXX: do something useful with the filename arg 
     10class EmitM0ld a where 
     11    emit :: a -> [Char] -> State Int [Char] 
     12 
     13instance EmitM0ld PIL_Environment where 
     14    emit x r = emit (pilMain x) r 
     15instance 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 
     24instance EmitM0ld PIL_Stmt where 
     25    emit PPos {pNode=stmt} = emit stmt 
     26    emit PNoop = \_-> return ";\n" 
     27    emit PStmt {pExpr=expr} = emit expr 
     28 
     29instance 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 
     40instance 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 
    1056genM0ld :: FilePath -> Eval Val 
    1157genM0ld filepath = do 
    1258    penv <- compile () :: Eval PIL_Environment 
    13     return $ VStr $ (show penv) 
     59    return $ VStr $ (evalState (emit penv "out") 0) ++ "\n"