 | language-c-0.3.2.1: Analysis and generation of C code | Contents | Index |
|
Language.C.Analysis.TravMonad | Portability | ghc | Stability | alpha | Maintainer | benedikt.huber@gmail.com |
|
|
|
|
|
Description |
Monad for Traversals of the C AST.
For the traversal, we maintain a symboltable and need MonadError and unique
name generation facilities.
Furthermore, the user may provide callbacks to handle declarations and definitions.
|
|
Synopsis |
|
|
|
|
AST traversal monad
|
|
class Monad m => MonadTrav m where |
Traversal monad
| | Methods | throwTravError :: Error e => e -> m a | throw an Error
| | catchTravError :: m a -> (CError -> m a) -> m a | catch an Error (we could implement dynamically-typed catch here)
| | recordError :: Error e => e -> m () | remember that an Error occured (without throwing it)
| | getErrors :: m [CError] | return the list of recorded errors
| | getDefTable :: m DefTable | return the definition table
| | withDefTable :: (DefTable -> (a, DefTable)) -> m a | perform an action modifying the definition table
| | genName :: m Name | unique name generation
| | handleDecl :: DeclEvent -> m () | handling declarations and definitions
|
| | Instances | |
|
|
Handling declarations
|
|
handleTagDecl :: MonadTrav m => TagFwdDecl -> m () |
forward declaration of a tag. Only neccessary for name analysis, but otherwise no semantic
consequences.
|
|
handleTagDef :: MonadTrav m => TagDef -> m () |
define the given composite type or enumeration
If there is a declaration visible, overwrite it with the definition.
Otherwise, enter a new definition in the current namespace.
If there is already a definition present, yield an error (redeclaration).
|
|
handleEnumeratorDef :: MonadTrav m => Enumerator -> m () |
|
handleTypeDef :: MonadTrav m => TypeDef -> m () |
|
handleObjectDef :: MonadTrav m => Ident -> ObjDef -> m () |
handle object defintions (maybe tentative)
|
|
handleFunDef :: MonadTrav m => Ident -> FunDef -> m () |
handle function definitions
|
|
handleVarDecl :: MonadTrav m => Decl -> m () |
handle variable declarations (external object declarations and function prototypes)
variable declarations are either function prototypes, or external declarations, and not very
interesting on their own. we only put them in the symbol table and call the handle.
declarations never override definitions
|
|
handleParamDecl :: MonadTrav m => ParamDecl -> m () |
handle parameter declaration. The interesting part is that parameters can be abstract
(if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope),
checking if there are duplicate definitions.
FIXME: I think it would be more transparent to handle parameter declarations in a special way
|
|
handleAsmBlock :: MonadTrav m => AsmBlock -> m () |
|
Symbol table scope modification
|
|
enterPrototypeScope :: MonadTrav m => m () |
|
leavePrototypeScope :: MonadTrav m => m () |
|
enterFunctionScope :: MonadTrav m => m () |
|
leaveFunctionScope :: MonadTrav m => m () |
|
enterBlockScope :: MonadTrav m => m () |
|
leaveBlockScope :: MonadTrav m => m () |
|
Symbol table lookup (delegate)
|
|
lookupTypeDef :: MonadTrav m => Ident -> m Type |
lookup a type definition
the 'wrong kind of object' is an internal error here,
because the parser should distinguish typeDefs and other
objects
|
|
lookupObject :: MonadTrav m => Ident -> m (Maybe IdentDecl) |
lookup an object, function or enumerator
|
|
Symbol table modification
|
|
createSUERef :: MonadTrav m => NodeInfo -> Maybe Ident -> m SUERef |
create a reference to a struct/union/enum
This currently depends on the fact the structs are tagged with unique names.
We could use the name generation of TravMonad as well, which might be the better
choice when dealing with autogenerated code.
|
|
Additional error handling facilities
|
|
hadHardErrors :: [CError] -> Bool |
check wheter non-recoverable errors occured
|
|
handleTravError :: MonadTrav m => m a -> m (Maybe a) |
|
throwOnLeft :: (MonadTrav m, Error e) => Either e a -> m a |
raise an error based on an Either argument
|
|
astError :: MonadTrav m => NodeInfo -> String -> m a |
raise an error caused by a malformed AST
|
|
warn :: (Error e, MonadTrav m) => e -> m () |
|
Trav - default MonadTrav implementation
|
|
data Trav s a |
simple traversal monad, providing user state and callbacks
| Instances | |
|
|
runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s) |
|
runTrav_ :: Trav () a -> Either [CError] (a, [CError]) |
|
data TravState s |
|
initTravState :: s -> TravState s |
|
withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a |
|
modifyUserState :: (s -> s) -> Trav s () |
|
userState :: TravState s -> s |
|
travErrors :: TravState s -> [CError] |
|
Helpers
|
|
mapMaybeM :: Monad m => Maybe a -> (a -> m b) -> m (Maybe b) |
|
maybeM :: Monad m => Maybe a -> (a -> m ()) -> m () |
|
mapSndM :: Monad m => (b -> m c) -> (a, b) -> m (a, c) |
|
concatMapM :: Monad m => (a -> m [b]) -> [a] -> m [b] |
|
Produced by Haddock version 2.7.2 |