1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
|
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.9.2-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)
