ANTLR3 C++ Target
The C++ code generation target
Note: The C++ target was last synced with the 3.4 version of ANTLR
The C++ target closely follows the C target. The API and runtime behavior are consistent to the extent possible.
Please send bug reports, feedback, patches to the antlr-interest mailing list
Requirements
To use generated code, you'll need to include Cpp runtime package in your include path.
Usage
Selecting Cpp output
Just add language=Cpp; to the options section of your grammar:grammar T;
options {
language=Cpp;
other options
}
...
For a grammar T.g ANTLR3 will then create the files TLexer.hpp, TLexer.cpp, TParser.hpp and TParser.cpp which contain the classes TLexer and TParser. Tree Parsers are not yet supported.
Specifying an C++ namespace for your recognizer
You can specify that your generated recognizer should be declared within a specific namespace as shown below. By default all recognizers are generated as top-level types with no enclosing namespace. The Parser has to include the Lexer and both the lexer and Parser have to include the traits
grammar MyGrammar;
options
{
language=Cpp;
}
@parser::namespace { UserNamespace } // Or just @namespace { ... }
@lexer::namespace { UserNamespace }
// rest of grammar follows
....lexer grammar MyGrammar;
options
{
language=Cpp;
}
@includes
{
#include "UserTraits.hpp"
}
@namespace { UserNamespace }
// rest of grammar follows
....parser grammar MyGrammar;
options
{
language=Cpp;
}
@includes
{
#include "UserTraits.hpp"
#include "TLexer.hpp"
}
@namespace{ UserNamespace }
// rest of grammar follows
....
Using the generated classes
To use a grammar T.g:
#include <TParser.hpp>
using namespace UserNamespace;
int main(int argc, char* argv[])
{
TTraits::InputStreamType input(fName, ANTLR_ENC_8BIT);
TLexer lxr(&input); // TLexerNew is generated by ANTLR
TTraits::TokenStreamType tstream(ANTLR_SIZE_HINT, lxr.get_tokSource() );
TParser psr(&tstream); // TParserNew is generated by ANTLR3
psr.entry_rule();
}
Actions
This target currently supports the action scopes @lexer and @parser for global actions. The following action names are known:
namespace-Wrap the generated classes with the specified namespace.header- Will be inserted right after ANTLRs own imports at the top of the generated file.includes,pre-includes,post-include- same meaning as in C Targetinit- Will be inserted at the end of the constructor of the lexer/parser. Here you can setup your own instance attributes.members- Will be inserted in the class body of the lexer/parser. This is the right place for custom methods and class attributes.
Unsupported features
-debugoption: mostly useful for integration into ANTLRWorks.output=template: StringTemplate has not been ported to C++, so template-based recognizers are not supported.TreeParser(output = AST): useful for generating trees