2016-06-19 6 views
0

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リークが発生します。

答えて

0

セマンティックアクションは、バックトラックが後であっても発生します。

パーサー式がスローされる可能性があります。

これらの理由だけでは、セマンティックアクションで動的割り当てを行うことはお勧めできません。必要な場合は、スマートポインタを使用します(これはまだ非効率です)。

ええ、そう、セマンティックアクションのように実行されますいくつかのメカニズムは、しかし、バックトラックラン効果なし、ありますか

+0

を参照してください。 – DmitryU

+0

解析後にASTを処理した場合のみ – sehe

関連する問題