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
-debug
option: 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