0

我目前正在使用野牛创建一个解析器,它大量使用变体功能,因为我的语法不是 LALR(1) 我想使用 GLR 选项。当我尝试这样做时,我收到以下错误:

error: '"glr.cc"' does not support '%define api.value.type variant'
 %define api.value.type variant
         ^^^^^^^^^^^^^^

我究竟做错了什么?

4

3 回答 3

3

注意:以下答案在撰写时和随后的四年半内有效。但是,在 Bison v3.8(2021 年 9 月 7 日发布)中,包含了一个新的实验性 C++ GLR 实现,它确实支持variant语义类型。如果您已将野牛安装更新到 3.8 版,则可以通过添加指令来测试此骨架%skeleton "glr2.cc"。变更日志表明:

它将最终取代“glr.cc”。但是,我们需要用户对此骨架的反馈。 报告您的结果和评论。

对我来说,这表明它不应该在生产代码中使用,但毫无疑问,这个警告将在未来四年的某个时候失效。同时,请使用您自己的判断或阅读以下 2017 年的答案。


您正在尝试使用具有非 POD 语义类型的 C++ API 构建 GLR 解析器,并且当前 C++ Bison GLR 实现不支持该语法。

特别是,Bison 的 C++ API 使用的变体类型不是 POD,因此不能在 GLR 解析器中使用,如错误消息所述。

我知道的唯一解决方法是使用带有标签字段和union.

于 2017-03-17T14:06:06.270 回答
1

如果您查看“examples/c++/glr/c++types.yy”,您将知道这可以通过使用带有骨架“glr2.cc”的最新版本来解决

%require "3.8"
%skeleton "glr2.cc"
于 2021-12-24T08:24:06.780 回答
-3

对于某些 k,语言由 LR(k) 测量。语言不是由术语 GLR 衡量的。GLR 是一种解析技术。

于 2018-06-14T17:06:10.830 回答