diff options
Diffstat (limited to 'lib/Language/Elna/Glue.hs')
| -rw-r--r-- | lib/Language/Elna/Glue.hs | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/lib/Language/Elna/Glue.hs b/lib/Language/Elna/Glue.hs index 3cd46e3..ebb0f69 100644 --- a/lib/Language/Elna/Glue.hs +++ b/lib/Language/Elna/Glue.hs @@ -26,6 +26,7 @@ import Language.Elna.Frontend.SymbolTable (Info(..), SymbolTable) import qualified Language.Elna.Frontend.SymbolTable as SymbolTable import GHC.Records (HasField(..)) import Language.Elna.Frontend.AST (Identifier(..)) +import Debug.Trace (traceShow) data Paste = Paste { temporaryCounter :: Word32 @@ -71,11 +72,12 @@ declaration :: SymbolTable -> AST.Declaration -> Glue (Maybe (AST.Identifier, Vector (Quadruple Variable))) -declaration globalTable (AST.ProcedureDeclaration procedureName parameters variableDeclarations statements) - = Glue (modify' resetTemporaryCounter) - >> traverseWithIndex registerVariable variableDeclarations - >> traverseWithIndex registerParameter (reverse parameters) - >> nameQuadruplesTuple <$> traverse (statement globalTable) statements +declaration globalTable (AST.ProcedureDeclaration procedureName parameters variableDeclarations statements) = + let Just (ProcedureInfo localTable _) = SymbolTable.lookup procedureName globalTable + in Glue (modify' resetTemporaryCounter) + >> traverseWithIndex registerVariable variableDeclarations + >> traverseWithIndex registerParameter (reverse parameters) + >> nameQuadruplesTuple <$> traverse (statement localTable) statements where traverseWithIndex f = traverse_ (uncurry f) . zip [0..] registerParameter index (AST.Parameter identifier _ _) = @@ -129,11 +131,11 @@ statement localTable (AST.AssignmentStatement variableAccess' assignee) = do let variableType' = variableType variableAccess' localTable accessResult <- variableAccess localTable variableAccess' Nothing variableType' mempty lhsStatements <- case accessResult of - {-(AST.Identifier identifier, Just accumulatedIndex, accumulatedStatements) -> - Vector.snoc accumulatedStatements - $ ArrayAssignQuadruple rhsOperand accumulatedIndex - $ LocalVariable identifier -} - (identifier, _Nothing, accumulatedStatements) + (identifier, Just accumulatedIndex, accumulatedStatements) + -> Vector.snoc accumulatedStatements + . ArrayAssignQuadruple rhsOperand accumulatedIndex + <$> lookupLocal identifier + (identifier, Nothing, accumulatedStatements) -> Vector.snoc accumulatedStatements . AssignQuadruple rhsOperand <$> lookupLocal identifier @@ -251,7 +253,8 @@ variableAccess _ _ _ _ _ = error "Array access operator doesn't match the type." variableType :: AST.VariableAccess -> SymbolTable -> Type variableType (AST.VariableAccess identifier) symbolTable | Just (TypeInfo type') <- SymbolTable.lookup identifier symbolTable = type' - | otherwise = error "Undefined type." + | Just (VariableInfo _ type') <- SymbolTable.lookup identifier symbolTable = type' + | otherwise = traceShow identifier $ error "Undefined type." variableType (AST.ArrayAccess arrayAccess' _) symbolTable = variableType arrayAccess' symbolTable @@ -277,16 +280,17 @@ expression localTable = \case let variableType' = variableType variableExpression localTable variableAccess' <- variableAccess localTable variableExpression Nothing variableType' mempty case variableAccess' of - (identifier, _Nothing, statements) + (identifier, Nothing, statements) -> (, statements) . VariableOperand <$> lookupLocal identifier - {-(AST.Identifier identifier, Just operand, statements) -> do + (identifier, Just operand, statements) -> do arrayAddress <- createTemporary - let arrayStatement = ArrayQuadruple (Variable identifier) operand arrayAddress + localVariable <- lookupLocal identifier + let arrayStatement = ArrayQuadruple localVariable operand arrayAddress pure ( VariableOperand arrayAddress , Vector.snoc statements arrayStatement - ) -} + ) where binaryExpression f lhs rhs = do (lhsOperand, lhsStatements) <- expression localTable lhs |
