我试着用野牛语法来构造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使用响应ExprASTNode类型的EXPR标记,后者是带有标记INT的IntASTNode的基类。我猜野牛正在从标签中获取类型,并在进行任何转换之前检查标记。我能解决这个问题吗?
发布于 2016-12-05 15:38:52
如果您用以下内容替换该任务:
operator:
...
| INTEGER
{
$$(ast::expression::IntASTNode(std::stoi(d_scanner.matched())));
}然后bisonc++在$$的语义值和$$(expr)的语义值之间做了一个static_cast。
https://stackoverflow.com/questions/40634291
复制相似问题