1/// \page atsections Using Sections Within Grammar Files 2/// 3/// \section intro Introduction 4/// 5/// A C targeted grammar can make use of special annotations within a grammar 6/// file, which are prefixed with the <b>\@</b> character. These sections cause the 7/// the placement of their contents within the generated code at defined points 8/// such as within the generated C header file. 9/// 10/// The general form of these annotations is: 11/// 12/// \code 13/// section 14/// : '@' (( 'parser' | 'lexer' ) '::')? SECTIONNAME '{' yourcode '}' 15/// ; 16/// \endcode 17/// 18/// If the 'parser' or lexer keywords are left out of the specification, then the 19/// ANTLR tool assumes a lexer target for a lexer grammar, a parser target for a parser 20/// or tree parser grammar, and a parser target for a combined lexer/parser grammar. You 21/// are advised as a matter of course to include the parser or lexer target keyword. 22/// 23/// Documentation regarding the \@sections available for a grammar targeted at C now 24/// follows. 25/// 26/// \subsection psrinit Sections \@init and \@declarations 27/// 28/// Java targeted grammars allow the special section <code>\@init</code> to be placed after the declaration 29/// of a rule (lexer, parser and tree parser rules). This allows you to both declare and initialize 30/// variables that are local to the code generated for that rule. You can then reference them within 31/// your rule action code. 32/// 33/// With the C target, the generated code is subject to the restrictions of C semantics and this 34/// means that you must declare any local variables, then assign to them afterwards. As well as the 35/// <code>\@init</code> section, which C programmers should use to initialize their local variables, the C 36/// target provides the <code>\@declarations</code> section, which is also a rule based section. This section 37/// is where the C programmer should declare the local variables, thus separating their declaration 38/// from their initialization. Here is an example: 39/// 40/// \code 41/// translation_unit 42/// @declarations 43/// { 44/// pANTLR3_BOOLEAN hasUsing; 45/// } 46/// @init 47/// { 48/// 49/// // Assume no Using directives 50/// // 51/// hasUsing = ANTLR3_FALSE; 52/// 53/// } 54/// : rulea ruleb ... 55/// 56/// \endcode 57/// 58/// Using the <code>\@declarations</code> and <code>\@init</code> sections guarantees that your generated code will 59/// compile correctly on any standard C compiler (assuming, of course, that you type in valid C code.) 60/// 61/// \subsection psrheader \@header section. 62/// 63/// The <code>\@parser::header</code> or <code>\@lexer::header</code> annotations cause the code they encapsulate 64/// to be placed at the start of each generated file, regardless of whether it is a .c or .h file. This can 65/// be useful for inserting copyright information and so on in all your generated files. 66/// 67/// \bNOTE: Be careful not to confuse this concept with placing code in the generated .h header file. The name choice is 68/// unfortunate, but was already used in the Java target to allow the placement of \c imports statements 69/// in generated java classes. We have therefore kept the intent of this section the same. 70/// 71/// Here is an example: 72//// 73/// \code 74/// @lexer::header 75/// { 76/// // Copyright (c) Jim Idle 2007 - All your grammar are belong to us. 77/// } 78/// 79/// @parser::header 80/// { 81/// // Copyright (c) Jim Idle 2007 - All your grammar are belong to us. 82/// } 83/// \endcode 84/// 85/// 86/// \subsection hdrinclude \@includes section 87/// 88/// The <code>\@parser::includes</code> or <code>\@lexer::includes</code> annotations cause 89/// the code they encapsulate to be placed in the generated .h file, \b after the standard 90/// includes required by the ANTLR generated code. 91/// 92/// Here you could for instance place a <code>\#include</code> 93/// statement to cause your grammar code to include some standard definitions. Because you 94/// may use multiple parsers and lexers in your solution, you should probably not place 95/// <code>#define</code> statements here, but in the <code>\@postinclude</code> section. Then you 96/// may create different <code>\#defines</code> for different recognizers. 97/// 98/// Here is an example: 99//// 100/// \code 101/// @lexer::includes 102/// { 103/// #include "myprojectcommondefs.h" 104/// } 105/// 106/// @parser::includes 107/// { 108/// #include "myprojectcommondefs.h" 109/// } 110/// \endcode 111/// 112/// 113/// \subsection hdrpreinclude \@preincludes section 114/// 115/// The <code>\@parser::preincludes</code> or <code>\@lexer::preincludes</code> annotations cause 116/// the code they encapsulate to be placed in the generated .h file, \b before the standard 117/// includes required by the ANTLR generated code. 118/// 119/// You should use this section when you wish to place #defines and other definitions 120/// in the code before the standard ANTLR runtime includes defined them. This allows you 121/// to override any predefined symbols and options that the includes otherwise take 122/// defaults for. For instance, if you have built a version of the runtime with a 123/// special version of malloc, you can <code>\#define</code> #ANTLR3_MALLOC to match the definition 124/// you used for the ANTLR runtime library. 125/// 126/// \subsection hdrpostinclude \@postinclude section 127/// 128/// The <code>\@parser::postinclude</code> or <code>\@lexer::postinclude</code> annotations cause 129/// the code they encapsulate to be placed in the generated <b>.C</b> file, after the generated include 130/// file (which includes the standard ANTLR3C library includes. 131/// 132/// Code you place here then will be subject to any macros defined by your own includes, by the 133/// generated include and by the standard ANTLR3 includes. This is a good place to <code>\#undef</code> 134/// anything that you don;t like the default values of, but cannot override before the includes 135/// define them. 136/// 137/// This is also a good place to <code>#define</code> any macros you may wish to use in the generated 138/// .c file. As you can include multiple parsers in your projects, you will need to include the 139/// generated .h file of each of them, possibly globally, but almost certainly in a context where you 140/// are including more than one .h file simultaneously. Hence if you commonly use the same macro 141/// names for accessing structures and so on, and they change from grammar to grammar, you should 142/// define them here to avoid creating conflicting definitions in the header files. 143///