FindFLEX¶
查找快速词法分析器 (Flex) 命令行生成器及其库,并提供 CMake 命令来创建使用 Flex 的自定义构建规则
find_package(FLEX [<version>] ...)
Flex 生成词法分析器,也称为 扫描器 或 词法分析器。它还包括一个运行时库(fl
),为生成的扫描器提供支持函数,例如输入处理、缓冲区管理和错误报告。
结果变量¶
此模块定义了以下变量
FLEX_FOUND
布尔值,指示是否找到(请求版本的)Flex。
FLEX_VERSION
找到的 Flex 版本。
FLEX_INCLUDE_DIRS
包含用于使用 Flex 库的头文件的包含目录。
FLEX_LIBRARIES
链接以使用 Flex 库所需的库。
缓存变量¶
以下缓存变量也可以设置
FLEX_EXECUTABLE
flex
可执行文件的路径。
命令¶
如果找到 flex
,此模块提供以下命令
生成扫描器¶
- flex_target¶
创建自定义构建规则,以使用 Flex 从 lex 文件生成扫描器文件
flex_target( <name> <input-lex-file> <output-scanner-file> [DEFINES_FILE <header>] [OPTIONS <options>...] [COMPILE_FLAGS <string>] # Deprecated )
3.17 版中已更改: 当策略
CMP0098
设置为NEW
时,flex
在CMAKE_CURRENT_BINARY_DIR
目录中运行。<name>
用作此命令调用标识符的字符串。
<input-lex-file>
输入 Flex 源文件(
.l
)的路径。如果给定相对路径,则将其解释为相对于当前源目录(CMAKE_CURRENT_SOURCE_DIR
)。<output-scanner-file>
Flex 生成的输出文件的路径。如果给定相对路径,则将其解释为相对于当前 Flex 工作目录。
DEFINES_FILE <header>
3.5 版本新增。
如果 Flex 配置为输出头文件,则此选项可用于指定其名称。如果给定相对路径,则将其解释为相对于当前 Flex 工作目录。
OPTIONS <options>...
4.0 版本新增。
添加到
flex
命令行中的额外选项的 分号分隔列表。COMPILE_FLAGS <string>
自 4.0 版起已弃用: 被
OPTIONS <options>...
取代。添加到
flex
命令行中的空格分隔的额外选项字符串。分号分隔列表 将不起作用。
命令变量
此命令还定义以下变量
FLEX_<name>_DEFINED
布尔值,指示此命令是否成功调用。
FLEX_<name>_INPUT
Flex 源文件,
<input-lex-file>
的别名。FLEX_<name>_OUTPUT_HEADER
3.5 版本新增。
由
flex
生成的头文件(如果有)。FLEX_<name>_OUTPUTS
由
flex
生成的文件列表,包括输出扫描器文件和头文件。FLEX_<name>_OPTIONS
4.0 版本新增。
用于
flex
命令的命令行选项列表。
添加扫描器和解析器之间的依赖关系¶
- add_flex_bison_dependency¶
添加扫描器和解析器之间所需的依赖关系
add_flex_bison_dependency(<flex-name> <bison-name>)
Flex 扫描器通常依赖于 Bison 生成的令牌定义,这意味着 Flex 生成的代码依赖于 Bison 创建的头文件。
此命令添加扫描器和解析器之间所需的依赖关系,其中
<flex-name>
和<bison-name>
分别是flex_target(<name> ...)
和bison_target(<name> ...)
命令的第一个参数。
示例¶
示例:查找 Flex¶
查找 Flex
find_package(FLEX)
查找 Flex 并指定其所需的最低版本
find_package(FLEX 2.5.13)
查找 Flex 并使其成为必需(如果找不到 Flex,则停止处理并显示错误消息)
find_package(FLEX 2.5.13 REQUIRED)
示例:生成扫描器¶
查找 Flex 并在当前二进制目录中从当前源目录中的 lex 源文件生成扫描器源文件
find_package(FLEX)
if(FLEX_FOUND)
flex_target(MyScanner lexer.l lexer.cpp)
endif()
add_executable(foo foo.cc ${FLEX_MyScanner_OUTPUTS})
示例:命令行选项¶
可以以列表形式传递添加到 flex
可执行文件的其他命令行选项。例如,添加 --warn
选项以报告警告,以及 --noline
(-L
) 以不生成 #line
指令。
find_package(FLEX)
if(FLEX_FOUND)
flex_target(MyScanner lexer.l lexer.cpp OPTIONS --warn --noline)
endif()
生成器表达式
可以在 OPTIONS <options>...
参数中使用。例如,仅为 Debug
构建类型添加 --debug
(-d
) 选项
find_package(FLEX)
if(FLEX_FOUND)
flex_target(MyScanner lexer.l lexer.cpp OPTIONS $<$<CONFIG:Debug>:--debug>)
endif()
示例:使用 Flex 库¶
查找 Flex 并创建接口 导入目标,该目标封装其库使用要求,以便链接到项目目标
find_package(FLEX)
if(FLEX_FOUND AND NOT TARGET FLEX::fl)
add_library(FLEX::fl INTERFACE IMPORTED)
set_target_properties(
FLEX::fl
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${FLEX_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FLEX_LIBRARIES}"
)
endif()
if(FLEX_FOUND)
flex_target(MyScanner lexer.l lexer.cpp)
endif()
add_executable(Foo foo.cc ${FLEX_MyScanner_OUTPUTS})
target_link_libraries(Foo PRIVATE FLEX::fl)
示例:使用 Flex 和 Bison¶
以下示例演示了如何在 CMake 中使用 Flex 和 Bison
find_package(BISON)
find_package(FLEX)
if(BISON_FOUND AND FLEX_FOUND)
bison_target(MyParser parser.y parser.cpp)
flex_target(MyScanner lexer.l lexer.cpp)
add_flex_bison_dependency(MyScanner MyParser)
endif()
add_executable(Foo foo.cc ${BISON_MyParser_OUTPUTS} ${FLEX_MyScanner_OUTPUTS})
# ...
另请参阅¶
FindBISON
模块用于查找 Bison 解析器生成器。