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.hs24
1 files changed, 12 insertions, 12 deletions
diff --git a/lib/Language/Elna/Intermediate.hs b/lib/Language/Elna/Intermediate.hs
index d535b6a..32c951e 100644
--- a/lib/Language/Elna/Intermediate.hs
+++ b/lib/Language/Elna/Intermediate.hs
@@ -28,18 +28,18 @@ instance Show Variable
-- show (Variable variable) = '$' : Text.unpack variable
show (TempVariable variable) = '$' : show variable
-data Operand
+data Operand v
= IntOperand Int32
- | VariableOperand Variable
+ | VariableOperand v
deriving (Eq, Show)
-data Quadruple
+data Quadruple v
= StartQuadruple
| StopQuadruple
- | ParameterQuadruple Operand
+ | ParameterQuadruple (Operand v)
| CallQuadruple Text Word32
- | AddQuadruple Operand Operand Variable
- | SubtractionQuadruple Operand Operand Variable
+ | AddQuadruple (Operand v) (Operand v) v
+ | SubtractionQuadruple (Operand v) (Operand v) v
{-| GoToQuadruple Label
| AssignQuadruple Operand Variable
| ArrayQuadruple Variable Operand Variable
@@ -72,7 +72,7 @@ instance Monad Intermediate
where
(Intermediate x) >>= f = Intermediate $ x >>= (runIntermediate . f)
-intermediate :: SymbolTable -> AST.Program -> HashMap AST.Identifier (Vector Quadruple)
+intermediate :: SymbolTable -> AST.Program -> HashMap AST.Identifier (Vector (Quadruple Variable))
intermediate globalTable
= fst
. flip runState 0
@@ -82,14 +82,14 @@ intermediate globalTable
program
:: SymbolTable
-> AST.Program
- -> Intermediate (HashMap AST.Identifier (Vector Quadruple))
+ -> Intermediate (HashMap AST.Identifier (Vector (Quadruple Variable)))
program globalTable (AST.Program declarations) = HashMap.fromList . catMaybes
<$> traverse (declaration globalTable) declarations
declaration
:: SymbolTable
-> AST.Declaration
- -> Intermediate (Maybe (AST.Identifier, Vector Quadruple))
+ -> Intermediate (Maybe (AST.Identifier, Vector (Quadruple Variable)))
declaration globalTable (AST.ProcedureDeclaration procedureName _ _ statements)
= Just
. (procedureName,)
@@ -99,7 +99,7 @@ declaration globalTable (AST.ProcedureDeclaration procedureName _ _ statements)
<$> traverse (statement globalTable) statements
-- declaration (AST.TypeDefinition _ _) accumulator = pure accumulator
-statement :: SymbolTable -> AST.Statement -> Intermediate (Vector Quadruple)
+statement :: SymbolTable -> AST.Statement -> Intermediate (Vector (Quadruple Variable))
statement _ AST.EmptyStatement = pure mempty
statement localTable (AST.CallStatement (AST.Identifier callName) arguments) = do
visitedArguments <- traverse (expression localTable) arguments
@@ -260,7 +260,7 @@ variableType (AST.VariableAccess identifier) symbolTable
variableType (AST.ArrayAccess arrayAccess' _) symbolTable =
variableType arrayAccess' symbolTable
-}
-expression :: SymbolTable -> AST.Expression -> Intermediate (Operand, Vector Quadruple)
+expression :: SymbolTable -> AST.Expression -> Intermediate (Operand Variable, Vector (Quadruple Variable))
expression localTable = \case
(AST.LiteralExpression literal') -> pure (literal literal', mempty)
(AST.SumExpression lhs rhs) -> binaryExpression AddQuadruple lhs rhs
@@ -302,7 +302,7 @@ expression localTable = \case
, Vector.snoc (lhsStatements <> rhsStatements) newQuadruple
)
-literal :: AST.Literal -> Operand
+literal :: AST.Literal -> Operand Variable
literal (AST.IntegerLiteral integer) = IntOperand integer
{-literal (AST.HexadecimalLiteral integer) = IntOperand integer
literal (AST.CharacterLiteral character) = IntOperand $ fromIntegral character