summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Intermediate.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Language/Elna/Intermediate.hs')
-rw-r--r--lib/Language/Elna/Intermediate.hs56
1 files changed, 26 insertions, 30 deletions
diff --git a/lib/Language/Elna/Intermediate.hs b/lib/Language/Elna/Intermediate.hs
index 35f5ad2..d535b6a 100644
--- a/lib/Language/Elna/Intermediate.hs
+++ b/lib/Language/Elna/Intermediate.hs
@@ -1,8 +1,8 @@
module Language.Elna.Intermediate
( Operand(..)
, Quadruple(..)
- {- , Label(..)
- , Variable(..) -}
+ {- , Label(..) -}
+ , Variable(..)
, intermediate
) where
@@ -17,12 +17,20 @@ import Data.Text (Text)
import qualified Language.Elna.AST as AST
import Language.Elna.SymbolTable (SymbolTable{-, Info(..) -})
import Data.Foldable (Foldable(..))
-import Control.Monad.Trans.State (State, runState)
+import Control.Monad.Trans.State (State, get, modify', runState)
import Data.Maybe (catMaybes)
-newtype Operand
+newtype Variable = TempVariable Word32 -- | Variable Text
+ deriving Eq
+
+instance Show Variable
+ where
+ -- show (Variable variable) = '$' : Text.unpack variable
+ show (TempVariable variable) = '$' : show variable
+
+data Operand
= IntOperand Int32
- -- | VariableOperand Variable
+ | VariableOperand Variable
deriving (Eq, Show)
data Quadruple
@@ -30,12 +38,12 @@ data Quadruple
| StopQuadruple
| ParameterQuadruple Operand
| CallQuadruple Text Word32
+ | AddQuadruple Operand Operand Variable
+ | SubtractionQuadruple Operand Operand Variable
{-| GoToQuadruple Label
| AssignQuadruple Operand Variable
| ArrayQuadruple Variable Operand Variable
| ArrayAssignQuadruple Operand Operand Variable
- | AddQuadruple Operand Operand Variable
- | SubtractionQuadruple Operand Operand Variable
| ProductQuadruple Operand Operand Variable
| DivisionQuadruple Operand Operand Variable
| NegationQuadruple Operand Variable
@@ -142,6 +150,12 @@ statement localTable (AST.WhileStatement whileCondition whileStatement) = do
statement localTable (AST.CompoundStatement statements) =
fold <$> traverse (statement localTable) statements -}
+createTemporary :: Intermediate Variable
+createTemporary = do
+ currentCounter <- Intermediate get
+ Intermediate $ modify' (+ 1)
+ pure $ TempVariable currentCounter
+
{-
import Language.Elna.Types (Type(..))
import qualified Language.Elna.SymbolTable as SymbolTable
@@ -171,16 +185,6 @@ createLabel = do
{ labelCounter = getField @"labelCounter" generator + 1
}
-createTemporary :: Intermediate Variable
-createTemporary = do
- currentCounter <- Intermediate $ gets temporaryCounter
- Intermediate $ modify' modifier
- pure $ TempVariable currentCounter
- where
- modifier generator = generator
- { temporaryCounter = getField @"temporaryCounter" generator + 1
- }
-
condition
:: SymbolTable
-> AST.Condition
@@ -257,8 +261,11 @@ variableType (AST.ArrayAccess arrayAccess' _) symbolTable =
variableType arrayAccess' symbolTable
-}
expression :: SymbolTable -> AST.Expression -> Intermediate (Operand, Vector Quadruple)
-expression _localTable = \case
+expression localTable = \case
(AST.LiteralExpression literal') -> pure (literal literal', mempty)
+ (AST.SumExpression lhs rhs) -> binaryExpression AddQuadruple lhs rhs
+ (AST.SubtractionExpression lhs rhs) ->
+ binaryExpression SubtractionQuadruple lhs rhs
{- (AST.VariableExpression variableExpression) -> do
let variableType' = variableType variableExpression localTable
variableAccess' <- variableAccess localTable variableExpression Nothing variableType' mempty
@@ -280,13 +287,10 @@ expression _localTable = \case
( VariableOperand tempVariable
, Vector.snoc statements negationQuadruple
)
- (AST.SumExpression lhs rhs) -> binaryExpression AddQuadruple lhs rhs
- (AST.SubtractionExpression lhs rhs) ->
- binaryExpression SubtractionQuadruple lhs rhs
(AST.ProductExpression lhs rhs) ->
binaryExpression ProductQuadruple lhs rhs
(AST.DivisionExpression lhs rhs) ->
- binaryExpression DivisionQuadruple lhs rhs
+ binaryExpression DivisionQuadruple lhs rhs -}
where
binaryExpression f lhs rhs = do
(lhsOperand, lhsStatements) <- expression localTable lhs
@@ -298,14 +302,6 @@ expression _localTable = \case
, Vector.snoc (lhsStatements <> rhsStatements) newQuadruple
)
-data Variable = Variable Text | TempVariable Int32
- deriving Eq
-
-instance Show Variable
- where
- show (Variable variable) = '$' : Text.unpack variable
- show (TempVariable variable) = '$' : show variable
--}
literal :: AST.Literal -> Operand
literal (AST.IntegerLiteral integer) = IntOperand integer
{-literal (AST.HexadecimalLiteral integer) = IntOperand integer