module languages/ansi-c/syntax/Default-C-With-CPP

imports languages/generic-cpp/syntax/Whitespace
imports languages/generic-cpp/syntax/CommentsAsLayout

imports languages/ansi-c/syntax/C

%% This module shows a typical C/CPP combination that may work for your C
%% files. There is no guarantee however, since one can not predict
%% in which ways the preprocessor statements are intertwined with the C
%% constructs. This module covers a lot of 'nice' uses of the preprocessor.

%% generic CPP substitions
imports languages/generic-cpp/syntax/Substitutions[Identifier Expression StringConstant]

%% where can we put include directives
imports languages/generic-cpp/syntax/Includes[ExternalDeclaration]

%% definition of expression macros
imports languages/generic-cpp/syntax/Macros[Identifier Expression Statement]

%% Conditional statements 
imports languages/generic-cpp/syntax/Conditionals[
	Identifier
	Expression
	Statement+
	Statement
]

%% Conditional declarations
imports languages/generic-cpp/syntax/Conditionals[
	Identifier
	Expression
	Declaration+
	Declaration
]

%% Conditional part of a block statement:
imports languages/generic-cpp/syntax/Conditionals[
	Identifier
	Expression
	(Declaration+ Statement+)
	Statement
]

%% Conditional functions
imports languages/generic-cpp/syntax/Conditionals[
	Identifier
	{Expression ";"}+
	ExternalDeclaration+
	FunctionDefinition
]

%% Macros with expressions as definitions
imports languages/generic-cpp/syntax/Macros[
	Identifier
	Expression
	Declaration
]

%% Macros with bracketed statements as definitions
imports languages/generic-cpp/syntax/Macros[
	Identifier
	( "(" Statement ")" )
	Declaration
]

%% Macros with normal statements as definitions
imports languages/generic-cpp/syntax/Macros[
	Identifier 
	Statement
	Declaration
]

%% Macro that yield a declaration without ; at the end
imports languages/generic-cpp/syntax/Macros[
	Identifier
	( Specifier+ {InitDeclarator ","}+ )
	Declaration
]

%% Macro that yields a while with one statement without ; at the end
imports languages/generic-cpp/syntax/Macros[
	Identifier
	( "while" "(" Expression ")" Expression)
	Declaration
]

%% Macro that yields a do while without ; at the end
imports languages/generic-cpp/syntax/Macros[
	Identifier
	( "do" Statement "while" "(" Expression ")" )
	Declaration
]
exports

context-free syntax
	"va_arg" "(" Expression "," TypeName ")" -> Expression {prefer}

hiddens

context-free start-symbols
	TranslationUnit
