2015-05-07 3 views
0

Я пишу рекурсивный парсер спуска. На первом этапе моего синтаксического дерева я держу кусочки модели, которые я анализирую в векторе. Первая часть - левая боковая часть (lhs), а остальные части - правые части (rhs). Lhs плюс элементы rhs составляют производственное правило (pr). Любая из частей rhs может сама быть pr, где ее первая часть - часть lhs. Этот кусок pr's также является частью, которую он занимает в pr, тип которого я называю «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 не инициализирован здесь

Смежные вопросы