| 文字集合 |
![]() |
![]() |
![]() |
文字集合chsetは、 そのテンプレートパラメータCharTの制限によって 有限の範囲に制限された文字の集合にマッチする。 このクラスは、単一の文字の集合に対して動作するパーサの最適化の一つである。 テンプレートクラスは文字型CharTによってパラメータ化され、 8、16、32ビットおよび64ビット文字にさえ効率的に働く。
template <typename CharT = char> class chset;
chsetはリテラル(例、'x')、ch_pまたはchlit<>、range_pまたはrange<>、anychar_pおよびnothing_pから構築される(プリミティブを参照)か、または別の chset からコピーコンストラクタで構築される。 chsetクラスはインスタンスを容易に値渡しできるように copy-on-write スキームを用いる。
16/32/64ビット文字を扱う(accomodate)為に、chsetクラスは静的に切り替える、 文字型が8ビットより大きくないときのstd::bitsetの実装から、 disjoint rangeの整列済みベクタ(sorted vector)(range_run)を用いるsparseなビット/真理値集合へと。 その集合はadjacent or overlapping ranges are coalescedであるような範囲から構築される。 range_runは非常に空間的に経済的なものである、 多くの範囲と僅かなindividual disjoint valueがあるような状況で。 n を範囲の個数とすると、探索は O(log n) で行われる。 |
例:
chset<> s1('x'); chset<> s2(anychar_p - s1);
加えて(optionally)、文字集合は次の構文の定義文字列を用いて構築することもできる。 この構文は、集合要素の区切りを括弧(suqre bracket)でなく二重引用符で行う点を 除けば POSIX 形式の正規表現文字集合を resemble している。 また特殊な否定^文字はない。
range = anychar_p >> '-' >> anychar_p; set = *(range_p | anychar_p);
集合を C の文字列で定義しているため、通常の C/C++ のリテラル文字列の構文ルールが適用される。
例えば:
chset<> s1("a-zA-Z"); // アルファベット文字 chset<> s2("0-9a-fA-F"); // 16進数文字 chset<> s3("actgACTG"); // DNA 識別子 chset<> s4("\x7f\x7e"); // 16進数の 0x7F および 0x7E
標準的な Spirit の集合演算子(演算子を参照)に加えて、文字集合ごとに定義される(character-set-specific)逆(否定~)演算子が適用できる:
| 文字集合演算子 | |
| ~a | 集合の逆 |
| a | b | 集合の和 |
| a & | 集合の積 |
| a - b | 集合の差 |
| a ^ b | 集合の排他的論理和 |
ここでオペランド a および b はどちらも chset であるか、あるいはオペランドの一つが 文字リテラル、ch_pあるいはchlit、range_pあるいはrange、 anychar_pあるいはnothing_pオペランドである。 anychar_pとnothing_pオペランドには特殊な最適化されたオーバーロードが用意されている。 nothing_pオペランドは空の集合に変換され、一方で anychar_p オペランドは 用いられる文字型の全ての範囲(例えば、符号無し8ビット char なら0〜255)の要素を持つ集合に変換される。
特殊な場合は、~anychar_pはnothing_pをもたらす(yield)が、 しかし ~nothing_pは不正であるということである。 anychar_pの反転は非対称(asymmetrical)で、T*からvoid*への 変換のように片道旅行である。
| 特殊変換 | |
| chset<CharT>(nothing_p) | 空集合 |
| chset<CharT>(anychar_p) | CharT の全範囲(例えば符号無し8ビット char なら0〜255) |
| ~anychar_p | nothing_p |
| ~nothing_p | 不正 |
![]() |
![]() |
![]() |
Copyright © 1998-2003 Joel de Guzman
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
最新版ドキュメント(英語)