には、どうするのがベストなの防止のメモリリークにはyaccに基づくパーサ?
質問
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イプのスタックのメソッドを呼び出す前に、表現の非端子です。このコミュニケーションも楽しみの余分なコードで制御オブジェクトです。
更新
表現の例では不おりますので非常に良いのではないかと思いまで運行しんだ後の左被演算子.もっとも、この技法の作品は多くの場合、ほんの少し調整を行うための表現です。
所属していません StackOverflow