bisonc++ 多态继承
bisonc++ inheritance with polymorphic
我正在尝试从野牛语法构建 AST。 Bison 正确生成了解析器,但是当我尝试使用一些数学运算解析示例代码时,打印出以下错误:
[Fatal] calling `.get<Tag__::EXPR>()', but Tag INT is encountered.
调试后我注意到问题出在 expr
非终端中,生成如下:
expr:
...
| operator
{
$$ = ;
}
而operator
本身有以下产生式:
operator:
...
| INTEGER
{
$$ = new ast::expression::IntASTNode(std::stoi(d_scanner.matched()));
}
我正在使用多态语义类型,expr
和 operator
带有响应 ExprASTNode
类型的 EXPR
标记 是基础 class 对于 IntASTNode
和标签 INT
。我猜野牛正在从标签中获取类型并在进行任何转换之前检查标签。有什么办法可以解决这个问题吗?
如果你用这个代替赋值:
operator:
...
| INTEGER
{
$$(ast::expression::IntASTNode(std::stoi(d_scanner.matched())));
}
然后 bisonc++
在 $$
的语义值和来自 $$(expr)
的语义值之间创建一个 static_cast
。 bisonc++ manual.
中的更多信息
我正在尝试从野牛语法构建 AST。 Bison 正确生成了解析器,但是当我尝试使用一些数学运算解析示例代码时,打印出以下错误:
[Fatal] calling `.get<Tag__::EXPR>()', but Tag INT is encountered.
调试后我注意到问题出在 expr
非终端中,生成如下:
expr:
...
| operator
{
$$ = ;
}
而operator
本身有以下产生式:
operator:
...
| INTEGER
{
$$ = new ast::expression::IntASTNode(std::stoi(d_scanner.matched()));
}
我正在使用多态语义类型,expr
和 operator
带有响应 ExprASTNode
类型的 EXPR
标记 是基础 class 对于 IntASTNode
和标签 INT
。我猜野牛正在从标签中获取类型并在进行任何转换之前检查标签。有什么办法可以解决这个问题吗?
如果你用这个代替赋值:
operator:
...
| INTEGER
{
$$(ast::expression::IntASTNode(std::stoi(d_scanner.matched())));
}
然后 bisonc++
在 $$
的语义值和来自 $$(expr)
的语义值之间创建一个 static_cast
。 bisonc++ manual.