наследование bisonc ++ с полиморфным

Я пытаюсь построить AST из грамматики бизонов. Bison генерирует синтаксический анализатор правильно, но когда я пытаюсь проанализировать пример кода с некоторыми математическими операциями, выдается следующая ошибка:

[Fatal] calling `.get<Tag__::EXPR>()', but Tag INT is encountered.

После отладки замечаю, что проблема в expr нетерминальный со следующей продукцией:

expr:
...
| operator
{
$$ = $1;
}

А также operator имеет следующее производство:

operator:
...
| INTEGER
{
$$ = new ast::expression::IntASTNode(std::stoi(d_scanner.matched()));
}

Я использую полиморфные семантические типы, expr а также operator помечены EXPR которые отвечают на ExprASTNode Тип ведьма является базовым классом для IntASTNode с тегом INT, Я предполагаю, что бизон получает тип из тега и проверяет теги перед выполнением любого приведения. Есть ли способ, которым я могу решить это?

4

Решение

Если вы замените назначение этим:

operator:
...
| INTEGER
{
$$(ast::expression::IntASTNode(std::stoi(d_scanner.matched())));
}

затем bisonc++ делает static_cast между $$семантическое значение и тот из $$(expr), Дополнительная информация в руководство по bisonc ++.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]