FindBISON

查找 Bison 命令行解析器生成器,并提供一个 CMake 命令来生成使用 Bison 的自定义构建规则。

find_package(BISON [<version>] [...])

Bison 是一个解析器生成器,取代了早期的 Yacc (Yet Another Compiler-Compiler)。在类 Unix 系统上,最常见的实现是 GNU Bison。在 Windows 上,此模块会查找与 Windows 兼容的 Bison(如果已安装)。

结果变量

此模块定义了以下变量

BISON_FOUND

一个布尔值,指示是否找到了(所请求版本的)Bison。

BISON_VERSION

找到的 Bison 的版本。

缓存变量

以下缓存变量也可以设置

BISON_EXECUTABLE

bison 命令行程序的路径。

命令

如果找到 bison,此模块将提供以下命令:

bison_target

创建一个自定义构建规则,使用 Bison 从 Yacc 文件生成解析器文件。

bison_target(
  <name>
  <input-yacc-file>
  <output-parser-file>
  [DEFINES_FILE <header>]
  [VERBOSE [<file>]]       # The [<file>] argument is deprecated
  [REPORT_FILE <file>]
  [OPTIONS <options>...]
  [COMPILE_FLAGS <string>] # Deprecated
)

在版本 3.14 中已更改: 当策略 CMP0088 设置为 NEW 时,bisonCMAKE_CURRENT_BINARY_DIR 目录中运行。

<name>

用作此命令调用的标识符的字符串。

<input-yacc-file>

输入 Yacc 源文件(.y)的路径。如果给出的是相对路径,则将相对于当前源目录(CMAKE_CURRENT_SOURCE_DIR)进行解释。

<output-parser-file>

Bison 要生成的输出解析器文件的路径。如果给出的是相对路径,则将相对于当前 Bison 工作目录进行解释。

DEFINES_FILE <header>

3.4 版本新增。

默认情况下,Bison 可以生成一个包含令牌列表的头文件。此选项允许指定由 Bison 生成的自定义 <header> 文件。如果给出的是相对路径,则将相对于当前 Bison 工作目录进行解释。

VERBOSE [<file>]

启用详细语法和解析器报告的生成。默认情况下,报告文件将在当前 Bison 工作目录中创建,并命名为 <output-parser-filename>.output

<file>

自版本 3.7 起已弃用: 使用 VERBOSE REPORT_FILE <file>

指定应将报告文件复制到的路径。此参数为向后兼容而保留,仅在 <output-parser-file> 指定为绝对路径时有效。

REPORT_FILE <file>

3.7 版本中新增。

VERBOSE 结合使用,用于指定报告输出 <file> 的自定义路径,覆盖默认位置。如果给出的是相对路径,则将相对于当前 Bison 工作目录进行解释。

OPTIONS <options>...

4.0 版本新增。

添加到 bison 命令行的额外选项的 分号分隔列表

COMPILE_FLAGS <string>

自版本 4.0 起已弃用: OPTIONS <options>... 代替。

添加到 bison 命令行的空格分隔的额外选项字符串。分号分隔列表 将不起作用。

命令变量

此命令还定义了以下变量:

BISON_<name>_DEFINED

一个布尔值,指示此命令是否已成功调用。

BISON_<name>_INPUT

输入源文件,是 <input-yacc-file> 的别名。

BISON_<name>_OUTPUT_SOURCE

bison 生成的输出解析器文件。

BISON_<name>_OUTPUT_HEADER

如果存在,则由 bison 生成的头文件。

BISON_<name>_OUTPUTS

bison 生成的文件列表,包括输出解析器文件、头文件和报告文件。

BISON_<name>_OPTIONS

4.0 版本新增。

用于 bison 命令的命令行选项列表。

BISON_<name>_COMPILE_FLAGS

自版本 4.0 起已弃用: 由具有相同值的 BISON_<name>_OPTIONS 变量代替。

用于 bison 命令的命令行选项列表。

示例

示例:查找 Bison

查找 Bison

find_package(BISON)

查找具有最低必需版本的 Bison

find_package(BISON 2.1.3)

查找 Bison 并将其设为必需(如果找不到 Bison,则处理会停止并显示错误消息)

find_package(BISON 2.1.3 REQUIRED)

示例:生成解析器

在构建阶段查找 Bison,并将输入 Yacc 源文件 parser.y 添加到由 Bison 处理以生成 parser.cpp 源文件和 parser.h 头文件。

find_package(BISON)

if(BISON_FOUND)
  bison_target(MyParser parser.y parser.cpp DEFINES_FILE parser.h)
endif()

add_executable(Foo main.cpp ${BISON_MyParser_OUTPUTS})

示例:命令行选项

可以作为列表传递给 bison 可执行文件的额外命令行选项。例如,添加 -Wall 选项以报告所有警告,以及 --no-lines-l)以不生成 #line 指令。

find_package(BISON)

if(BISON_FOUND)
  bison_target(MyParser parser.y parser.cpp OPTIONS -Wall --no-lines)
endif()

生成器表达式 可在 OPTIONS <options>... 参数中使用。例如,仅为 Debug 构建类型添加 --debug-t)选项。

find_package(BISON)

if(BISON_FOUND)
  bison_target(MyParser parser.y parser.cpp OPTIONS $<$<CONFIG:Debug>:-t>)
endif()

另请参阅

  • 查找 Flex 扫描器生成器的 FindFLEX 模块。