には、どうするのがベストなの防止のメモリリークにはyaccに基づくパーサ?

StackOverflow https://stackoverflow.com/questions/64958

  •  09-06-2019
  •  | 
  •  

質問

Yaccとを許可しないオブジェクトに渡されます。では、組合などを含めないでくださいポッドの種類、複雑なオブジェクトな新たな思いと受け渡されるポインタです。場合は構文エラーが発生した場合、yaccパーザだけを停止し、参照すべての作物が失われています。

の唯一のソリューション私たちは、すべての新しいオブジェクトを継承し、特定の基底クラスに追加するコンテナが割り当て、誤りがある場合はあるコンテナを削除することができます。

なんだろうけど、日本人の任意によyaccさらにお得な価格でのことがあります。

ないでください教えてはるかに多くをすることがパーサです。

役に立ちましたか?

解決

私はYaccが、差別組合のスタックは現在の挑戦です。

わからないかどうかをご利用のCまたはC++.私は修正YaccをC++のために自分の目的が、このソリューションに合わせることが可能でC.

して、私が気に入っていて、ソリューションパスへのインターフェースオーナーの木でなく、建物、スタックです。これをお気に入りスタック以外のYaccます。する前に呼び出し以外の端末の割り当てを行うオブジェクト、プッシュオーナーのオブジェクトをこのスタックです。

例えば:

class IExpressionOwner
{
public:
    virtual ExpressionAdd *newExpressionAdd() = 0;
    virtual ExpressionSubstract *newExpressionSubtract() = 0;
    virtual ExpressionMultiply *newExpressionMultiply() = 0;
    virtual ExpressionDivide *newExpressionDivide() = 0;
};

class ExpressionAdd : public Expression, public IExpressionOwner
{
private:
    std::auto_ptr<Expression> left;
    std::auto_ptr<Expression> right;

public:
    ExpressionAdd *newExpressionAdd()
    {
        ExpressionAdd *newExpression = new ExpressionAdd();
        std::auto_ptr<Expression> autoPtr(newExpression);
        if (left.get() == NULL)
            left = autoPtr;
        else
            right = autoPtr;
        return newExpression;
    }

    ...
};

class Parser
{
private:
    std::stack<IExpressionOwner *> expressionOwner;

    ...
};

もう表現は、実施のためIExpressionOwnerイプのスタックのメソッドを呼び出す前に、表現の非端子です。このコミュニケーションも楽しみの余分なコードで制御オブジェクトです。

更新

表現の例では不おりますので非常に良いのではないかと思いまで運行しんだ後の左被演算子.もっとも、この技法の作品は多くの場合、ほんの少し調整を行うための表現です。

他のヒント

場合に最適で、プロジェクトの利用を考える仕ガベージコレクタ.そのように自由に配置す新たなオブジェクトをコレクタの削除.のコースがトレードオフの関与をゴミ箱とがございます。い量のコスト。

使用 スマートポインタ!

やれば、不快によっては他の図書館を利用できることが auto_ptr から、C++の標準図書館があります。

理由を使用していますので、異なるパーサのような問題なのか。バイソンなどで、すぐに使用可能な、少なくともlinux)yaccが通常の実装としてバイソン.ただし必要な変更文法を使うのを除く追%デストラクタを解決しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top