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 解析器)很可能不会保留此兼容性。
当我编译我的柠檬语法时。我收到以下错误。
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 解析器)很可能不会保留此兼容性。