我正在尝试用野牛语法构建一个AST. Bison正确生成解析器但是当我尝试用一些数学运算解析一个示例代码时,打印出以下错误: [Fatal] calling `.getTag__::EXPR()', but Tag INT is encountered. 调试
[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的更多信息.