大項目 | 記法 | 説明 | 返り値と変数への代入(Attribute) |
パイプ(|)パーサ Alternative Parser |
a | b | aもしくはbにマッチするもの。 「if~else if~else if~」 という表現に近いです。
|
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> > |