使用变体的 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"