リファレンスのトップ



大項目 記法 説明 返り値と変数への代入(Attribute)
スキップ無視ディレクティブ
Parser Directive Inhibiting Skipping 
lexeme[p]  スキップ機能をオフにします。ただし、他のパーサと同様に先頭のスキップは行います。
使用ケースとしては、phrase_parse()関数でパースする場合です。
例:
phrase_parse()で、スキップ(skipper)にqi::space、入力文字列を以下の場合。
入力: " 123 78"
・+qi::char_ ⇒ "12378"
・lexeme[+qi::char_] ⇒ "123 78"
・no_skip[+qi::char_] ⇒ " 123 78"
p: P --> lexeme[p]: P
p: Unused --> lexeme[p]: Unused
パーサpが代入に使用されない場合は、全体の返り値も代入されない。
パーサpが代入される場合は同じ値を代入する。
全スキップ無視ディレクティブ
Parser Directive Inhibiting Skipping Without Pre-skip 
no_skip[p] 全てのスキップを無視します。
lexemeとの違いは、lexemeが先頭のスキップは無視しないのに対し、このディレクティブは、先頭のスキップも無視する点です。
使用ケースとしては、phrase_parse()関数でパースする場合です。
例:
phrase_parse()で、skipperにqi::space、入力文字列を以下の場合。
入力: " 123 78"
・+qi::char_ ⇒ "12378"
・lexeme[+qi::char_] ⇒ "123 78"
・no_skip[+qi::char_] ⇒ " 123 78"
p: P --> no_skip[p]: P
p: Unused --> no_skip[p]: Unused
パーサpが代入に使用されない場合は、全体の返り値も代入されない。
パーサpが代入される場合は同じ値を代入する。
大文字小文字を無視するディレクティブ
Parser Directive Inhibiting Case Sensitivity 
no_case[p]  このディレクティブは、どのような入力に対してもカーソルを移動しない。サブジェクトパーサが大文字小文字を区別しないように強要することが目的である。 p: P --> ns::no_case[p]: P
p: Unused --> ns::no_case[p]: Unused
パーサpが代入に使用されない場合は、全体の返り値も代入されない。
パーサpが代入される場合は同じ値を代入する。
属性を無視するディレクティブ
Parser Directive Ignoring Attribute 
omit[p]  主題のパーサの返り値がunusedになるように、属性をを無視する。??
読み取りを無視する模様。
unused_type


全体 ⇒ 代入しない
p ⇒ 代入しない
非属性化ディレクティブ
Directive for Transduction Parsing (raw[])
raw[p]

??パーサpの返り値を無視し、代わりにpでマッチした全体の、開始と終了の2つのiteratorを返します。
旧spiritに近い動作にすることができます。


パーサpの中身がたくさんのパーサがあるときに使用するものと思われます。
例: 入力は、"James007"
raw[(alpha | '_') >> *(alnum | '_')]
⇒ 入力"James007" のiteratorで、先頭と最後の2つを返します。

a: A --> raw[a]: boost::iterator_range<Iter>
a: Unused --> raw[a]: Unused
全体 ⇒ マッチ箇所の文字列
p ⇒ 代入しない
Repetition Parser Directive (repeat[]) パワフルで柔軟性のあるパーサの繰り返しを提供します。
 
  repeat[p] 0回以上の繰り返し。 p: P --> repeat[p]: vector<P>
p: Unused --> repeat[p]: Unused
  repeat(n)[p] n回の繰り返し。 p: P --> repeat(n)[p]: vector<P>
p: Unused --> repeat(n)[p]: Unused
  repeat(min, max)[p] min以上max以下の繰り返し。 p: P --> repeat(min, max)[p]: vector<P>
p: Unused --> repeat(min, max)[p]: Unused
  repeat(min, inf)[p] min以上の繰り返し。繰り返し回数は無限。
繰り返す回数は、失敗するまでか、入力が終わるまで。
例: 文字aの10以上の繰り返し。
qi::repeat(10, qi::inf)["a"] 
p: P --> repeat(min, inf)[p]: vector<P>
p: Unused --> repeat(min, inf)[p]: Unused
パーサテストディレクティブ
Directive Testing if Parser Succeeded (matches[])
matches[p]  pのパーサを実行して、マッチしたかどうか(true/false)を返します。 boolを返す。
スキップ再設定パーサ
Parser Directive Re-Establishing Skipping (skip[])
スキップをするようになります。 test_parser("1, 2, 3, 4, 5", skip(space)[int_ >> *(',' >> int_)]);
  skip[p] lexeme[]やno_skip[]で無効化したスキップを元に戻します。
主にphrase_parse()関数で使用することになると思います。
p: P --> skip[p]: P
p: Unused --> skip[p]: Unused
  skip(c)[p] パーサcにマッチした文字をスキップします。先頭でもスキップします。
例:入力" 1, 2, 3, 4, 5"に対して。
qi::skip(qi::space)[qi::int_ >> *(',' >> qi::int_)]
p: P --> skip(c)[p]: P
p: Unused --> skip(c)[p]: Unused
返り値代入管理ディレクティブ
Parser Directive for Attribute Commit/Rollback (hold[])
hold[p] これは、返り値の管理を助けます。
通常、パイプ(|)パーサが先頭に戻ってパースし直す場合、返り値の代入は自動ではリセットされません。
例えば、以下のパースを入力文字列"MM"に対して行う場合、
全体の結果としてどのような返り値が出来上がると思いますか?
(qi::alnum >> qi::alnum >> qi::alpha)
| (qi::alnum >> qi::alnum);
答えは、"MMMM"です。直感と違いますよね?
説明:
上記のパースの形式は、「パース① |パース ②」という記述の仕方です。
最初のパース①(qi::alnum >> qi::alnum >> qi::alpha)の中では、最初の2つのqi::alnumはマッチするので、返り値"MM"が保管されます。最後の3つ目は、入力文字が存在しないため、失敗し、保管が行われません。
しかし、失敗しているのにも関わらず、保管は"MM"のまま、②の1つ目、2つ目のqi::alnumの検査をして、それぞれの返り値が保管され、結果"MMMM
"となります。
"MM"を返したい場合は、以下のようにします。
hold[(qi::alnum >> qi::alnum >> qi::alpha)] | (qi::alnum >> qi::alnum);
⇒hold内の保管は、実際の保管場所とは違う場所に保管され、マッチした時に実際の保管場所にコピーされます。マッチしない場合は破棄されます。
p: P --> hold[p]: P
p: Unused --> hold[p]: Unused

Parser Directives Forcing Atomic Assignment (as<T>, as_string[], as_wstring[])  
  as<T>()[p] 型Tのコンテナ(vector<T>など)の一時オブジェクトを生成します。パーサpを実行し、結果、コンテナを返り値として返します。もしパーサpがマッチした場合、コンテナをattrに割り当てます。 a: A --> as<T>()[a]: T
  as_string[a] as<std::string>()[a] と同じです。 同上
  as_wstring[a] as<std::wstring>()[a] と同じです。 同上




リファレンスのトップ


大項目 記法 説明 返り値と変数への代入(Attribute)
文字パーサ
Character Parser
1文字を表すパーサ。  
  lit(ch) chと一致する文字1文字を表します。
litは全く同じ名前で()内に文字列を指定できる別のパーサもあります。つまり、記述上は、1文字、文字列の両方を指定できます。
例:
'x'
lit('x')
lit(L'x')
lit(c) // cはchar型変数
unused
もしくは、chがLazy引数の場合、chを呼び出した時の返り値の文字型(charかwcharのことを指していると思われる)。
  char_ 任意の1文字を表すパーサ。 マッチした文字。型はパースのときに指定した型、charかwcharと思われる。
  char_(ch) chで指定した1文字を表すパーサ。
例:
char_('x') // 'x'とマッチする。
char_(L'x') // L'x'とマッチする
char_(x) //xはchar型変数
同上
  char_(first, last) 指定の範囲にマッチする1文字を表すパーサ。
例:
char_('a','z') // a-zの範囲の文字
char_('0','9') //0-9の範囲の文字
同上
  char_(def) defで指定した文字1文字。
defは、正規表現の角カッコ([])で指定するような文字の指定の記法で書けます。ただし、否定(^)は使用できません。
例:
char_("a-zA-Z") // alphabetic characters
char_("0-9a-fA-F") // hexadecimal characters
char_("actgACTG") // DNA identifiers
char_("\x7f\x7e") // Hexadecimal 0x7F and 0x7E
同上
  ~cp

文字パーサcpで指定した文字以外。

おそらく、1文字を扱う文字パーサに対してしか使えないと思います。

パーサcpの返り値。
文字種別パーサ
Character Classification Parsers
様々な1文字を表すパーサ  
  alnum 英数字1文字とマッチ。 マッチした文字。型はパースのときに指定した型、charかwcharと思われる。
  alpha 英文字1文字とマッチ。 同上
  blank 空白もしくは、タブ(\t、\v)にマッチ。 同上
  cntrl 制御文字1文字にマッチ。 同上
  digit 数字1文字にマッチ。 同上
  graph 空白以外の印字文字1文字にマッチ。 同上
  lower 小文字1文字にマッチ。 同上
  print 印字文字1文字にマッチ。 同上
  punct 句読点1文字にマッチする。std::ispunct()がtrueを返す文字。 同上
  space 空白、タブ(\t、\v)、改行(\n)、LF(\r) 同上
  upper 大文字1文字にマッチ。 同上
  xdigit 16進数文字1文字にマッチ。 同上


リファレンスのトップ


大項目 記法 説明 返り値と変数への代入(Attribute)
バイナリデータ標準パーサ
Binary Native Endianness Parsers 
下に記述 バイナリのストリームをパースします。バイナリのストリームを対象の構造のネイティブなバイトデータに展開します。
 
  byte_ 任意の8ビットのバイトデータにマッチ。 boost::uint_least8_t
  word 任意の16ビットのバイトデータにマッチ。 boost::uint_least16_t
  dword 任意の32ビットのバイトデータにマッチ。 boost::uint_least32_t
  qword 任意の64ビットのバイトデータにマッチ。 boost::uint_least64_t
  bin_float 任意の浮動小数点型floatにマッチ。 float
  bin_double 任意の長さの浮動小数点型doubleにマッチ。 double
  byte_(b) bと一致する8ビットのバイトデータにマッチ。例:byte_(0x01) unused
  word(w) wと一致する16ビットのバイトデータにマッチ。例:word(0x0201) unused
  dword(dw) dwと一致する32ビットのバイトデータにマッチ。 unused
  qword(qw) qwと一致する64ビットのバイトデータにマッチ。 unused
  bin_float(f) fと一致するfloatのバイトデータにマッチ。 unused
  bin_double(d) dと一致するdoubleのバイトデータにマッチ。 unused
バイナリデータ リトルエンディアンパーサ
Binary Little Endianness Parser 
下に記述 バイナリのストリームを対象の構造のネイティブなリトルエンディアンに展開します。
リトルエンディアンとは、バイトの展開の仕方が、逆になるというもののようです。
例えば、"AF0D"のような2バイトの数値の場合、short型としてメモリに展開するときに、1バイト目:「AF」、2バイト目:「0D」という展開方法と、1バイト目:「0D」、2バイト目:「AF」というように逆順に展開する方法があるようです。
前者をビッグエンディアン、後者をリトルエンディアンと言います。
 
  little_word 任意の16ビットのリトルエンディアンにマッチ。 boost::uint_least16_t
  little_dword 任意の32ビットのリトルエンディアンにマッチ。 boost::uint_least32_t
  little_qword 任意の64ビットのリトルエンディアンにマッチ。 boost::uint_least64_t
  little_bin_float 任意の浮動小数点型floatのリトルエンディアンにマッチ。 float
  little_bin_double 任意の浮動小数点型doubleのリトルエンディアンにマッチ。 double
  little_word(w) wと一致する16ビットのリトルエンディアンにマッチ。例:word(0x0201)=="\x01\x02" unused
  little_dword(dw) dwと一致する32ビットのリトルエンディアンにマッチ。 unused
  little_qword(qw) qwと一致する64ビットのリトルエンディアンにマッチ。 unused
  little_bin_float(f) fと一致するfloatのリトルエンディアンにマッチ。 unused
  little_bin_double(d) dと一致するdoubleのリトルエンディアンにマッチ。 unused
バイナリデータ ビッグエンディアンパーサ

Binary Big Endianness Parsers 
  上記の逆なので、説明省略。  



リファレンスのトップ

英語が良くわからず、?が多いです。。すみません。。汗



大項目 記法 説明 返り値と変数への代入(Attribute)
返り値パーサ
Attribute Parser (attr)
attr(定数値) このパーサは、パース時に読み取り位置を移動しません。
これによりいつでも空文字にマッチし、エラーとなることがありません。
このパーサの使用目的は、指定した値を保管先に保管することです。
使用例:
int i = 0;
string s("");
string::const_iterator begin = s.begin();
parse(begin, s.end(), attr(123), i);  ⇒ i=123が設定されます。
引数の値を返します。
Attribute Transformation Pseudo Parser (attr_cast)      
End of Line Parser (eol)      
End of Input Parser (eoi)      
Epsilon Parser (eps)      
Lazy Parser (lazy)      





リファレンスのトップ

大項目 記法 説明 返り値と変数への代入
(Attribute)
マッチイベント呼び出し
Action
p[fa] パーサpにマッチした時にfa関数を呼び出します。
faはtemplateで定義されているので、引数の型と数が合っていれば、関数でも関数オブジェクトでもよいです。

template <typename Attrib, typename Context>
void fa(Attrib& attr, Context& context, bool& pass);
p: P --> p[fa]: P
パーサpの返り値を返します。
パーサ自動推測パーサAuto auto_ 与えられた返り値型に従って、自動でパーサを作ります。
あらかじめ、型に対してどのようにパースを作るか(create_parse)を定義しておき、コンパイラに型に応じてどのcreate_parseを採用するかを決めさせます。
使用例: 以下の場合はintを推測させています。
int i = 0;
string s("123");
string::const_iterator begin = s.begin();
parse(begin, s.end(), auto_
, i);  ⇒ i=123が設定されます。

spiritで用意している定義(create_parse)も存在します。
以下の型に対しては用意されています。
char, wchar_t, short, int, long
unsigned short, unsigned int, unsigned long
float, double, long double
long long, unsigned long long bool
STLで用意されているコンテナ(std::vectorなど)
BoostのFusion sequence
boost::optional<> , boost::variant<>
hold_any
Boost.Anyと同じ意味です。