hdirect-0.21.0: src/SymbolTable.lhs
%
%
%
A symbol table abstraction that stores keywords as separate from
user defined type IDs.
\begin{code}
module SymbolTable
(
SymbolTable
, mkSymbolTable -- :: [(String, tok)] -> SymbolTable tok
, newContext -- :: SymbolTable tok -> SymbolTable tok
, lookupSymbol -- :: SymbolTable tok -> String -> Maybe tok
, lookupType -- :: SymbolTable tok -> String -> Maybe tok
, addType -- :: SymbolTable tok -> String -> tok -> SymbolTable tok
, addKeyword -- :: SymbolTable tok -> String -> tok -> SymbolTable tok
, combineSyms -- :: SymbolTable tok -> SymbolTable tok -> SymbolTable tok
) where
import FiniteMap
\end{code}
\begin{code}
data SymbolTable elt =
SymbolTable
(FiniteMap String elt) -- keywords
(FiniteMap String elt) -- user defined types (via typedef.)
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) =
-- at the moment, we consider the kw bit to be constant.
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}