From 2bd965bd5c0265005e9894d99f2d03f5f8b47b98 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 18 Aug 2024 20:13:59 +0200 Subject: [PATCH] Generate IR for while and calls --- lib/Language/Elna/Intermediate.hs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/Language/Elna/Intermediate.hs b/lib/Language/Elna/Intermediate.hs index 50d76c9..c2445ae 100644 --- a/lib/Language/Elna/Intermediate.hs +++ b/lib/Language/Elna/Intermediate.hs @@ -6,6 +6,7 @@ module Language.Elna.Intermediate , intermediate ) where +import Data.Bifunctor (Bifunctor(..)) import Data.Int (Int32) import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap @@ -17,7 +18,6 @@ import qualified Language.Elna.AST as AST import Language.Elna.Types (Type(..)) import Language.Elna.SymbolTable (SymbolTable, Info(..)) import qualified Language.Elna.SymbolTable as SymbolTable -import Data.Maybe (fromMaybe) data Operand = VariableOperand Variable @@ -91,6 +91,26 @@ statement localTable (AST.IfStatement ifCondition ifStatement elseStatement) = <> Vector.snoc ifStatements (LabelQuadruple endLabel) Nothing -> Vector.fromList [jumpConstructor ifLabel, GoToQuadruple endLabel, LabelQuadruple ifLabel] <> Vector.snoc ifStatements (LabelQuadruple endLabel) +statement localTable (AST.WhileStatement whileCondition whileStatement) = + let (conditionStatements, jumpConstructor) = condition localTable whileCondition + whileStatements = statement localTable whileStatement + startLabel = Label "L3" + endLabel = Label "L4" + conditionLabel = Label "L5" + in Vector.fromList [LabelQuadruple conditionLabel] + <> conditionStatements + <> Vector.fromList [jumpConstructor startLabel, GoToQuadruple endLabel, LabelQuadruple startLabel] + <> whileStatements + <> Vector.fromList [GoToQuadruple conditionLabel, LabelQuadruple endLabel] +statement localTable (AST.CallStatement (AST.Identifier callName) arguments) = + let (parameterStatements, argumentStatements) + = bimap (Vector.fromList . fmap ParameterQuadruple) Vector.concat + $ unzip + $ expression localTable <$> arguments + in Vector.snoc (argumentStatements <> parameterStatements) + $ CallQuadruple (Variable callName) + $ fromIntegral + $ Vector.length argumentStatements statement localTable (AST.CompoundStatement statements) = foldMap (statement localTable) statements