Add branch relocation type

This commit is contained in:
2024-10-08 17:29:08 +02:00
parent 699cc8684b
commit 87f183baad
5 changed files with 124 additions and 75 deletions

View File

@@ -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