我正在编写一种递归下降解析器。在我的语法树的第一阶段,我持有我在向量中解析的模型片段。第一件是左手侧件(lhs),其余件是右手件(rhs)。 Lhs加上rhs碎片构成生产规则(pr)。任何rhs件本身可以是pr,其第一件是lhs件。那个pr的lhs片段也是它在pr中占据的片段,我称之为'sub'。例如,令pr1 = lhs10 rhs11 sub12 rhs13和pr2 = lhs20 rhs21 rhs22。 lhs20和sub12将是同一块。我得到一个'内部向量'错误可能是因为我在与周围对象相同类型的对象上做了push_back,但有没有办法在像vector这样的容器中使用智能指针对象实现这种递归?
#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;
}
答案 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
将以同样的方式失败。
除此之外,你正在做的事情应该有效。
答案 1 :(得分:0)
mp->modelPiecesVect.push_back( lhs10 );
mp
未在此处初始化