How do I fix "error: call to implicitly-deleted default constructor of 'YYMINORTYPE'" in lemon?

How do I fix "error: call to implicitly-deleted default constructor of 'YYMINORTYPE'" in lemon?

当我编译我的柠檬语法时。我收到以下错误。

src/grammar.c:949:21: error: call to implicitly-deleted default constructor of
      'YYMINORTYPE'
        YYMINORTYPE yylhsminor;
                    ^
src/grammar.c:111:38: note: default constructor of '' is implicitly deleted because
      variant field 'yy13' has a non-trivial default constructor
  std::tuple<bool, IdentifierNode *> yy13;
                                     ^
src/grammar.c:1178:15: error: call to implicitly-deleted default constructor of
      'YYMINORTYPE'
  YYMINORTYPE yyminorunion;
              ^
src/grammar.c:111:38: note: default constructor of '' is implicitly deleted because
      variant field 'yy13' has a non-trivial default constructor
  std::tuple<bool, IdentifierNode *> yy13;
                                     ^
2 errors generated.

有人能帮忙吗?提前致谢。

Lemon 主要用于生成 C 代码,但是(像 flex 和 lex)它生成的解析器可以用 C++ 编译,前提是您的语义类型足够简单。特别是,各种语义类型被连接在一起成为一个 union 并且这个 union 的实例是 default-constructed (当创建解析器堆栈时)。因此,每个单独的语义类型都必须有一个默认构造函数,而 std::tuple 没有定义一个。所以你不能使用 std::tuple 作为语义类型。

这不是唯一的限制。堆栈元素可以被 realloc 复制,因此类型应该是可简单复制的。简而言之,它们应该基本上看起来像 C 类型,这排除了大部分 C++ 标准库。

在这种特殊情况下,您可以使用具有两个成员的 struct 而不是 tuple

请注意,Lemon 文档未提及 C++ 兼容性,因此未来的更改(对 C++ 或 Lemon 解析器)很可能不会保留此兼容性。