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