Add IR quadruple definitions
This commit is contained in:
parent
38a8d6811c
commit
f78592378a
@ -31,6 +31,7 @@ library elna-internal
|
||||
import: warnings
|
||||
exposed-modules:
|
||||
Language.Elna.AST
|
||||
Language.Elna.Intermediate
|
||||
Language.Elna.Location
|
||||
Language.Elna.NameAnalysis
|
||||
Language.Elna.Parser
|
||||
|
44
lib/Language/Elna/Intermediate.hs
Normal file
44
lib/Language/Elna/Intermediate.hs
Normal file
@ -0,0 +1,44 @@
|
||||
module Language.Elna.Intermediate
|
||||
( Label(..)
|
||||
, Operand(..)
|
||||
, Quadruple(..)
|
||||
, Variable(..)
|
||||
) where
|
||||
|
||||
import Data.Int (Int32)
|
||||
import Data.Word (Word32)
|
||||
import Data.Text (Text)
|
||||
|
||||
data Operand
|
||||
= VariableOperand Text
|
||||
| IntOperand Int32
|
||||
deriving (Eq, Show)
|
||||
|
||||
newtype Label = Label Text
|
||||
deriving (Eq, Show)
|
||||
|
||||
newtype Variable = Variable Text
|
||||
deriving (Eq, Show)
|
||||
|
||||
data Quadruple
|
||||
= StartQuadruple
|
||||
| GoToQuadruple Label
|
||||
| AssignQuadruple Operand Variable
|
||||
| ArrayQuadruple Variable Word32 Variable
|
||||
| ArrayAssignQuadruple Operand Word32 Variable
|
||||
| AddQuadruple Operand Operand Variable
|
||||
| SubtractionQuadruple Operand Operand Variable
|
||||
| ProductQuadruple Operand Operand Variable
|
||||
| DivisionQuadruple Operand Operand Variable
|
||||
| NegationQuadruple Operand Variable
|
||||
| EqualQuadruple Operand Operand Label
|
||||
| NonEqualQuadruple Operand Operand Label
|
||||
| LessQuadruple Operand Operand Label
|
||||
| GreaterQuadruple Operand Operand Label
|
||||
| LessOrEqualQuadruple Operand Operand Label
|
||||
| GreaterOrEqualQuadruple Operand Operand Label
|
||||
| LabelQuadruple Label
|
||||
| ParameterQuadruple Operand
|
||||
| CallQuadruple Variable Word32
|
||||
| StopQuadruple
|
||||
deriving (Eq, Show)
|
@ -57,7 +57,7 @@ spec = describe "nameAnalysis" $ do
|
||||
|
||||
it "puts parameters into the local symbol table" $ do
|
||||
let given = "proc main(ref param: int) {}"
|
||||
expected = SymbolTable.enter "param" (VariableInfo intType True) SymbolTable.empty
|
||||
expected = SymbolTable.enter "param" (VariableInfo True intType) SymbolTable.empty
|
||||
actual <- nameAnalysisOnText given
|
||||
|
||||
case SymbolTable.lookup "main" <$> actual of
|
||||
@ -68,7 +68,7 @@ spec = describe "nameAnalysis" $ do
|
||||
|
||||
it "puts variables into the local symbol table" $ do
|
||||
let given = "proc main() { var var1: int; }"
|
||||
expected = SymbolTable.enter "var1" (VariableInfo intType False) SymbolTable.empty
|
||||
expected = SymbolTable.enter "var1" (VariableInfo False intType) SymbolTable.empty
|
||||
actual <- nameAnalysisOnText given
|
||||
|
||||
case SymbolTable.lookup "main" <$> actual of
|
||||
|
Loading…
Reference in New Issue
Block a user