bisonc继承与多态

我正在尝试用野牛语法构建一个AST. Bison正确生成解析器但是当我尝试用一​​些数学运算解析一个示例代码时,打印出以下错误:

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

调试后我注意到问题是在expr非终端中进行以下生产:

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

运算符自己进行以下生产:

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

我正在使用多态语义类型,expr和运算符都用EXPR标记,它们响应ExprASTNode类型,这是IntASTNode的基类,标签为INT.我猜测野牛是从标签中获取类型并在进行任何演员之前检查标签.有什么方法可以解决这个问题吗?

最佳答案 如果您用此替换作业:

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

然后bisonc在$$的语义值和$$(expr)中的语义值之间进行static_cast.有关bisonc++ manual的更多信息.

点赞