bisonc++的多态继承

bisonc++ inheritance with polymorphic

本文关键字:继承 多态 bisonc++      更新时间:2023-10-16

我正在尝试从野牛语法构造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()));
  }

我使用多态语义类型,exproperator被标记为响应ExprASTNode类型的EXPR,这是IntASTNode的基类,标记为INT。我猜bison正在从标记中获取类型,并在进行任何强制转换之前检查标记。我有什么办法能解决这个问题吗?

如果将赋值替换为:

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

bisonc++$$的语义值和$$(expr)的语义值之间生成一个static_cast