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

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

Language.C.Data

Contents

- Input stream
- Identifiers
- Unqiue names
- Source code positions
- Syntax tree nodes
- Extensible errors

Description

Common data types for Language.C: Identifiers, unique names, source code locations, ast node attributes and extensible errors.

Synopsis

- module Language.C.Data.InputStream
- data SUERef
  - = AnonymousRef Name
  - | NamedRef Ident
- isAnonymousRef :: SUERef -> Bool
- data Ident
- mkIdent :: Position -> String -> Name -> Ident
- identToString :: Ident -> String
- internalIdent :: String -> Ident
- isInternalIdent :: Ident -> Bool
- builtinIdent :: String -> Ident
- newtype Name = Name {
  - nameId :: Int
  }
- newNameSupply :: [Name]
- data Position = Position String !Int !Int
- class Pos a where
  - posOf :: a -> Position
- initPos :: FilePath -> Position
- posFile :: Position -> String
- posRow :: Position -> Int
- posColumn :: Position -> Int
- nopos :: Position
- builtinPos :: Position
- internalPos :: Position
- isSourcePos :: Position -> Bool
- isBuiltinPos :: Position -> Bool
- isInternalPos :: Position -> Bool
- data NodeInfo
  - = OnlyPos Position
  - | NodeInfo Position Name
- class CNode a where
  - nodeInfo :: a -> NodeInfo
- fileOfNode :: CNode a => a -> FilePath
- posOfNode :: NodeInfo -> Position
- nameOfNode :: NodeInfo -> Maybe Name
- internalNode :: NodeInfo
- mkNodeInfoOnlyPos :: Position -> NodeInfo
- mkNodeInfo :: Position -> Name -> NodeInfo
- module Language.C.Data.Error

# Input stream

module Language.C.Data.InputStream

# Identifiers

data SUERef

References uniquely determining a struct, union or enum type. Those are either identified by an string identifier, or by a unique name (anonymous types).

Constructors

AnonymousRef Name |
NamedRef Ident |

Instances

Eq SUERef |
Data SUERef |
Ord SUERef |
Show SUERef |
Typeable SUERef |
Pretty SUERef |

isAnonymousRef :: SUERef -> Bool

Return true if the struct/union/enum reference is anonymous.

data Ident

C identifiers

Instances

Eq Ident |
Data Ident |
Ord Ident |
Show Ident |
Typeable Ident |
Pos Ident |
CNode Ident |
Pretty Ident |

mkIdent :: Position -> String -> Name -> Ident

build an identifier from a string.

- only minimal error checking, e.g., the characters of the identifier are not checked for being alphanumerical only; the correct lexis of the identifier should be ensured by the caller, e.g., the scanner.
- for reasons of simplicity the complete lexeme is hashed.

identToString :: Ident -> String

string of an identifier

internalIdent :: String -> Ident

returns an internal identifier (has internal position and no unique name)

isInternalIdent :: Ident -> Bool

return `True` if the given identifier is internal

builtinIdent :: String -> Ident

returns a builtin identifier (has builtin position and no unique name)

# Unqiue names

newtype Name

Name is a unique identifier

Constructors

Name |

Fields

nameId :: Int

Instances

Enum Name |
Eq Name |
Data Name |
Ord Name |
Read Name |
Show Name |
Ix Name |
Typeable Name |

newNameSupply :: [Name]

return an infinite stream of `Name`s starting with `nameId` 0

# Source code positions

data Position

uniform representation of source file positions; the order of the arguments is important as it leads to the desired ordering of source positions

Constructors

Position String !Int !Int |

Instances

Eq Position |
Data Position |
Ord Position |
Read Position |
Show Position |
Typeable Position |

class Pos a where

class of type which aggregate a source code location

Methods

posOf :: a -> Position

Instances

Pos NodeInfo |
Pos Ident |
Pos CStrLit |
Pos CConst |
Pos CBuiltin |
Pos CExpr |
Pos CAttr |
Pos CDesignator |
Pos CInit |
Pos CEnum |
Pos CStructUnion |
Pos CTypeQual |
Pos CTypeSpec |
Pos CStorageSpec |
Pos CDeclSpec |
Pos CBlockItem |
Pos CAsmOperand |
Pos CAsmStmt |
Pos CStat |
Pos CDerivedDeclr |
Pos CDeclr |
Pos CDecl |
Pos CFunDef |
Pos CExtDecl |
Pos CTranslUnit |
Pos CToken |
Pos Attr |
Pos Enumerator |
Pos EnumType |
Pos CompType |
Pos EnumTypeRef |
Pos CompTypeRef |
Pos TypeDefRef |
Pos TypeDef |
Pos MemberDecl |
Pos ParamDecl |
Pos FunDef |
Pos ObjDef |
Pos Decl |
Pos DeclEvent |
Pos IdentDecl |
Pos TagDef |
Pos a => Pos [a] |
Pos a => Pos (Reversed a) |
Pos (Located a) |

initPos :: FilePath -> Position

initialize a Position to the start of the translation unit starting in the given file

posFile :: Position -> String

get the source file of the specified position. Fails unless `isSourcePos pos`.

posRow :: Position -> Int

get the line number of the specified position. Fails unless `isSourcePos pos`

posColumn :: Position -> Int

get the column of the specified position. Fails unless `isSourcePos pos`

nopos :: Position

no position (for unknown position information)

builtinPos :: Position

position attached to built-in objects

internalPos :: Position

position used for internal errors

isSourcePos :: Position -> Bool

returns `True` if the given position refers to an actual source file

isBuiltinPos :: Position -> Bool

returns `True` if the given position refers to a builtin definition

isInternalPos :: Position -> Bool

returns `True` if the given position is internal

# Syntax tree nodes

data NodeInfo

Parsed entity attribute

Constructors

OnlyPos Position |
NodeInfo Position Name |

Instances

Eq NodeInfo |
Data NodeInfo |
Ord NodeInfo |
Read NodeInfo |
Show NodeInfo |
Typeable NodeInfo |
Pos NodeInfo |
CNode NodeInfo |

class CNode a where

a class for convenient access to the attributes of an attributed object

Methods

nodeInfo :: a -> NodeInfo

Instances

CNode NodeInfo |
CNode Ident |
CNode CStrLit |
CNode CConst |
CNode CBuiltin |
CNode CExpr |
CNode CAttr |
CNode CDesignator |
CNode CInit |
CNode CEnum |
CNode CStructUnion |
CNode CTypeQual |
CNode CTypeSpec |
CNode CStorageSpec |
CNode CDeclSpec |
CNode CBlockItem |
CNode CAsmOperand |
CNode CAsmStmt |
CNode CStat |
CNode CDerivedDeclr |
CNode CDeclr |
CNode CDecl |
CNode CFunDef |
CNode CExtDecl |
CNode CTranslUnit |
CNode Attr |
CNode Enumerator |
CNode EnumType |
CNode CompType |
CNode EnumTypeRef |
CNode CompTypeRef |
CNode TypeDefRef |
CNode TypeDef |
CNode MemberDecl |
CNode ParamDecl |
CNode FunDef |
CNode ObjDef |
CNode Decl |
CNode DeclEvent |
CNode IdentDecl |
CNode TagDef |
CNode TagFwdDecl |
(CNode a, CNode b) => CNode (Either a b) |

fileOfNode :: CNode a => a -> FilePath

posOfNode :: NodeInfo -> Position

nameOfNode :: NodeInfo -> Maybe Name

internalNode :: NodeInfo

mkNodeInfoOnlyPos :: Position -> NodeInfo

Given only a source position, create a new attribute identifier

mkNodeInfo :: Position -> Name -> NodeInfo

Given a source position and a unique name, create a new attribute identifier

# Extensible errors

module Language.C.Data.Error