Как мне исправить "ошибку: вызов неявно удаленного конструктора по умолчанию 'YYMINORTYPE'" в лимон? - PullRequest
0 голосов
/ 15 мая 2019

Когда я собираю свою лимонную грамматику.Я получаю следующую ошибку.

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.

Может кто-нибудь помочь?Заранее спасибо.

1 Ответ

1 голос
/ 16 мая 2019

Lemon в первую очередь предназначен для генерации кода на C, но (подобно flex и lex) генерируемый им синтаксический анализатор может быть скомпилирован с C ++, если ваши семантические типы достаточно просты. В частности, различные семантические типы объединяются в union, и экземпляры этого union создаются по умолчанию (когда создается стек синтаксического анализатора). Как следствие, каждый отдельный семантический тип должен иметь конструктор по умолчанию, а std::tuple не определяет его. Таким образом, вы не можете использовать std::tuple в качестве семантического типа.

Это не единственное ограничение. Элементы стека могут быть скопированы с помощью realloc, поэтому типы должны быть легко копируемыми. Короче говоря, они должны выглядеть в основном как типы C, за исключением большей части стандартной библиотеки C ++.

В этом конкретном случае вы могли бы использовать struct с двумя членами вместо tuple.

Обратите внимание, что документация Lemon ничего не говорит о совместимости с C ++, поэтому вполне возможно, что будущие изменения (в C ++ или в парсер лимон) не сохранят эту совместимость.

...