From 92990e52f017c3fa0b9ff99f517171051d8c7c18 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Mon, 29 Jul 2024 08:26:47 +0300 Subject: Add typeExpression to type converter --- lib/Language/Elna/SymbolTable.hs | 46 +++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 20 deletions(-) (limited to 'lib/Language/Elna/SymbolTable.hs') diff --git a/lib/Language/Elna/SymbolTable.hs b/lib/Language/Elna/SymbolTable.hs index a33df44..ba2e41f 100644 --- a/lib/Language/Elna/SymbolTable.hs +++ b/lib/Language/Elna/SymbolTable.hs @@ -1,36 +1,42 @@ module Language.Elna.SymbolTable ( Info(..) , ParameterInfo(..) - , SymbolTable(..) - , Type(..) - , booleanType - , intType + , SymbolTable + , enter + , lookup + , symbolTable ) where import Data.HashMap.Strict (HashMap) -import Data.Text (Text) +import qualified Data.HashMap.Strict as HashMap import Data.Vector (Vector) -import Data.Word (Word32) -import Language.Elna.Location (Identifier(..), showArrayType) +import Language.Elna.Location (Identifier(..)) +import Language.Elna.Types (Type(..), intType, booleanType) +import Prelude hiding (lookup) -data Type - = PrimitiveType Text - | ArrayType Word32 Type - deriving Eq +newtype SymbolTable = SymbolTable (HashMap Identifier Info) + deriving (Eq, Show) + +instance Semigroup SymbolTable + where + (SymbolTable lhs) <> (SymbolTable rhs) = SymbolTable $ rhs <> lhs -instance Show Type +instance Monoid SymbolTable where - show (PrimitiveType typeName) = show typeName - show (ArrayType elementCount typeName) = showArrayType elementCount typeName + mempty = SymbolTable HashMap.empty -intType :: Type -intType = PrimitiveType "int" +symbolTable :: SymbolTable +symbolTable = SymbolTable $ HashMap.fromList + [ ("boolean", TypeInfo booleanType) + , ("int", TypeInfo intType) + ] -booleanType :: Type -booleanType = PrimitiveType "boolean" +enter :: Identifier -> Info -> SymbolTable -> SymbolTable +enter identifier info (SymbolTable table) = SymbolTable + $ HashMap.insert identifier info table -newtype SymbolTable = SymbolTable (HashMap Identifier Info) - deriving (Eq, Show) +lookup :: Identifier -> SymbolTable -> Maybe Info +lookup identifier (SymbolTable table) = HashMap.lookup identifier table data ParameterInfo = ParameterInfo { name :: Identifier -- cgit v1.2.3