Generate IR for while and calls
This commit is contained in:
parent
6a54b66421
commit
2bd965bd5c
@ -6,6 +6,7 @@ module Language.Elna.Intermediate
|
|||||||
, intermediate
|
, intermediate
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Data.Bifunctor (Bifunctor(..))
|
||||||
import Data.Int (Int32)
|
import Data.Int (Int32)
|
||||||
import Data.HashMap.Strict (HashMap)
|
import Data.HashMap.Strict (HashMap)
|
||||||
import qualified Data.HashMap.Strict as 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.Types (Type(..))
|
||||||
import Language.Elna.SymbolTable (SymbolTable, Info(..))
|
import Language.Elna.SymbolTable (SymbolTable, Info(..))
|
||||||
import qualified Language.Elna.SymbolTable as SymbolTable
|
import qualified Language.Elna.SymbolTable as SymbolTable
|
||||||
import Data.Maybe (fromMaybe)
|
|
||||||
|
|
||||||
data Operand
|
data Operand
|
||||||
= VariableOperand Variable
|
= VariableOperand Variable
|
||||||
@ -91,6 +91,26 @@ statement localTable (AST.IfStatement ifCondition ifStatement elseStatement) =
|
|||||||
<> Vector.snoc ifStatements (LabelQuadruple endLabel)
|
<> Vector.snoc ifStatements (LabelQuadruple endLabel)
|
||||||
Nothing -> Vector.fromList [jumpConstructor ifLabel, GoToQuadruple endLabel, LabelQuadruple ifLabel]
|
Nothing -> Vector.fromList [jumpConstructor ifLabel, GoToQuadruple endLabel, LabelQuadruple ifLabel]
|
||||||
<> Vector.snoc ifStatements (LabelQuadruple endLabel)
|
<> 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) =
|
statement localTable (AST.CompoundStatement statements) =
|
||||||
foldMap (statement localTable) statements
|
foldMap (statement localTable) statements
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user