Я пытаюсь построить 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
, Я предполагаю, что бизон получает тип из тега и проверяет теги перед выполнением любого приведения. Есть ли способ, которым я могу решить это?
Если вы замените назначение этим:
operator:
...
| INTEGER
{
$$(ast::expression::IntASTNode(std::stoi(d_scanner.matched())));
}
затем bisonc++
делает static_cast
между $$
семантическое значение и тот из $$(expr)
, Дополнительная информация в руководство по bisonc ++.
Других решений пока нет …