summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Glue.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-10-08 17:29:08 +0200
committerEugen Wissner <belka@caraus.de>2024-10-09 23:37:58 +0200
commit87f183baad01f2b572f5f9051895b5876a56dd4c (patch)
tree638bc5449ae12125d2d943b003212424e0bb66ba /lib/Language/Elna/Glue.hs
parent699cc8684b1571d2501bac2c8bdf461127a420a1 (diff)
downloadelna-87f183baad01f2b572f5f9051895b5876a56dd4c.tar.gz
Add branch relocation type
Diffstat (limited to 'lib/Language/Elna/Glue.hs')
-rw-r--r--lib/Language/Elna/Glue.hs39
1 files changed, 15 insertions, 24 deletions
diff --git a/lib/Language/Elna/Glue.hs b/lib/Language/Elna/Glue.hs
index 31c31e0..9fc8a1c 100644
--- a/lib/Language/Elna/Glue.hs
+++ b/lib/Language/Elna/Glue.hs
@@ -2,7 +2,7 @@ module Language.Elna.Glue
( glue
) where
-import Control.Monad.Trans.State (State, get, modify', runState)
+import Control.Monad.Trans.State (State, gets, modify', runState)
import Data.Bifunctor (Bifunctor(..))
import Data.Foldable (Foldable(..))
import Data.HashMap.Strict (HashMap)
@@ -13,10 +13,15 @@ import qualified Data.Vector as Vector
import Data.Word (Word32)
import qualified Language.Elna.Frontend.AST as AST
import Language.Elna.Backend.Intermediate (Operand(..), Quadruple(..), Variable(..))
-import Language.Elna.Frontend.SymbolTable (SymbolTable{-, Info(..) -})
+import Language.Elna.Frontend.SymbolTable (SymbolTable)
+import GHC.Records (HasField(..))
+
+newtype Paste = Paste
+ { temporaryCounter :: Word32
+ }
newtype Glue a = Glue
- { runGlue :: State Word32 a }
+ { runGlue :: State Paste a }
instance Functor Glue
where
@@ -34,7 +39,7 @@ instance Monad Glue
glue :: SymbolTable -> AST.Program -> HashMap AST.Identifier (Vector (Quadruple Variable))
glue globalTable
= fst
- . flip runState 0
+ . flip runState Paste{ temporaryCounter = 0 }
. runGlue
. program globalTable
@@ -111,17 +116,17 @@ statement localTable (AST.WhileStatement whileCondition whileStatement) = do
createTemporary :: Glue Variable
createTemporary = do
- currentCounter <- Glue get
- Glue $ modify' (+ 1)
+ currentCounter <- Glue $ gets $ getField @"temporaryCounter"
+ Glue $ modify' modifier
pure $ TempVariable currentCounter
+ where
+ modifier generator = generator
+ { temporaryCounter = getField @"temporaryCounter" generator + 1
+ }
{-
import Language.Elna.Types (Type(..))
import qualified Language.Elna.SymbolTable as SymbolTable
-import GHC.Records (HasField(..))
-import qualified Data.Text.Lazy.Builder.Int as Text.Builder
-import qualified Data.Text.Lazy.Builder as Text.Builder
-import qualified Data.Text.Lazy as Text.Lazy
newtype Label = Label Text
deriving Eq
@@ -130,20 +135,6 @@ instance Show Label
where
show (Label label) = '.' : Text.unpack label
-createLabel :: Glue Label
-createLabel = do
- currentCounter <- Glue $ gets labelCounter
- Glue $ modify' modifier
- pure
- $ Label
- $ Text.Lazy.toStrict
- $ Text.Builder.toLazyText
- $ Text.Builder.decimal currentCounter
- where
- modifier generator = generator
- { labelCounter = getField @"labelCounter" generator + 1
- }
-
condition
:: SymbolTable
-> AST.Condition