summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Glue.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Language/Elna/Glue.hs')
-rw-r--r--lib/Language/Elna/Glue.hs34
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