1

私は単純な数学的なパーサーに取り組んでいます。ただ読み込むもの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を取得し、変数を左側に取得することもできます。=

何度も何度もベクタを踏み直して書き直しましたが、=ノードにアクセスしようとするとセグメンテーション違反が発生します(+ノードになるはずです)

大変感謝します。

答えて

4

私たちが見たことのないコードがたくさんあるので、何が起こっているのかを正確に伝えることはできませんが、心配する理由がいくつかあります。 1つは、Statement()メソッドが常に値を返すわけではないということです。最初のifテストが合格しない場合は、advance()と呼び出し、明示的な返信なしにルーチンの一番下に落ちます。呼び出し元は関数の戻り値を取得しようとしますが、それはゴミを取得します。これは、二重free()呼び出しなどの問題を含むあらゆる種類の問題につながり、segfaultを簡単に引き起こす可能性があります。

Expression()にも同じ問題があります。

+1

彼の 'Expression()'関数には、値を返さないコードパスもあります。 – Blastfurnace

+0

はい、実際そうです! –

+0

私はこれを理解していますが、今のところ、これは 'number = 1 + 2;'、あるいは少なくともそれが希望であることに対して正しく機能するはずなので、私は心配していませんでした。このテストケースが解決されると、他のコントロールパスを完成させます。 – grep

関連する問題