summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-08-18 20:13:59 +0200
committerEugen Wissner <belka@caraus.de>2024-08-18 20:13:59 +0200
commit2bd965bd5c0265005e9894d99f2d03f5f8b47b98 (patch)
treea87ec80f81adc5470e45a35eaaa8767aad9cd55d
parent6a54b66421384a6d37a734c47331fe432adeb80c (diff)
downloadelna-2bd965bd5c0265005e9894d99f2d03f5f8b47b98.tar.gz
Generate IR for while and calls
-rw-r--r--lib/Language/Elna/Intermediate.hs22
1 files changed, 21 insertions, 1 deletions
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