1

나는 간단한 수학 파서를 연구 중이다. 단지 읽는 것 number = 1 + 2;C++ 벡터 및 분할 오류

나는이 토큰들을 포함하고있는 벡터를 가지고있다. 그들은 문자의 유형과 문자열 값을 저장합니다. 나는이 토큰의 AST를 구축하기 위해 벡터를 단계별로 실행하려고 노력 중이다. 그리고 코드가 이런 일이 일어나지 않도록해야한다고 생각하는 경우에도 세그먼테이션 오류가 계속 발생한다. 여기

는 인 AST 빌드 코드의 비트 :

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->Data.svalue에 액세스하고 = 노드의 토큰 정보를 얻을, 그래서 그 노드가 양산지고 알 수 있습니다 또한 Tree->Left->Data.svalue을 가져와 변수의 왼쪽에있는 변수를 가져올 수 있습니다. =

여러 번 반복하여 벡터를 단계별로 시도했지만 여러 번 다시 시도했습니다. 노드 = (노드는 +이어야 함)에 액세스하려고하면 세그먼트 화 오류가 발생합니다.

대단히 감사하겠습니다.

답변

4

우리가 보지 못했던 코드가 더 많아서 무슨 일이 일어나는지 정확하게 말할 수는 없지만 걱정할 이유가 몇 가지 있습니다. 하나는 Statement() 메서드가 항상 값을 반환하지 않는다는 것입니다. 첫 번째 if 테스트가 통과하지 못하면 advance()으로 전화하여 명시 적으로 반환하지 않고 루틴의 맨 아래로 떨어집니다. 호출자는 함수의 반환 값을 얻으려고 시도하지만 가비지를받습니다. 이로 인해 이중 전화 free() 등을 비롯하여 모든 종류의 문제가 발생할 수 있으며 이로 인해 segfault가 쉽게 발생할 수 있습니다.

Expression()도 동일한 문제가 있습니다.

+1

그의'Expression()'함수는 값을 반환하지 않는 코드 경로도 가지고 있습니다. – Blastfurnace

+0

예, 그렇습니다! –

+0

나는 이것을 깨닫습니다. 그러나 지금 당장은 이것이 숫자 = 1 + 2; 또는 적어도 atleast에 대해 올바르게 작동해야하므로 걱정하지 않았습니다. 그것은 희망이었습니다. 이 테스트 케이스가 해결되면 다른 컨트롤 경로가 완성됩니다. – grep