4.3 KiB
CMake Antlr4 Package Usage
The antlr4-generator Package
To use the Package you must insert a
find_package(antlr4-generator REQUIRED)
line in your CMakeList.txt file.
The package exposes a function antlr4_generate that generates the required setup to call ANTLR for a
given input file during build.
The following table lists the parameters that can be used with the function:
| Argument# | Required | Default | Use |
|---|---|---|---|
| 0 | Yes | n/a | Unique target name. It is used to generate CMake Variables to reference the various outputs of the generation |
| 1 | Yes | n/a | Input file containing the lexer/parser definition |
| 2 | Yes | n/a | Type of Rules contained in the input: LEXER, PARSER or BOTH |
| 4 | No | FALSE | Boolean to indicate if a listener interface should be generated |
| 5 | No | FALSE | Boolean to indicate if a visitor interface should be generated |
| 6 | No | none | C++ namespace in which the generated classes should be placed |
| 7 | No | none | Additional files on which the input depends |
| 8 | No | none | Library path to use during generation |
The ANTLR4_JAR_LOCATION CMake variable must be set to the location where the antlr-4*-complete.jar generator is located. You can download the file from here.
Additional options to the ANTLR4 generator can be passed in the ANTLR4_GENERATED_OPTIONS variable. Add the installation prefix of antlr4-runtime to CMAKE_PREFIX_PATH or set
antlr4-runtime_DIR to a directory containing the files.
The following CMake variables are available following a call to antlr4_generate
| Output variable | Meaning |
|---|---|
ANTLR4_INCLUDE_DIR_<Target name> |
Directory containing the generated header files |
ANTLR4_SRC_FILES_<Target name> |
List of generated source files |
ANTLR4_TOKEN_FILES_<Target name> |
List of generated token files |
ANTLR4_TOKEN_DIRECTORY_<Target name> |
Directory containing the generated token files |
Sample:
# generate parser with visitor classes.
# put the classes in C++ namespace 'antlrcpptest::'
antlr4_generate(
antlrcpptest_parser
${CMAKE_CURRENT_SOURCE_DIR}/TLexer.g4
LEXER
FALSE
TRUE
"antlrcpptest"
)
Remember that the ANTLR generator requires a working Java installation on your machine!
The antlr4-runtime Package
To use the Package you must insert a
find_package(antlr4-runtime REQUIRED)
line in your CMakeList.txt file.
The package exposes two different targets:
| Target | Use |
|---|---|
| antlr4_shared | Shared library version of the runtime |
| antlr4_static | Static library version of the runtime |
Both set the following CMake variables:
| Output variable | Meaning |
|---|---|
ANTLR4_INCLUDE_DIR |
Include directory containing the runtime header files |
ANTLR4_LIB_DIR |
Library directory containing the runtime library files |
Sample:
# add runtime include directories on this project.
include_directories( ${ANTLR4_INCLUDE_DIR} )
# add runtime to project dependencies
add_dependencies( Parsertest antlr4_shared )
# add runtime to project link libraries
target_link_libraries( Parsertest PRIVATE
antlr4_shared)
Full Example:
# Bring in the required packages
find_package(antlr4-runtime REQUIRED)
find_package(antlr4-generator REQUIRED)
# Set path to generator
set(ANTLR4_JAR_LOCATION ${PROJECT_SOURCE_DIR}/thirdparty/antlr/antlr-4.12.0-complete.jar)
# generate lexer
antlr4_generate(
antlrcpptest_lexer
${CMAKE_CURRENT_SOURCE_DIR}/TLexer.g4
LEXER
FALSE
FALSE
"antlrcpptest"
)
# generate parser
antlr4_generate(
antlrcpptest_parser
${CMAKE_CURRENT_SOURCE_DIR}/TParser.g4
PARSER
FALSE
TRUE
"antlrcpptest"
"${ANTLR4_TOKEN_FILES_antlrcpptest_lexer}"
"${ANTLR4_TOKEN_DIRECTORY_antlrcpptest_lexer}"
)
# add directories for generated include files
include_directories( ${PROJECT_BINARY_DIR} ${ANTLR4_INCLUDE_DIR} ${ANTLR4_INCLUDE_DIR_antlrcpptest_lexer} ${ANTLR4_INCLUDE_DIR_antlrcpptest_parser} )
# add generated source files
add_executable( Parsertest main.cpp ${ANTLR4_SRC_FILES_antlrcpptest_lexer} ${ANTLR4_SRC_FILES_antlrcpptest_parser} )
# add required runtime library
add_dependencies( Parsertest antlr4_shared )
target_link_libraries( Parsertest PRIVATE
antlr4_shared)