リファレンスのトップ


大項目 記法 説明 返り値と変数への代入(Attribute)
パイプ(|)パーサ
Alternative Parser
a | b

aもしくはbにマッチするもの。
意味合いとしては、「OR」ではなく

「if~else if~else if~」 という表現に近いです。
次の違いを見るともう少し、イメージできると思います。


例: 以下は同じではありません。
表現①: (double_ | int_)
表現②: (int_ | double_)
例えば、入力が"123.45"のとき、①では完全マッチしますが、②では完全マッチしません。
①の場合、double_ は小数点文字(ピリオド)も許すため、「.45」まで読み進めます。
しかし、②の場合、int_ は、数字でない文字が表れるまで読み進めます。ピリオドは数字ではないので、「123」までです。つまり、()内はint_ にマッチして()を抜けます。そして次のパーサがないので、次の読み取りで終端にならなければなりませんが、「.45」が残っているので、マッチしないのです。

つまり、パイプ(|)は、else ifと同様に最初にマッチしたパーサを適用してそこまで読み進め、次のパーサにマッチするかを検証しようとするのです。

※このように次のパーサのマッチに失敗した時に、読み進めた位置を元に戻してもう一つのパーサbを検証しません。また、保管した返り値も元に戻しません。このことを、spirit本家のドキュメントでは「ロールバック(rollback)しない」と表現しているようです。
英語のドキュメントを読むときにこの知識が役立つかもしれません。

a: A, b: B --> (a | b): variant<A, B>
a: A, b: Unused --> (a | b): optional<A>
a: A, b: B, c: Unused --> (a | b | c): optional<variant<A, B> >
a: Unused, b: B --> (a | b): optional<B>
a: Unused, b: Unused --> (a | b): Unused
a: A, b: A --> (a | b): A
And述語パーサ
And-Predicate Parser
&a

unused_type
差分パーサ
Difference Parser
a - b パースaにマッチして、bにはマッチしないもの。
条件から外すときに便利です。

例: 入力文字列 "/*A Comment*/"
"/*" >> *(char_ - "*/") >> "*/"

⇒マッチします。 
もし、"/*" >> *char_ >> "*/" だとマッチしません。char_ はなんでもマッチするので、入力の最後の"*/"までマッチして読み進めます。位置が終端まで行った後に、「>> "*/"」にマッチするか試すため、当然マッチしません。
a: A, b: B --> (a - b): A
a: Unused, b: B --> (a - b): Unused
期待値チェックパーサ
Expectation Parser
a > b 入力がある条件に一致しなければならない場合にあります。
そんなときに使用するのがこの演算子です。
このパーサで指定したパーサa bが順番にマッチしない場合は、例外を発生します。
a: A, b: A --> (a > b): vector<A>
a: vector<A>, b: A --> (a > b): vector<A>
a: A, b: vector<A> --> (a > b): vector<A>
a: vector<A>, b: vector<A> --> (a > b): vector<A>
アスタリスクパーサ
Kleene Parser
*a 0回以上aにマッチする演算子です。
注意点としては、パーサaがマッチするたびに返り値が返って、保管先に保管されることです。

例: 入力が "abc"
vector<string> vec;
qi::parse(first, last, *qi::char_, vec);

⇒vec[0]には、"a"が格納されます。
なんとなくvec[0]="abc"となりそうですが、毎回char_ にマッチするたびに返り値が保管されます。
もし、"abc"を格納したい場合は、qi::as_string[*qi::char_] というように記述すると良いかと思います。
a: A --> *a: vector<A>
a: Unused --> *a: Unused
配列パーサ
List Parser
a % b 配列に分解する演算子です。

a >> *(b >> a) と同じ意味になります。

例: "111, 222, 333, 444, 555"
int_ % ','
a: A, b: B --> (a % b): vector<A>
a: Unused, b: B --> (a % b): Unused
否定パーサ
Not-Predicate Parser
!a パーサaとマッチしなければ、成功。マッチした場合はその時点で失敗(fail)になります。
パーサaとマッチしない場合は、次のパーサに行きますが、!aは返り値は返しません。
例: 入力は、"abcdef;"
*(!lit(';') >> char_) >> ';'
unused_type
オプション的パーサ
Optional Parser
-a 0回もしくは1回だけマッチする演算子です。

例: 入力は、"123"
-('+' | '-') >> int_
⇒例題の入力だけでなく、"+123"や"-123"にもマッチします。
a: A --> -a: optional<A>
a: Unused --> -a: Unused
順列自在パーサ
Permutation Parser
a ^ b ハット(^)でつないだパーサのうち、1個以上のパーサにマッチします。
ただし、a、bの順番は任意です。
つまり、 aや bや、 a >> b にも、b >> aにもマッチします。

例: 入力は、"ACTGGCTAGACT"
*(char_('A') ^ 'C' ^ 'T' ^ 'G')
a: A, b: B --> (a ^ b): tuple<optional<A>, optional<B> >
a: A, b: Unused --> (a ^ b): optional<A>
a: Unused, b: B --> (a ^ b): optional<B>
a: Unused, b: Unused --> (a ^ b): Unused
1個以上パーサ
Plus Parser
+a 1回以上マッチする演算子です。 a: A --> +a: vector<A>
a: Unused --> +a: Unused
順番パーサ
Sequence Parser
a >> b パーサaにマッチした後、パーサbにマッチします。
入力文字列が、順番にマッチする場合に成功します。
a: A, b: B --> (a >> b): tuple<A, B>
a: A, b: Unused --> (a >> b): A
a: Unused, b: B --> (a >> b): B
a: Unused, b: Unused --> (a >> b): Unused

a: A, b: A --> (a >> b): vector<A>
a: vector<A>, b: A --> (a >> b): vector<A>
a: A, b: vector<A> --> (a >> b): vector<A>
a: vector<A>, b: vector<A> --> (a >> b): vector<A>

順列OR混合パーサ
Sequential Or Parser
a || b 「aのみ」もしくは、「bのみ」にマッチするか、「a b」の順番に両方にマッチする演算子です。

【解釈の順番と返り値】
入力文字列が、「aのみ」、「bのみ」、「aとb」の3つのうちどれにもマッチする場合、いったいどれにマッチするのでしょうか?
どうも、「aとb」をまず試して、マッチしないと、「aのみ」、「bのみ」の順番にで試すようです。
例: 入力は、"123.456"
int_ || ('.' >> int_)
 ⇒数値123 と456の2つが返り値として保管されます。
  もし、入力が"123"の場合は、「aのみ」にマッチします。
  もし、入力が".456"の場合は、「bのみ」にマッチします。
a: A, b: B --> (a || b): tuple<optional<A>, optional<B> >
a: A, b: Unused --> (a || b): optional<A>
a: Unused, b: B --> (a || b): optional<B>
a: Unused, b: Unused --> (a || b): Unused

a: A, b: A --> (a || b): vector<optional<A> >