52 lines
1.3 KiB
Haskell
52 lines
1.3 KiB
Haskell
module Language.Elna.SymbolTable
|
|
( Info(..)
|
|
, ParameterInfo(..)
|
|
, SymbolTable
|
|
, enter
|
|
, lookup
|
|
, symbolTable
|
|
) where
|
|
|
|
import Data.HashMap.Strict (HashMap)
|
|
import qualified Data.HashMap.Strict as HashMap
|
|
import Data.Vector (Vector)
|
|
import Language.Elna.Location (Identifier(..))
|
|
import Language.Elna.Types (Type(..), intType, booleanType)
|
|
import Prelude hiding (lookup)
|
|
|
|
newtype SymbolTable = SymbolTable (HashMap Identifier Info)
|
|
deriving (Eq, Show)
|
|
|
|
instance Semigroup SymbolTable
|
|
where
|
|
(SymbolTable lhs) <> (SymbolTable rhs) = SymbolTable $ rhs <> lhs
|
|
|
|
instance Monoid SymbolTable
|
|
where
|
|
mempty = SymbolTable HashMap.empty
|
|
|
|
symbolTable :: SymbolTable
|
|
symbolTable = SymbolTable $ HashMap.fromList
|
|
[ ("boolean", TypeInfo booleanType)
|
|
, ("int", TypeInfo intType)
|
|
]
|
|
|
|
enter :: Identifier -> Info -> SymbolTable -> SymbolTable
|
|
enter identifier info (SymbolTable table) = SymbolTable
|
|
$ HashMap.insert identifier info table
|
|
|
|
lookup :: Identifier -> SymbolTable -> Maybe Info
|
|
lookup identifier (SymbolTable table) = HashMap.lookup identifier table
|
|
|
|
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)
|