| ポジションイテレータ |
![]() |
![]() |
![]() |
しばしば、入力ストリームの書式にエラーを検出することができるような構文解析器を書くとき、その入力の中のどこでそのエラーが起こったのかユーザに通知したくなることがある(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 のフィールド | |
std::string
file; |
ファイルの名前。フルパス名であることもある |
int
line; |
そのファイルにおける行数。デフォルトでは、最初のラインは1行となる |
int column; |
そのファイルにおけるカラム数。最初のカラムは1である |
![]() |
![]() |
![]() |
Copyright © 2002 Juan Carlos Arevalo-Baeza
Permission to copy, use, modify, sell and distribute this document
is granted provided this copyright notice appears in all copies. This document
is provided "as is" without express or implied warranty, and with
no claim as to its suitability for any purpose.
Japanese Translation Copyright © 2003 Kent.N
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。
このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)