summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Backend
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-11-06 22:23:49 +0100
committerEugen Wissner <belka@caraus.de>2024-11-06 22:23:49 +0100
commit060496fc6ee331e2710ff8ade23317a0a79cbd6c (patch)
tree9af7b8f8767449bea7ae9a76e244141118ae5e75 /lib/Language/Elna/Backend
parente2d4b76c0bbad6c0740f5322e862a02971802e87 (diff)
downloadelna-060496fc6ee331e2710ff8ade23317a0a79cbd6c.tar.gz
Parse local variables
Diffstat (limited to 'lib/Language/Elna/Backend')
-rw-r--r--lib/Language/Elna/Backend/Allocator.hs36
-rw-r--r--lib/Language/Elna/Backend/Intermediate.hs8
2 files changed, 25 insertions, 19 deletions
diff --git a/lib/Language/Elna/Backend/Allocator.hs b/lib/Language/Elna/Backend/Allocator.hs
index 2b410a3..0c3e5c3 100644
--- a/lib/Language/Elna/Backend/Allocator.hs
+++ b/lib/Language/Elna/Backend/Allocator.hs
@@ -30,26 +30,21 @@ allocate MachineConfiguration{..} = fmap function
quadruple (ParameterQuadruple operand1) =
ParameterQuadruple (operand operand1)
quadruple (CallQuadruple name count) = CallQuadruple name count
- quadruple (AddQuadruple operand1 operand2 (TempVariable index))
+ quadruple (AddQuadruple operand1 operand2 variable)
= AddQuadruple (operand operand1) (operand operand2)
- $ Store
- $ temporaryRegisters !! fromIntegral index
- quadruple (SubtractionQuadruple operand1 operand2 (TempVariable index))
+ $ storeVariable variable
+ quadruple (SubtractionQuadruple operand1 operand2 variable)
= SubtractionQuadruple (operand operand1) (operand operand2)
- $ Store
- $ temporaryRegisters !! fromIntegral index
- quadruple (NegationQuadruple operand1 (TempVariable index))
+ $ storeVariable variable
+ quadruple (NegationQuadruple operand1 variable)
= NegationQuadruple (operand operand1)
- $ Store
- $ temporaryRegisters !! fromIntegral index
- quadruple (ProductQuadruple operand1 operand2 (TempVariable index))
+ $ storeVariable variable
+ quadruple (ProductQuadruple operand1 operand2 variable)
= ProductQuadruple (operand operand1) (operand operand2)
- $ Store
- $ temporaryRegisters !! fromIntegral index
- quadruple (DivisionQuadruple operand1 operand2 (TempVariable index))
+ $ storeVariable variable
+ quadruple (DivisionQuadruple operand1 operand2 variable)
= DivisionQuadruple (operand operand1) (operand operand2)
- $ Store
- $ temporaryRegisters !! fromIntegral index
+ $ storeVariable variable
quadruple (LabelQuadruple label) = LabelQuadruple label
quadruple (GoToQuadruple label) = GoToQuadruple label
quadruple (EqualQuadruple operand1 operand2 goToLabel) =
@@ -64,9 +59,20 @@ allocate MachineConfiguration{..} = fmap function
LessOrEqualQuadruple (operand operand1) (operand operand2) goToLabel
quadruple (GreaterOrEqualQuadruple operand1 operand2 goToLabel) =
GreaterOrEqualQuadruple (operand operand1) (operand operand2) goToLabel
+ quadruple (AssignQuadruple operand1 variable)
+ = AssignQuadruple (operand operand1)
+ $ storeVariable variable
operand :: Operand Variable -> Operand (Store r)
operand (IntOperand x) = IntOperand x
operand (VariableOperand (TempVariable index))
= VariableOperand
$ Store
$ temporaryRegisters !! fromIntegral index
+ operand (VariableOperand (LocalVariable index))
+ = VariableOperand
+ $ Store
+ $ temporaryRegisters !! fromIntegral index
+ storeVariable (TempVariable index) =
+ Store $ temporaryRegisters !! fromIntegral index
+ storeVariable (LocalVariable index) =
+ Store $ temporaryRegisters !! fromIntegral index
diff --git a/lib/Language/Elna/Backend/Intermediate.hs b/lib/Language/Elna/Backend/Intermediate.hs
index f1a5d7a..c4dcf18 100644
--- a/lib/Language/Elna/Backend/Intermediate.hs
+++ b/lib/Language/Elna/Backend/Intermediate.hs
@@ -17,12 +17,12 @@ instance Show Label
where
show (Label label) = '.' : Text.unpack label
-newtype Variable = TempVariable Word32 -- | Variable Text
+data Variable = TempVariable Word32 | LocalVariable Word32
deriving Eq
instance Show Variable
where
- -- show (Variable variable) = '$' : Text.unpack variable
+ show (LocalVariable variable) = '@' : show variable
show (TempVariable variable) = '$' : show variable
data Operand v
@@ -41,8 +41,8 @@ data Quadruple v
| ProductQuadruple (Operand v) (Operand v) v
| DivisionQuadruple (Operand v) (Operand v) v
| GoToQuadruple Label
- {-| AssignQuadruple Operand Variable
- | ArrayQuadruple Variable Operand Variable
+ | AssignQuadruple (Operand v) v
+ {-| ArrayQuadruple Variable Operand Variable
| ArrayAssignQuadruple Operand Operand Variable -}
| LessOrEqualQuadruple (Operand v) (Operand v) Label
| GreaterOrEqualQuadruple (Operand v) (Operand v) Label