ポジションイテレータ

しばしば、入力ストリームの書式にエラーを検出することができるような構文解析器を書くとき、その入力の中のどこでそのエラーが起こったのかユーザに通知したくなることがある(we want it to communicate)。 最も古典的な例は、解析するプログラムの構文上の誤りを検出するコンパイラやインタプリタを書く際で、行番号とおそらくさらにエラーの見つかった行内の位置を示すようなものである。

position_iterator クラスはSpiritが提供するツールの一つで、パーサの書き手が容易にこの機能を実装できるようにする。 その概念は非常に単純だ: このクラスはイテレータのラッパーで、そのファイルの名前、行番号、カラム数を含む現在の位置を追跡する(keeps track of)。 それは一つのテンプレートパラメータを要求し、そのパラメータはラップされるイテレータの型である。

使用するためには、次のインクルードを追加する必要がある:

    #include <boost/spirit/iterator/position_iterator.hpp>

あるいは Spirit の全てのイテレータをインクルードする:

    #include <boost/spirit/iterator.hpp>

そのラッパーを構築するには、入力シーケンスのbeginとendの両方のイテレータ、それに入力シーケンスのファイル名が必要である。 加えて、開始行とカラム数(デフォルトは1)を指定することもできる。 パラメータなしのデフォルトコンストラクトは汎用的なシーケンス終端イテレータを作成する。 これは標準 C++ ライブラリのストリームオペレータと同じ作法である。

ラップされたイテレータは入力/前方向イテレータカテゴリに属していなければならず、position_iteratorはただそのカテゴリを継承する。

例えば、 begin と end の位置イテレータを入力 C 文字列から作成するには、 次のように用いる:

    char const* inputstring = "...";
    typedef position_iterator<char const*> iterator_t;

    iterator_t begin(inputstring, inputstring+strlen(inputstring));
    iterator_t end;

操作

    void set_position(file_position const&);

イテレータに保持されている現在の位置を変える必要があるときはこの関数を呼び出す。 例えば、もし C 形式の #include 指令を構文解析するなら、インクルードされたファイルの入力は、ファイルとカラムを1と1に、名前を新しいファイルの名前にしてから再開することでマークされなければならない(the included file's input must be marked by restarting the file and column to 1 and 1 and the name to the new file's name)。

    file_position const& get_position() const;

現在の位置を取得するにはこの関数を呼び出す。

    void set_tabchars(int);

一文字あたりのタブの数を設定するにはこれを呼び出す。 この値はカラム数を正確に追跡するために必要である。

file_position

file_position はあるファイルにおける位置を保持する構造体である。 そのフィールドは以下の通り:

file_position のフィールド
std::string file; ファイルの名前。フルパス名であることもある
int line; そのファイルにおける行数。デフォルトでは、最初のラインは1行となる
int column; そのファイルにおけるカラム数。最初のカラムは1である


このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)