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

Portabilityghc
Stabilityalpha
Maintainerbenedikt.huber@gmail.com

Language.C.Analysis.DeclAnalysis

Contents

Description

This module performs the analysis of declarations and the translation of type specifications in the AST.

Synopsis

Translating types

analyseTypeDecl :: MonadTrav m => CDecl -> m Type

get the type of a type declaration

A type declaration T may appear in thre forms:

  • typeof(T)
  • as abstract declarator in a function prototype, as in f(int)
  • in a declaration without declarators, as in struct x { int a } ;

Currently, analyseTypeDecl is exlusively used for analysing types for GNU's typeof(T).

We move attributes to the type, as they have no meaning for the abstract declarator

tType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> [CDerivedDeclr] -> [CDecl] -> m Type

translate a type

tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> m Type

translate a type without (syntactic) indirections Due to the GNU typeof extension and typeDefs, this can be an arbitrary type

tNumType :: MonadTrav m => NumTypeSpec -> m (Either (FloatType, Bool) IntType)

Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.

mergeOldStyle :: MonadTrav m => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]

convert old style parameters

This requires matching parameter names and declarations, as in the following example:

 int f(d,c,a,b)
 char a,*b;
 int c;
 { }

is converted to

 int f(int d, int c, char a, char* b)

TODO: This could be moved to syntax, as it operates on the AST only

Dissecting type specs

data SignSpec

Constructors

NoSignSpec 
Signed 
Unsigned 

Instances

Eq SignSpec 
Ord SignSpec 

data SizeMod

Instances

Eq SizeMod 
Ord SizeMod 

data NumTypeSpec

Constructors

NumTypeSpec 

Helpers

tAttr :: MonadTrav m => CAttr -> m Attr

translate __attribute__ annotations TODO: This is a unwrap and wrap stub

mkVarName :: MonadTrav m => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName

construct a name for a variable TODO: more or less bogus