language-c-0.6.1: Analysis and generation of C code

Copyright(c) 2008 Benedikt Huber
LicenseBSD-style
Maintainerbenedikt.huber@gmail.com
Stabilityalpha
Portabilityghc
Safe HaskellNone
LanguageHaskell98

Language.C.Analysis.TravMonad

Contents

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

Name generation monad

class Monad m => MonadName m where #

Minimal complete definition

genName

Methods

genName :: m Name #

unique name generation

Instances

MonadName (Trav s) # 

Methods

genName :: Trav s Name #

Symbol table monad

class Monad m => MonadSymtab m where #

Minimal complete definition

getDefTable, withDefTable

Methods

getDefTable :: m DefTable #

return the definition table

withDefTable :: (DefTable -> (a, DefTable)) -> m a #

perform an action modifying the definition table

Instances

Specialized C error-handling monad

class Monad m => MonadCError m where #

Minimal complete definition

throwTravError, catchTravError, recordError, getErrors

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 occurred (without throwing it)

getErrors :: m [CError] #

return the list of recorded errors

Instances

MonadCError (Trav s) # 

Methods

throwTravError :: Error e => e -> Trav s a #

catchTravError :: Trav s a -> (CError -> Trav s a) -> Trav s a #

recordError :: Error e => e -> Trav s () #

getErrors :: Trav s [CError] #

AST traversal monad

class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m where #

Traversal monad

Minimal complete definition

handleDecl

Methods

handleDecl :: DeclEvent -> m () #

handling declarations and definitions

Instances

MonadTrav (Trav s) # 

Methods

handleDecl :: DeclEvent -> Trav s () #

Handling declarations

handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m () #

forward declaration of a tag. Only necessary 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).

handleObjectDef :: MonadTrav m => Bool -> Ident -> ObjDef -> m () #

handle object defintions (maybe tentative)

handleFunDef :: MonadTrav m => Ident -> FunDef -> m () #

handle function definitions

handleVarDecl :: MonadTrav m => Bool -> 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

Symbol table scope modification

Symbol table lookup (delegate)

lookupTypeDef :: (MonadCError m, MonadSymtab 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 :: (MonadCError m, MonadSymtab m) => Ident -> m (Maybe IdentDecl) #

lookup an object, function or enumerator

Symbol table modification

createSUERef :: (MonadCError m, MonadSymtab 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 occurred

handleTravError :: MonadCError m => m a -> m (Maybe a) #

throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a #

raise an error based on an Either argument

astError :: MonadCError m => NodeInfo -> String -> m a #

raise an error caused by a malformed AST

warn :: (Error e, MonadCError m) => e -> m () #

Trav - default MonadTrav implementation

data Trav s a #

simple traversal monad, providing user state and callbacks

Instances

Monad (Trav s) # 

Methods

(>>=) :: Trav s a -> (a -> Trav s b) -> Trav s b #

(>>) :: Trav s a -> Trav s b -> Trav s b #

return :: a -> Trav s a #

fail :: String -> Trav s a #

Functor (Trav s) # 

Methods

fmap :: (a -> b) -> Trav s a -> Trav s b #

(<$) :: a -> Trav s b -> Trav s a #

Applicative (Trav s) # 

Methods

pure :: a -> Trav s a #

(<*>) :: Trav s (a -> b) -> Trav s a -> Trav s b #

(*>) :: Trav s a -> Trav s b -> Trav s b #

(<*) :: Trav s a -> Trav s b -> Trav s a #

MonadTrav (Trav s) # 

Methods

handleDecl :: DeclEvent -> Trav s () #

MonadCError (Trav s) # 

Methods

throwTravError :: Error e => e -> Trav s a #

catchTravError :: Trav s a -> (CError -> Trav s a) -> Trav s a #

recordError :: Error e => e -> Trav s () #

getErrors :: Trav s [CError] #

MonadSymtab (Trav s) # 

Methods

getDefTable :: Trav s DefTable #

withDefTable :: (DefTable -> (a, DefTable)) -> Trav s a #

MonadName (Trav s) # 

Methods

genName :: Trav s Name #

runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s) #

runTrav_ :: Trav () a -> Either [CError] (a, [CError]) #

data TravState s #

withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a #

modifyUserState :: (s -> s) -> Trav s () #

data TravOptions #

Constructors

TravOptions 

Fields

Language options

data CLanguage #

The variety of the C language to accept. Note: this is not yet enforced.

Constructors

C89 
C99 
GNU89 
GNU99 

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] #