文字集合

文字集合 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 方式を用いる。

まばらなビットベクタ

chset クラスは 文字型が8ビットより大きくないときは std::bitset で実装されているが、 16/32/64ビット文字を収める為にばらばらな範囲の整列済みベクタ(range_run)を利用したまばらなビット/真理値集合による実装へと静的に切り替わる。 その集合は、近接したり重複したりする範囲は併合して構築される。

範囲が多く、個別のばらばらな値が僅かであるような状況では、 range_run は空間的にとても経済的である。 n を範囲の個数とすると、探索は O(log n) で行われる。

例:

    chset<> s1('x');
    chset<> s2(anychar_p - s1);

状況によっては、次の構文での定義文字列を用いて文字集合を構築することもできる。 この構文は、括弧(suqre bracket)でなく二重引用符で集合の要素を区切る点を 除けば POSIX 形式の正規表現文字集合と共通している。 また、特殊な否定^文字はない。

    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 の集合演算子(演算子を参照)に加えて、文字集合ごとに定義される逆(否定~)演算子が適用できる:

文字集合演算子
~a 集合の逆
a | b 集合の和
a & 集合の積
a - b 集合の差
a ^ b 集合の排他的論理和

ここでオペランド a および b はどちらも chset であるか、あるいはオペランドの一つが 文字リテラル、ch_pあるいはchlitrange_pあるいはrangeanychar_pあるいはnothing_pオペランドである。 anychar_pnothing_pオペランドには特殊な最適化されたオーバーロードが用意されている。 nothing_pオペランドは空の集合に変換され、一方で anychar_p オペランドは 用いられる文字型の全ての範囲(例えば、符号無し8ビット char なら0〜255)の要素を持つ集合に変換される。

特殊なケースとして、 ~anychar_pnothing_p をもたらすが、 ~nothing_p は不正である。 anychar_p の反転は非対称で、 T* から void* への変換のように片道旅行である。

特殊変換
chset<CharT>(nothing_p) 空集合
chset<CharT>(anychar_p) CharT の全範囲(例えば符号無し8ビット char なら0〜255)
~anychar_p nothing_p
~nothing_p 不正



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