module Language.Elna.SymbolTable ( Info(..) , ParameterInfo(..) , SymbolTable , empty , 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) ] empty :: SymbolTable empty = SymbolTable HashMap.empty 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)