0

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

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.

任何人都可以帮忙吗?提前致谢。

4

1 回答 1

1

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

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

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

请注意,Lemon 文档没有说明 C++ 兼容性,因此未来的更改(对 C++ 或柠檬解析器)肯定有可能不会保留这种兼容性。

于 2019-05-15T22:09:56.470 回答