2014-12-07 2 views
0

나는 내 기호 테이블 &을 구현하는 논리를 파악하려고 노력하는 뇌를 깨뜨리고 있었는데 이제는 흰색 깃발을 흔들며 도움을 요청합니다. 벡터를 사용하여 심볼 테이블을 만들지 만 올바른 범위에 심볼 테이블 항목 (지금은 문자열, 나중에 구조체)을 넣는 데 문제가 있습니다. 내 코드는 블록이 열릴 때마다 증가하고 블록이 닫힐 때마다 감소하는 int scopenum을가집니다. 그러나이 행은 범위 3에 있어야 할 때 범위 2에 q를 넣기 때문에 {a {b} {q}}이므로 문제가됩니다. 코드가 새 행을 벡터에 푸시하지만 사용하지 않습니다 삽입물에. & 클로징 범위를 올바르게 계산하도록 코드를 수정하려면 어떻게해야합니까?벡터를 사용하는 기호 테이블

#include <iostream> 
#include <fstream> 
#include <vector> 

using namespace std; 

int stacknum=-1; 
vector< vector<string> > v; 

void display(){ 
    for(int i=0; i<v.size(); i++){ 
     cout << "Scope " << i+1 << ": " << endl; 
     for(int j=0; j<v[i].size(); j++) 
      cout << v[i][j] << endl; 
     cout << endl; 
    } 
} 

void insert(string s){ 
    v[stacknum].push_back(s); 
} 

int main(){ 
    string data; 
    ifstream file; 
    file.open("input"); 

    if(!file.is_open()) { 
     cout << "Input file not found"; 
     return 1; } 

    while(file >> data){ 
     if(data=="{"){ 
      stacknum++; 
      vector<string> row; 
      v.push_back(row); 
      continue; 
     } 

     if(data=="}"){ 
      stacknum--; 
      continue; 
     } 

     insert(data); 
    } 
    file.close(); 

    display(); 

    return 0; 
} 
+1

왜 범위 3에 있어야합니까? '{q}'는'{b}'의 형제이며 중첩되지 않습니다. 이 입력을 나무 형태로 표현하고자한다면 데이터 저장 모델을 재고해야한다고 말하고 싶습니다. 범위 수준의 단일 스택이 너무 순진합니다. –

+0

하나의 중첩 된 벡터 만 사용할 수있는 것처럼 매우 평면 구조를 갖는 대신 * tree *를 생각해보십시오. –

+0

중첩 된 벡터가 작동합니까? Google에서 대부분의 결과는 해시 테이블을 기호 테이블에 사용 하겠지만 비슷한 기능을 사용하지는 않겠습니까? 변수의 범위를 나타내는 2D 벡터의 각 행을 묘사합니다 (int a; float b;}. 코드를 오른쪽 행에 넣으면됩니다. –

답변

0

인덱스만으로는 현재 범위를 추적 할 수 없습니다. 스택이 필요합니다. 또는 (더 유용하게도) 각 범위의 부모 범위를 기록해야합니다. 두 번째 벡터 또는 범위 개체에 여분의 데이터 멤버를 포함하여 수행 할 수 있습니다.

두 경우 모두 새 범위를 입력 할 때 범위 개체의 벡터 끝에 새 범위 개체 (부모 범위 색인이 연결된 벡터)를 만들고 해당 개체의 인덱스를 " 현재 범위 색인 ". 범위를 벗어날 때 현재 범위 색인은 현재 범위의 부모로 설정됩니다.

부모 포인터는 기호를 검색 할 때 유용합니다. 기호를 찾을 때까지 현재 범위의 부모를 모두 검색해야합니다.

모델링하려는 범위 지정 규칙에 따라 적절하지 않을 수 있습니다. 예를 들어, C에서 선언 된 변수의 범위는 둘러싸는 블록의 시작이 아니라 선언에서 시작하기 때문에 C의 범위 지정 규칙을 정확하게 모델링합니다. 그러나 왼쪽에서 오른쪽으로 입력을 구문 분석 할 때 모든 기호 조회를 수행하는 한 AST 작성에 충분할 수 있습니다.