C++ bisonc++;多态遗传

C++ bisonc++;多态遗传,c++,parsing,compiler-construction,abstract-syntax-tree,bisonc++,C++,Parsing,Compiler Construction,Abstract Syntax Tree,Bisonc++,我正试图从bison语法构造一个AST。Bison正确地生成了解析器,但当我尝试使用一些数学操作解析示例代码时,会出现以下错误: [Fatal] calling `.get<Tag__::EXPR>()', but Tag INT is encountered. 而操作员本身具有以下产品: operator: ... | INTEGER { $$ = new ast::expression::IntASTNode(std::stoi(d_scanner.match

我正试图从bison语法构造一个AST。Bison正确地生成了解析器,但当我尝试使用一些数学操作解析示例代码时,会出现以下错误:

[Fatal] calling `.get<Tag__::EXPR>()', but Tag INT is encountered.
操作员
本身具有以下产品:

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

我正在使用多态语义类型,
expr
operator
被标记为
expr
,它们响应
ExprASTNode
类型,它是
IntASTNode
标记的
IntASTNode
的基类。我猜野牛是从标记中获取类型,并在进行任何转换之前检查标记。有什么办法可以解决这个问题吗?

如果您用以下内容替换作业:

operator:
     ...
        | INTEGER
          {
            $$(ast::expression::IntASTNode(std::stoi(d_scanner.matched())));
          }
然后,
bisonc++
$$
的语义值和
$$(expr)
的语义值之间进行
静态转换。有关更多信息,请参阅

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