バイソン文法から 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
おり、タイプ witchに応答する でoperator
タグ付けされており、 withの基本クラスです。バイソンはタグから型を取得し、キャストを行う前にタグをチェックしていると思います。これを解決する方法はありますか?EXPR
ExprASTNode
IntASTNode
INT