| 95 | | trans :: PAST a -> Trans a |
| 96 | | trans PNil = return [] |
| 97 | | trans PNoop = return (StmtComment "") |
| 98 | | trans (PPos pos) = do |
| 99 | | tell [StmtLine (posName pos) (posBeginLine pos)] |
| 100 | | trans PNoop |
| 101 | | trans (PLit lit) = do |
| 102 | | -- generate fresh supply and things... |
| 103 | | litC <- trans lit |
| 104 | | tvar <- asks tReg |
| 105 | | pmc <- liftIO $ liftSTM $ do |
| 106 | | cur <- readTVar tvar |
| 107 | | writeTVar tvar (cur + 1) |
| 108 | | return cur |
| 109 | | tell [ StmtIns $ InsNew (PMC pmc) PerlUndef |
| 110 | | , StmtIns $ InsAssign (PMC pmc) litC |
| 111 | | ] |
| 112 | | return (PMC pmc) |
| 113 | | trans (PVal (VStr str)) = return $ LitStr str |
| 114 | | trans (PVal _) = error "Unknown val" |
| 115 | | trans (PVar var) = error "Unknown var" |
| 116 | | trans (PApp (PVar name) args) = do |
| 117 | | argsC <- mapM trans args |
| 118 | | return $ StmtIns $ InsFun [] name argsC |
| 119 | | trans (PStmts this rest) = do |
| 120 | | thisC <- trans this |
| 121 | | restC <- trans rest |
| 122 | | tell (thisC:restC) |
| 123 | | return [] |
| | 82 | instance Translate (PAST a) a where |
| | 83 | trans PNil = return [] |
| | 84 | trans PNoop = return (StmtComment "") |
| | 85 | trans (PPos pos) = do |
| | 86 | tell [StmtLine (posName pos) (posBeginLine pos)] |
| | 87 | trans PNoop |
| | 88 | trans (PLit lit) = do |
| | 89 | -- generate fresh supply and things... |
| | 90 | litC <- trans lit |
| | 91 | tvar <- asks tReg |
| | 92 | pmc <- liftIO $ liftSTM $ do |
| | 93 | cur <- readTVar tvar |
| | 94 | writeTVar tvar (cur + 1) |
| | 95 | return cur |
| | 96 | tell [ StmtIns $ InsNew (PMC pmc) PerlUndef |
| | 97 | , StmtIns $ InsAssign (PMC pmc) litC |
| | 98 | ] |
| | 99 | return (PMC pmc) |
| | 100 | trans (PVal (VStr str)) = return $ LitStr str |
| | 101 | trans (PVal _) = error "Unknown val" |
| | 102 | trans (PVar var) = error "Unknown var" |
| | 103 | trans (PApp (PVar name) args) = do |
| | 104 | argsC <- mapM trans args |
| | 105 | return $ StmtIns $ InsFun [] name argsC |
| | 106 | trans (PStmts this rest) = do |
| | 107 | thisC <- trans this |
| | 108 | restC <- trans rest |
| | 109 | tell (thisC:restC) |
| | 110 | return [] |