4

我正在尝试从野牛语法构造一个 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带有 tag的基类INT。我猜野牛正在从标签中获取类型并在进行任何演员之前检查标签。有什么办法可以解决这个问题吗?

4

1 回答 1

1

如果你用这个代替作业:

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

然后在的语义值和来自 的语义值之间bisonc++产生一个。更多信息参见bisonc++ 手册static_cast$$$$(expr)

于 2016-12-05T15:38:52.520 回答