基本的なトークン化構造/アルゴリズムが用意されています。それはかなり複雑で、私のデザインの「欠陥」についてあなたに啓蒙するのに十分簡単にそれを明確にできることを願っています。
クラスParserState
// bool functions return false if getline() or stream extraction '>>' fails
static bool nextLine(); // reads and tokenizes next line from file and puts it in m_buffer
static bool nextToken(); // gets next token from m_buffer, via fetchToken(), and puts it in m_token
static bool fetchToken( std::string &token ); // procures next token from file/buffer
static size_t m_lineNumber;
static std::ifstream m_fstream;
static std::string m_buffer;
static std::string m_token;
この設定の理由は、構文エラーが発生した場合に行番号を報告できるようにするためです。パーサーのフェーズ/状態に応じて、私のプログラムではさまざまなことが起こり、このParserStateのサブクラスはとを使用m_token
しnextToken
て続行します。 が空の場合はをfetchToken
呼び出し、引数に次のトークンを配置します。nextLine
m_buffer
istringstream stream;
do // read new line until valid token can be extracted
{
Debug(5) << "m_buffer contains: " << m_buffer << "\n";
stream.str( m_buffer );
if( stream >> token )
{
Debug(5) << "Token extracted: " << token << "\n";
m_token = token;
return true; // return when token found
}
stream.clear();
} while( nextLine() );
// if no tokens can be extracted from the whole file, return false
return false;
問題は、m_bufferから削除されたトークンが削除されず、を呼び出すたびに同じトークンが読み取られることnextToken()
です。問題は、それm_buffer
を変更できることです。したがって、istringstream::str
ループ内での呼び出しです。しかし、これが私の問題の原因であり、私が見る限り、それを回避することはできません。したがって、私の質問:stream >> token
文字列ストリームによって内部的にポイントされた文字列から何かを削除するにはどうすればよいですか?おそらく私はを使用する必要はありませんstringstream
が、この状況ではもっと基本的なもの(最初の空白を見つけて文字列から最初のトークンを切り取るなど)ですか?
10億ありがとう!
PS:行番号を追跡できる限り、関数/クラス構造を変更する提案は問題ありません(したがって、完全なファイルが読み込まれm_buffer
ず、クラスメンバーistringstream
があります。これは、行番号エラーの報告が必要になる前のことです)。