Я пишу рекурсивный парсер спуска. На первом этапе моего синтаксического дерева я держу кусочки модели, которые я анализирую в векторе. Первая часть - левая боковая часть (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;
}