我正在尝试用野牛语法构建一个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的更多信息.