私は単純な数学的なパーサーに取り組んでいます。ただ読み込むものnumber = 1 + 2;
C++のベクトルとセグメンテーションのエラー
私はこれらのトークンを含むベクトルを持っています。文字の型と文字列の値を格納します。私は、これらのトークンのASTを構築するためにベクトルを進めようとしています。ここで
ASTを構築するコードのビットは次のとおりです。私はTree->Data.svalue
にアクセスし、=
ノードのトークン情報を取得することができます
struct ASTGen
{
const vector<Token> &Tokens;
unsigned int size,
pointer;
ASTGen(const vector<Token> &t) : Tokens(t), pointer(0)
{
size = Tokens.size() - 1;
}
unsigned int next()
{
return pointer + 1;
}
Node* Statement()
{
if(next() <= size)
{
switch(Tokens[next()].type)
{
case EQUALS
:
Node* n = Assignment_Expr();
return n;
}
}
advance();
}
void advance()
{
if(next() <= size) ++pointer;
}
Node* Assignment_Expr()
{
Node* lnode = new Node(Tokens[pointer], NULL, NULL);
advance();
Node* n = new Node(Tokens[pointer], lnode, Expression());
return n;
}
Node* Expression()
{
if(next() <= size)
{
advance();
if(Tokens[next()].type == SEMICOLON)
{
Node* n = new Node(Tokens[pointer], NULL, NULL);
return n;
}
if(Tokens[next()].type == PLUS)
{
Node* lnode = new Node(Tokens[pointer], NULL, NULL);
advance();
Node* n = new Node(Tokens[pointer], lnode, Expression());
return n;
}
}
}
};
...
ASTGen AST(Tokens);
Node* Tree = AST.Statement();
cout << Tree->Right->Data.svalue << endl;
ので、私は、ノードが生み出さなっていることを知っていますまた、Tree->Left->Data.svalue
を取得し、変数を左側に取得することもできます。=
何度も何度もベクタを踏み直して書き直しましたが、=
ノードにアクセスしようとするとセグメンテーション違反が発生します(+
ノードになるはずです)
大変感謝します。
彼の 'Expression()'関数には、値を返さないコードパスもあります。 – Blastfurnace
はい、実際そうです! –
私はこれを理解していますが、今のところ、これは 'number = 1 + 2;'、あるいは少なくともそれが希望であることに対して正しく機能するはずなので、私は心配していませんでした。このテストケースが解決されると、他のコントロールパスを完成させます。 – grep