2013-10-27 3 views
0

저는 토큰 화기를 C++로 작성하고 있습니다. 파일에서 ""로 묶인 문자열 문자와 [및] 기호를 검색합니다. 토큰 객체를 생성하여 벡터에 저장합니다. 건너 뛰려면 input.get()을 호출하여 모든 공백 문자를 무시해야합니다. 그러나이 작업을 수행하는 올바른 방법인지 확신 할 수 없습니다. 나는 = 대신 ==와 같은 어리석은 오류를 만들 수있는 것처럼 느낀다. 나는 내가 뭘 잘못 내 오류가 UnterminatedStringLiteral 얻을이토큰 화기 작성시 문제가 발생했습니다.

] ] 
"ddsd" 

"sdsd" 

[[]]]]][[ 

같은 파일에이 코드를 실행하면 여기에 내 현재 코드 그러나

vector<Token> tokenize(wstring file) 
{ 
    ifstream input = ifstream(file); 
    vector<Token> tokens; 

    while(input.peek() != std::char_traits<char>::eof()) 
    { 
     wchar_t ch = (wchar_t) input.peek(); 

     if (isspace(ch)) 
     { 
      input.get(); 
     } 
     else if(ch == '[' || ch == ']') 
     { 
      input.get(); 
      wstring str(&ch); 
      tokens.push_back(Token(SYMBOL, str)); 
     } 
     else if (ch == '"') 
     { 
      wstringstream accum; 
      input.get(); 

      while(input.peek() != '"') 
      { 
       if(input.peek() == std::char_traits<char>::eof()) 
        endProgram(L"Unterminated String Literal"); 

       accum<<input.peek(); 
       input.get(); 
      } 

      tokens.push_back(Token(STRING, accum.str())); 
     } 
    } 

    for(int i = 0; i < tokens.size(); i++) 
    { 
     wcout<<tokens.at(i).getData()<<endl; 
    } 

    return tokens; 
} 

입니까? 나는 C++을 처음 사용하기 때문에 간단한 explantion이 좋을 것이다.

+0

오류 결과 'in.peek()'의'std :: char_traits :: eof()'는 '-1'이 아닌 철자를 사용합니다. '-1' 값이 일반적으로 사용되지만, 값이 -1 일 필요는 없습니다. –

+0

오 불이 바뀐다 – Popgalop

+0

여전히 오류가 발생한다 – Popgalop

답변

0

"토큰"을 추가 할 때 코드가 복잡해질 수 있습니다.
내가 중 하나 switch 문 사용하는 것이 좋습니다 :

switch (ch) 
{ 
    case '[': 
     //... 
     break; 
    case ']': 
     //... 
     break; 
// ... 
    default: 
     //... 
     break; 
}; 

또는 함수 포인터와 조회 테이블 사용 : 캐릭터가없는 경우에는이 두 코드 조각의

typedef (void)(*Function_Pointer_Type)(char ch); 
    struct Lookup_Table_Entry 
    { 
    char token; 
    Function_Pointer_Type token_processor_func; 
    }; 

    static const Lookup_Table_Entry token_table[] = 
    { 
    { '[', Open_Bracket_Handler}, 
    { ']', Close_Bracket_Handler}, 
    { '\"', String_Delimiter}, 
    }; 
    static const unsigned int token_table_size = 
    sizeof(token_table)/sizeof(token_table[0]); 

    //... 
    for (unsigned int i = 0; i < token_table_size; ++i) 
    { 
    if (ch == token_table[i].token) 
    { 
     token_table[i].token_processor_func(ch); 
     break; 
    } 
    } 

은 깨끗하고 사건을 처리 할 수 ​​있습니다 토큰.

테이블 조회를 통해 더 많은 토큰을 추가해야 코드를 쉽게 확장 할 수 있습니다.

+1

그래도 여전히 현재의 문제를 해결하지 못합니다 – Popgalop

0

나는

 while(input.peek() != '"') 
     { 
      if(input.peek() == std::char_traits<char>::eof()) 
       endProgram(L"Unterminated String Literal"); 

      accum<<input.peek(); 
      input.get(); 
     } 

     tokens.push_back(Token(STRING, accum.str())); 
가 있었어야

input.get(); 

를 건너,이 코드에서, 나는 내 문제를 알아 낸 다음과 같은 코드 ..

/// if(*parm_data == ' ' || *parm_data == ';' || *parm_data == '|' 
    // || *parm_data == '\t' || *parm_data == ',') break; 

     char *CHXLog::GetToken(char *parm_data, char *parm_token) 
     { 
      while(*parm_data != 0 && *parm_data != '\n') 
      { 

       if(*parm_data == ',') 
       {  
        break; 
       } 
       else 
       { 
        *parm_token =*parm_data; 
       } 
       parm_data++; 
       parm_token++; 
      } 

      *parm_token = '\0'; 

      return parm_data + 1; 

     } 
+0

잘 모르겠습니다. 내가하는 일을 이해하고, 원래 코드와 어떻게 관련되는지 모르겠다. – Popgalop

관련 문제