/// \page using Using the ANTLR3 C Target
///
/// \section intro Introduction
///
/// Using the ANTLR target involves gaining knowledge of a number of elements:
///
/// -# Writing ANTLR grammars (not covered in this manual);
/// -# How ANTLR works (not covered in this manual);
/// -# How to use the \@sections with the C target
/// -# Interoperation with the runtime within rule actions;
/// -# Implementing custom versions of the standard library methods;
///
/// If you are as yet unfamiliar with how ANTLR works in general, then
/// it is suggested that you read the various <a href="http://www.antlr.org/wiki">wiki pages</a> concerned with
/// getting started. However there are a few things that you should note:
///
/// - The lexer is independent of the parser. You \b cannot control the lexer from within the parser;
/// - The tree parser is independent of the parser. You \b cannot control the parser from within the tree parser(s);
/// - Each tree parser is independent of other tree parsers.
///
/// This means that your lexer runs first and consumes all the input stream until 
/// you stop it programmatically, or it reaches the end of the input stream. It produces
/// a complete stream of tokens, which the parser then consumes.
///
/// \section Using \@sections in a C Targeted Grammar
///
/// Within a grammar file there are a number of special sections you can add that cause the
/// code within them to be placed at strategic points in the generated code such as
/// before or after the #include statements in the .c file, within the generated header file
/// or within the constructor for the recognizer.
///
/// Many of the \@sections used within a Java targeted grammar have some equivalent function within a 
/// C targeted grammar, but their use may well be subtly different. There are also additional sections
/// that have meaning only within a grammar targeted for the C runtime.
///
/// Detailed documentation of these sections is given here: \subpage atsections
///
/// \section interop Interoperation Within Rule Actions
///
/// Rule actions have a limited number of elements they can access by name, independently of the
/// target language generated. These are elements such as $line, $pos, $text and so on. Where the
/// $xxx returns a basic type such as \c int, then you can use these in C as you would in the Java
/// target, but where a reference returns a string, you will get a pointer to the C runtime
/// string implementation #pANTLR3_STRING. This will give you access to things like token text
/// but also provides some convenience methods such as #pANTLR3_STRING->substring() and #pANTLR3_STRING->toUTF8().
///
/// The generated code provides a number of C MACROs, which make it easier to access runtime
/// components. Always use these macros when available, to protect your action code from changes
/// to the underlying implementation.
///
/// Detailed documentation of macros and rule action interoperation is given here: \subpage interop
///
/// \section Custom Implementing Customized Methods
///
/// Unless you wish to create your own tree structures using the built in ANTLR AST rewriting
/// notation, you will rarely need to override the default implementation of runtime methods. The
/// exception to this will be the syntax err reporting method, which is essentially a stub function
/// that you will usually want to provide your own implementation for. You should consider the built in function
/// displayRecognitionError() as an example of where to start as there can be no really useful
/// generic error message display.
///
/// 