summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elna.cabal1
-rw-r--r--lib/Language/Elna/Intermediate.hs44
-rw-r--r--tests/Language/Elna/NameAnalysisSpec.hs4
3 files changed, 47 insertions, 2 deletions
diff --git a/elna.cabal b/elna.cabal
index c35d9b7..e82cffc 100644
--- a/elna.cabal
+++ b/elna.cabal
@@ -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
diff --git a/lib/Language/Elna/Intermediate.hs b/lib/Language/Elna/Intermediate.hs
new file mode 100644
index 0000000..8c4fec8
--- /dev/null
+++ b/lib/Language/Elna/Intermediate.hs
@@ -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)
diff --git a/tests/Language/Elna/NameAnalysisSpec.hs b/tests/Language/Elna/NameAnalysisSpec.hs
index c6f4504..10e6ee0 100644
--- a/tests/Language/Elna/NameAnalysisSpec.hs
+++ b/tests/Language/Elna/NameAnalysisSpec.hs
@@ -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