diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-10-08 17:29:08 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-10-09 23:37:58 +0200 |
| commit | 87f183baad01f2b572f5f9051895b5876a56dd4c (patch) | |
| tree | 638bc5449ae12125d2d943b003212424e0bb66ba /lib/Language/Elna/Glue.hs | |
| parent | 699cc8684b1571d2501bac2c8bdf461127a420a1 (diff) | |
| download | elna-87f183baad01f2b572f5f9051895b5876a56dd4c.tar.gz | |
Add branch relocation type
Diffstat (limited to 'lib/Language/Elna/Glue.hs')
| -rw-r--r-- | lib/Language/Elna/Glue.hs | 39 |
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 |
