boost :: spiritで解析する際にセマンティックルールを使用してASTを作成しようとしています。 ASTは入力の部分に対してのみ構築されなければならず、入力の別の部分はsintaxツリーなしで解析されるべきです。このような入力文字列の例セマンティックアクションがboost :: spirit構文解析で複数回実行される
、: "self.usedFoo(バー).filter(self.baz>バズ)" または "self.Foo.filter(真)" ASTだけのために構築されなければなりません太字部分。
そして、問題があります:パーサーは文法の解析と意味アクションの呼び出し(ASTノードのinstatntiating)を何度も何度も実行するので、ひどいメモリリークが発生します。
Simplicatedソースコード:
文法:
line = stmt | stmt >> "filter.(" >> filter >> ')';
filter %= (filterterm)
filterterm %= (filterfactor)
filterfactor = value [phoenix::bind(&ValueFilterSemanticNode::Instantiate, qi::_val, qi::_1)];
ノードをインスタンス化:
static void ValueFilterSemanticNode::Instantiate(QVariant &res, QVariant &value)
{
qDebug() << " Creating new Value Node...";
ValueFilterSemanticNode *n = new ValueFilterSemanticNode();
qDebug() << " " << n;
n->value = QVariant(value.toInt());
res = QVariant::fromValue(n);
}
入力:(1)
デバッグ
がself.filterアウト:
Creating new Value Node...
0x22fdfd0
Creating new Value Node...
0x22fe030
Creating new Value Node...
0x22fde50
[...many many lines...]
Creating new Value Node...
0x22fe238
Creating new Value Node...
0x22fe218
Running Filter test
Value node running... 0x22fe218
Check result = QVariant(int, 1)
このように、ノードがインスタンス化される回数が多いため、memリークが発生します。
を参照してください。 – DmitryU
解析後にASTを処理した場合のみ – sehe