%
%
%
A symbol table abstraction that stores keywords as separate from
user defined type IDs.
\begin{code}
module SymbolTable
(
SymbolTable
, mkSymbolTable
, newContext
, lookupSymbol
, lookupType
, addType
, addKeyword
, combineSyms
) where
import FiniteMap
\end{code}
\begin{code}
data SymbolTable elt =
SymbolTable
(FiniteMap String elt)
(FiniteMap String elt)
mkSymbolTable :: [(String,tok)] -> SymbolTable tok
mkSymbolTable ls = SymbolTable (listToFM ls) emptyFM
newContext :: SymbolTable tok -> SymbolTable tok
newContext (SymbolTable keyw _) = SymbolTable keyw emptyFM
combineSyms :: SymbolTable tok -> SymbolTable tok -> SymbolTable tok
combineSyms (SymbolTable kw1 ty1) (SymbolTable _ ty2) =
SymbolTable kw1 (plusFM ty1 ty2)
addKeyword :: SymbolTable tok -> String -> tok -> SymbolTable tok
addKeyword (SymbolTable kw ty) str tok =
SymbolTable (addToFM kw str tok) ty
addType :: SymbolTable tok -> String -> tok -> SymbolTable tok
addType (SymbolTable kw ty) str tok =
SymbolTable kw (addToFM ty str tok)
lookupSymbol :: SymbolTable tok -> String -> Maybe tok
lookupSymbol (SymbolTable kw ty) str =
case lookupFM kw str of
Nothing -> lookupFM ty str
v -> v
lookupType :: SymbolTable tok -> String -> Maybe tok
lookupType (SymbolTable _ ty) str = lookupFM ty str
\end{code}