2015-05-07 69 views
0

我在寫一種遞歸下降解析器。在我的語法樹的第一階段,我持有我在向量中解析的模型片段。第一件是左手側件(lhs),其餘件是右側件(rhs)。 Lhs加上rhs構成一個生產規則(pr)。任何rhs作品都可能是一個pr,其第一個作品是lhs作品。該公關的lhs片也是它在我稱之爲「sub」的公關類中的作品。例如,讓pr1 = lhs10 rhs11 sub12 rhs13和pr2 = lhs20 rhs21 rhs22。 lhs20和sub12將是同一個作品。我得到一個'內部向量'錯誤,可能是因爲我正在對與周圍對象相同類型的對象執行push_back,但是有沒有辦法使用容器中的智能指針對象來實現這種遞歸?是否有可能在C++中有一個遞歸向量?

#include "stdafx.h" 
#include <memory> 
#include <vector> 

struct AbstractSyntaxTree; 
typedef std::shared_ptr<AbstractSyntaxTree> ModelPiece; 
typedef std::vector<ModelPiece> ModelPiecesVect; 

struct AbstractSyntaxTree 
{ 
    enum LexState 
    { 
    LHS = 0x0, RHS = 0x1, SUB = 0x2 
    }; 

    ModelPiecesVect modelPiecesVect; 
    LexState lexState; 
}; 

int main() 
{ 
    ModelPiece mp; 
    ModelPiece lhs10, rhs11, sub12, rhs13; 
    ModelPiece lhs20, rhs21, rhs22; 

    lhs10 = std::make_shared<AbstractSyntaxTree>(); 

    mp->modelPiecesVect.push_back(lhs10); // fails here with '... _Ptr points inside vector' (see code fragment below) 
    mp->modelPiecesVect.push_back(rhs11); 
    mp->modelPiecesVect.push_back(sub12); 
    mp->modelPiecesVect.push_back(rhs13); 
    mp->modelPiecesVect[ 2 ]->modelPiecesVect.push_back(lhs20); 
    mp->modelPiecesVect[ 2 ]->modelPiecesVect.push_back(rhs21); 
    mp->modelPiecesVect[ 2 ]->modelPiecesVect.push_back(rhs22); 

/* 
    bool _Inside(const value_type *_Ptr) const 
    { // test if _Ptr points inside vector 
    return (_Ptr < this->_Mylast && this->_Myfirst <= _Ptr); // 'this' is null 
    } 
*/ 

    return 0; 
} 

回答

4

隨着

typedef std::shared_ptr<AbstractSyntaxTree> ModelPiece; 

此:

ModelPiece mp; 

是一個空指針。你必須給它分配一些東西,否則mp->modelPiecesVect會導致未定義的行爲。類似地,這些:

ModelPiece lhs10, rhs11, sub12, rhs13; 
ModelPiece lhs20, rhs21, rhs22; 

必須被初始化(特別sub12),或之後將mp->modelPiecesVect[ 2 ]->modelPiecesVect中相同的方式失敗。

除此之外,你在做什麼應該工作。

0
mp->modelPiecesVect.push_back(lhs10); 

mp這裏沒有初始化

相關問題