dmd.cparse
Takes a token stream from the lexer, and parses it into an abstract syntax tree.
Specification: C11
License
Source: cparse.d
Documentation: https://dlang.org/phobos/dmd_cparse.html
-
Declaration
classCParser(AST): Parser!AST;-
Declaration
booladdFuncName;add declaration of _func__ to function symbol table
-
Declaration
boolimportBuiltins;seen use of C compiler builtins, so import _builtins;
-
Declaration
Array!(void*)typedefTab;Array of AST.Type[Identifier], typedef's indexed by Identifier
-
Declaration
AST.Dsymbols*parseModule();Parse translation unit. C11 6.9 translation-unit: external-declaration translation-unit external-declaration
Discussion
external-declaration: function-definition declaration
Return Value
array of Dsymbols that were declared
-
Declaration
AST.StatementcparseStatement(intflags, const(char)**endPtr= null, Loc*pEndloc= null);Statement Parser
Discussion
C11 6.8 statement: labeled-statement compound-statement expression-statement selection-statement iteration-statement jump-statement
Parameters
intflagsPSxxxx
const(char)**endPtrstore location of closing brace
Loc*pEndlocif { ... statements ... }, store location of closing brace, otherwise loc of last token of statement
Return Value
parsed statement
-
Declaration
AST.ExpressioncparseExpression();Expression Parser
Discussion
C11 6.5.17 expression: assignment-expression expression , assignment-expression
-
Declaration
AST.ExpressioncparsePrimaryExp();C11 6.5.1 primary-expression: identifier constant string-literal ( expression ) generic-selection _builtin_va_arg(assign_expression, type)
-
Declaration
AST.ExpressioncparseAssignExp();C11 6.5.16 assignment-expression: conditional-expression unary-expression assignment-operator assignment-expression
Discussion
assignment-operator: = *= /= %= += -= <<= >>= &= ^= |=
-
Declaration
voidcparseDeclaration(LVLlevel);Declaration Parser
Discussion
C11 6.7 declaration: declaration-specifiers init-declarator-list (opt) ; static_assert-declaration
init-declarator-list: init-declarator init-declarator-list , init-declarator
init-declarator: declarator declarator = initializerParameters
LVLleveldeclaration context
-
Declaration
AST.DsymbolcparseFunctionDefinition(Identifierid, AST.TypeFunctionft, ref Specifierspecifier);C11 Function Definitions function-definition declaration-specifiers declarator declaration-list (opt) compound-statement
Discussion
declaration-list: declaration declaration-list declaration
It's already been parsed up to the declaration-list (opt). Pick it up from there.Parameters
Identifieridfunction identifier
AST.TypeFunctionftfunction type
Specifierspecifierfunction specifiers
Return Value
Dsymbol for the function
-
Declaration
AST.InitializercparseInitializer();C11 Initialization initializer: assignment-expression { initializer-list } { initializer-list , }
Discussion
initializer-list: designation (opt) initializer initializer-list , designation (opt) initializer
designation: designator-list =
designator-list: designator designator-list designator
designator: [ constant-expression ] . identifierReturn Value
initializer
-
Declaration
MODcparseTypeQualifierList();C11 6.7.3 type-qualifier: const restrict volatile Atomic _stdcall
-
Declaration
AST.TypecparseTypeName();C11 6.7.7
-
Declaration
AST.TypecparseSpecifierQualifierList(LVLlevel, ref Specifierspecifier);C11 6.7.2.1
specifier-qualifier-list: type-specifierspecifier-qualifier-list (opt) type-qualifierspecifier-qualifier-list (opt)Parameters
LVLleveldeclaration context
Specifierspecifierspecifiers in and out
Return Value
resulting type,
nullif not specified -
Declaration
AST.ParameterListcparseParameterList();C11 6.7.6.3 ( parameter-type-list ) ( identifier-list (opt) )
-
Declaration
voidcparseStructDeclaration(AST.Dsymbols*members);C11 6.7.2.1 Parse a struct declaration member. struct-declaration: specifier-qualifier-list struct-declarator-list (opt) ; static_assert-declaration
Discussion
struct-declarator-list: struct-declarator struct-declarator-list , struct-declarator
struct-declarator: declarator declarator (opt) : constant-expressionParameters
AST.Dsymbols*memberswhere to put the fields (
members) -
Declaration
boolisDeclarationList(ref Token*pt);See if declaration-list is present.
Return Value
trueif declaration-list is present, even an empty one -
Declaration
enumLVL; -
Declaration
enumDTR;Types of declarator to parse
-
Declaration
xdirectC11 6.7.6 direct-declarator
-
Declaration
xabstractC11 6.7.7 abstract-declarator
-
Declaration
xparameterparameter declarator may be either direct or abstract
-
-
Declaration
enumSCW: uint;C11 6.7.1 Storage-class specifiers
-
Declaration
enumMOD: uint;C11 6.7.3 Type qualifiers
-
Declaration
structSpecifier;Aggregate for all the various specifiers
-
Declaration
boolnoreturn;noreturnattribute -
Declaration
SCWscw;storage-class specifiers
-
Declaration
MODmod;type qualifiers
-
Declaration
AST.Expressions*alignExps;alignment
-
Declaration
structalign_tpackalign;#pragma pack alignment value
-
-
Declaration
StorageClassspecifiersToSTC(LVLlevel, const ref Specifierspecifier);Convert from C specifiers to D storage class
Parameters
LVLleveldeclaration context
Specifierspecifierspecifiers, context, etc.
Return Value
corresponding D storage class
-
Declaration
voidpanic();After encountering an error, scan forward until a right brace or ; is found or the end of the file.
-
Declaration
boolisFunctionTypedef(AST.Typet);typedefTab symbol table
Discussion
Determines if type
tis a function type.Parameters
AST.Typettype to test
Return Value
trueif it represents a function -
Declaration
boolisTypedef(Identifierid);Determine if
is a symbol for a Typedef.idParameters
Identifieridpossible typedef
Return Value
trueifidis a Type -
Declaration
voidinsertIdToTypedefTab(Identifierid);Add
to typedefTab[], but only if it will mask an existing typedef.idParameters
Identifierididentifier for non-typedef symbol
-
Declaration
voidinsertTypedefToTypedefTab(Identifierid, AST.Typet);Add
to typedefTab[]idParameters
Identifierididentifier for typedef symbol
AST.Typettype of the typedef symbol
-
Declaration
AST.Type*lookupTypedef(Identifierid);Lookup
idin typedefTab[].Return Value
if not found, then
null. if found, then Type*. Deferencing it will yieldnullif it is not a typedef, and a type if it is a typedef. -
Declaration
boolparseSpecialTokenSequence();Directive Parser
-
Declaration
voidaddDefines();#define Parser
Discussion
Go through the #define's in the defines buffer and see what we can convert to Dsymbols, which are then appended to symbols[]
-