summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/SymbolTable.hs
blob: a33df443be9f742270c7b7354e3a6304028b8486 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
module Language.Elna.SymbolTable
    ( Info(..)
    , ParameterInfo(..)
    , SymbolTable(..)
    , Type(..)
    , booleanType
    , intType
    ) where

import Data.HashMap.Strict (HashMap)
import Data.Text (Text)
import Data.Vector (Vector)
import Data.Word (Word32)
import Language.Elna.Location (Identifier(..), showArrayType)

data Type
    = PrimitiveType Text
    | ArrayType Word32 Type
    deriving Eq

instance Show Type
  where
    show (PrimitiveType typeName) = show typeName
    show (ArrayType elementCount typeName) = showArrayType elementCount typeName

intType :: Type
intType = PrimitiveType "int"

booleanType :: Type
booleanType = PrimitiveType "boolean"

newtype SymbolTable = SymbolTable (HashMap Identifier Info)
    deriving (Eq, Show)

data ParameterInfo = ParameterInfo
    { name :: Identifier
    , type' :: Type
    , isReferenceParameter :: Bool
    } deriving (Eq, Show)

data Info
    = TypeInfo Type
    | VariableInfo Type Bool
    | ProcedureInfo SymbolTable (Vector ParameterInfo)
    deriving (Eq, Show)