diff options
Diffstat (limited to 'lib/Language/Elna/Intermediate.hs')
| -rw-r--r-- | lib/Language/Elna/Intermediate.hs | 56 |
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 |
