使用变体的 Bison C++ GLR 解析器
Bison C++ GLR parser using variants
我目前正在使用 bison 创建一个解析器,它大量使用变体功能,因为我的语法不是 LALR(1) 我想使用 GLR 选项。
当我尝试这样做时,出现以下错误:
error: '"glr.cc"' does not support '%define api.value.type variant'
%define api.value.type variant
^^^^^^^^^^^^^^
我做错了什么?
注意: 以下答案在撰写时和随后的四年半内有效。但是,在 Bison v3.8(2021 年 9 月 7 日发布)中,包含了一个新的实验性 C++ GLR 实现,它确实支持 variant
语义类型。如果您已将 bison 安装更新到版本 3.8,则可以通过添加指令 %skeleton "glr2.cc"
来测试此框架。变更日志表明:
It will eventually replace "glr.cc". However we need user feedback on this skeleton. Please report your results and comments about it.
对我来说,这表明它不应该在生产代码中使用,但毫无疑问,这个警告将在 未来 四年后的某个时候失效。同时,请自行判断或阅读以下 2017 年的答案。
您正在尝试使用 C++ API 构建 GLR 解析器,其语义类型不是 POD,并且当前的 C++ Bison GLR 实现不支持。
特别是,Bison 的 C++ API 使用的变体类型不是 POD,因此它不能在 GLR 解析器中使用,如错误消息所述。
我知道的唯一解决方法是使用带有标记字段和 union
.
的 C 风格可区分联合
对于某些 k,语言由 LR(k) 衡量。语言不是用术语 GLR 来衡量的。 GLR 是一种解析技术。
如果你看一下“examples/c++/glr/c++types.yy”,你就会知道这可以通过使用带有框架的最新版本来解决这个问题“glr2.cc”作者
%require "3.8"
%skeleton "glr2.cc"
我目前正在使用 bison 创建一个解析器,它大量使用变体功能,因为我的语法不是 LALR(1) 我想使用 GLR 选项。 当我尝试这样做时,出现以下错误:
error: '"glr.cc"' does not support '%define api.value.type variant'
%define api.value.type variant
^^^^^^^^^^^^^^
我做错了什么?
注意: 以下答案在撰写时和随后的四年半内有效。但是,在 Bison v3.8(2021 年 9 月 7 日发布)中,包含了一个新的实验性 C++ GLR 实现,它确实支持 variant
语义类型。如果您已将 bison 安装更新到版本 3.8,则可以通过添加指令 %skeleton "glr2.cc"
来测试此框架。变更日志表明:
It will eventually replace "glr.cc". However we need user feedback on this skeleton. Please report your results and comments about it.
对我来说,这表明它不应该在生产代码中使用,但毫无疑问,这个警告将在 未来 四年后的某个时候失效。同时,请自行判断或阅读以下 2017 年的答案。
您正在尝试使用 C++ API 构建 GLR 解析器,其语义类型不是 POD,并且当前的 C++ Bison GLR 实现不支持。
特别是,Bison 的 C++ API 使用的变体类型不是 POD,因此它不能在 GLR 解析器中使用,如错误消息所述。
我知道的唯一解决方法是使用带有标记字段和 union
.
对于某些 k,语言由 LR(k) 衡量。语言不是用术语 GLR 来衡量的。 GLR 是一种解析技术。
如果你看一下“examples/c++/glr/c++types.yy”,你就会知道这可以通过使用带有框架的最新版本来解决这个问题“glr2.cc”作者
%require "3.8"
%skeleton "glr2.cc"