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()

另请参阅

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