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

Portability | ghc
Stability | alpha
Maintainer | benedikt.huber@gmail.com
Safe Haskell | None

Language.C.Analysis.DefTable

Description

This module manages symbols in local and global scopes.

There are four different kind of identifiers: ordinary identifiers (henceforth simply called `identifier`), tag names (names of struct/union/enum types), labels and structure members.

Synopsis

- type IdentEntry = Either TypeDef IdentDecl
- identOfTyDecl :: IdentEntry -> Ident
- type TagEntry = Either TagFwdDecl TagDef
- data TagFwdDecl
  - = CompDecl CompTypeRef
  - | EnumDecl EnumTypeRef
- data DefTable = DefTable {
  - identDecls :: NameSpaceMap Ident IdentEntry
  - tagDecls :: NameSpaceMap SUERef TagEntry
  - labelDefs :: NameSpaceMap Ident Ident
  - memberDecls :: NameSpaceMap Ident MemberDecl
  - refTable :: IntMap Name
  }
- emptyDefTable :: DefTable
- globalDefs :: DefTable -> GlobalDecls
- enterFunctionScope :: DefTable -> DefTable
- leaveFunctionScope :: DefTable -> DefTable
- enterBlockScope :: DefTable -> DefTable
- leaveBlockScope :: DefTable -> DefTable
- enterMemberDecl :: DefTable -> DefTable
- leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable)
- data DeclarationStatus t
  - = NewDecl
  - | Redeclared t
  - | KeepDef t
  - | Shadowed t
  - | KindMismatch t
- declStatusDescr :: DeclarationStatus t -> String
- defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
- defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
- defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
- defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
- declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable)
- defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable)
- defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable)
- lookupIdent :: Ident -> DefTable -> Maybe IdentEntry
- lookupTag :: SUERef -> DefTable -> Maybe TagEntry
- lookupLabel :: Ident -> DefTable -> Maybe Ident
- lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry
- lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry

# Documentation

type IdentEntry = Either TypeDef IdentDecl

All ordinary identifiers map to `IdenTyDecl`: either a typedef or a object/function/enumerator

identOfTyDecl :: IdentEntry -> Ident

type TagEntry = Either TagFwdDecl TagDef

Tag names map to forward declarations or definitions of struct/union/enum types

data TagFwdDecl

Constructors

CompDecl CompTypeRef |
EnumDecl EnumTypeRef |

Instances

CNode TagFwdDecl |
HasSUERef TagFwdDecl |

data DefTable

Table holding current definitions

Constructors

DefTable |
Fields identDecls :: NameSpaceMap Ident IdentEntry declared `ordinary identifiers' tagDecls :: NameSpaceMap SUERef TagEntry declared structunionenum tags labelDefs :: NameSpaceMap Ident Ident defined labels memberDecls :: NameSpaceMap Ident MemberDecl member declarations (only local) refTable :: IntMap Name link names with definitions

emptyDefTable :: DefTable

empty definition table, with all name space maps in global scope

globalDefs :: DefTable -> GlobalDecls

get the globally defined entries of a definition table

enterFunctionScope :: DefTable -> DefTable

Enter function scope (and the corresponding block scope)

leaveFunctionScope :: DefTable -> DefTable

Leave function scope, and return the associated DefTable. Error if not in function scope.

enterBlockScope :: DefTable -> DefTable

Enter new block scope

leaveBlockScope :: DefTable -> DefTable

Leave innermost block scope

enterMemberDecl :: DefTable -> DefTable

Enter new member declaration scope

leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable)

Leave innermost member declaration scope

data DeclarationStatus t

Status of a declaration

Constructors

NewDecl | new entry
Redeclared t | old def was overwritten
KeepDef t | new def was discarded
Shadowed t | new def shadows one in outer scope
KindMismatch t | kind mismatch

Instances

Typeable1 DeclarationStatus |
Data t => Data (DeclarationStatus t) |

declStatusDescr :: DeclarationStatus t -> String

defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable)

defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)

declare/define a global object/function/typeDef

returns `Redeclared def` if there is already an object/function/typeDef in global scope, or `DifferentKindRedec def` if the old declaration is of a different kind.

defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)

declare/define a object/function/typeDef with lexical scope

returns `Redeclared def` or `DifferentKindRedec def` if there is already an object/function/typeDef in the same scope.

defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)

declare/define a object/function/typeDef with lexical scope, if the given predicate holds on the old entry.

returns `Keep old_def` if the old definition shouldn't be overwritten, and otherwise `Redeclared def` or `DifferentKindRedec def` if there is already an object/function/typeDef in the same scope.

declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable)

declare a tag (fwd decl in case the struct name isn't defined yet)

defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable)

define a tag

defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable)

define a label Return the old label if it is already defined in this function's scope

lookupIdent :: Ident -> DefTable -> Maybe IdentEntry

lookup identifier (object, function, typeDef, enumerator)

lookupTag :: SUERef -> DefTable -> Maybe TagEntry

lookup tag

lookupLabel :: Ident -> DefTable -> Maybe Ident

lookup label

lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry

lookup an object in the innermost scope

lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry

lookup an identifier in the innermost scope