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