はじめに
サンプルについて

エラーについて

VC++でのコンパイルについて


【準備編】

・どのプログラム言語を学んだらいいの?

・C++をWindowsでフリーで開発するには?
・DevC++をインストールするには?

・wxDevC++をインストールするには?
・どんな本を参考にしたらいいの?

・Dev-C++やwxDev-C++でWindowsのDLLを使用するには?

・VC++でDLLから.libファイルを作成するには?



【C++編】

星文字処理
・区切り文字を分割するには?

・複数の文字のうち、いずれかの文字が最初に現れる位置を検索するには?

・HTMLのタグを分解するには?

・HTMLのタグを分解するには? (セパレータの拡張)
・HTMLタグの閉じ忘れをチェックするには?

・正規表現を使用するには?

・やってはいけない、switchで文字列を使用する方法とは?

・マルチバイト文字を扱うには?

・マルチバイト文字を扱うには?(変更版ver.2)

・数字や文字列を次々に連結してstringに出力するには?


 クローバー文字列処理のおまけ: ワイルドカード検索処理

 ・ワイルドカード検索をするには?
 ・ワイルドカード文字列をパースするには?
 ・部分一致のワイルドカード検索をするには?
 ・*や?にマッチした文字列を取得するには?
 ・Antパスマッチを実装するには?

 ・おまけ: ワイルドカードの全てのコードをまとめたもの


 ・追記:C言語版のAntパスマッチ



星ストリーム処理

・独自で作成したクラスを cout << できるようにするには?

・ファイルのサイズを取得するには?

・ファイルの内容をstringに入れるには?

・ファイルの内容を効率よくstringに入れるには?

・出力ストリーム(coutなど)でsetfill()などの有効範囲を関数内だけにするには?

・ストリームの読み込み位置を自由に変えるには?

・入出力ストリームをイテレータで扱うには?

・ログ出力を実装する上での注意点とは?

・ファイルロックをするには?(boostのfile_lock)

・ログ出力クラスを作成するには?

・iniファイルを読み込むには?




星配列処理

・vectorやlistにnewしたクラスを入れるには?

・vectorやlistをソートするには?

・独自のクラスをvectorやlistでソートするには?

・キーから値を検索するには? (連想配列)

・連想配列(ハッシュ)を作るには?



星コードの書き方

・違う型どうしを自由に変換するには?
・template を利用したクラスの外で、friend関数のコードを書くには?

・ユーザに処理の順番を自由に変更させるには?

・関数内で引数の値を変更させないようにするには?

・存在するオブジェクトの数を数えるには?

・派生クラスで、何度も同じ処理を書かなくても良いようにするには?

 (もしくは、コードの書き忘れを防ぐには?)

・ユーザに機能追加を自由にさせるには?

templateで一部の型以外の使用を禁止するには?
・型を気にせずに使用できるクラスを作るには?

・メモリリークを起こりにくくするには?

・関数を抜けるまでの処理時間を計るには?

・自作のイテレータを作成するには?



星WEB処理

・WEBの処理部分とデザイン部分を分けるには?

・WEBの処理部分とデザインを分けるサンプルの補足

・MVCを実現するには?

・MVCを実現するには?(サンプルその2)

・windowsでWEBをするには?

・GETやPOSTのデータを取得するには?

・POST/GETデータをアンエスケープするには?

・CGIセッションを実現するには?

・WEBデザイン(View)の拡張サンプル

・補足:WEBデザイン(View)の拡張サンプル



【C++データベース(DB)編】
・C++ でPostgresと接続するには?
・C++ でMySQLと接続するには?

・PostgreSQLのデータを取得するには?

・DBの種類を気にせずにコードを書くには?

・「DBの種類を気にせずに・・・」のヘッダ分解版 (1つ上の記事を.hと.cppに分解)

・MySQLの接続クラスを追加するには?




【C++GUI編】

・コンパイルはどうやってやればいいの?(GUIアプリの場合)

・wxDev-C++のフォントと予約語の色を変えるには?

・メニューバーでファイルを開く機能を追加するには?




【ドキュメント自動作成編】

・関数ヘッダからドキュメントを作るには? (javadocのように)

・doxygenでドキュメント作成するには?

・doxygenとは? ⇒使用上の注意点は?良く使用するタグは?




【言葉の説明】

・Boostとは?

・doxygenとは?

・HTTP通信とは?

・MD5とは?

・namespace(名前空間)とは?

・POSIXとは?

・shared_ptrとは?

・循環参照とは? (shared_ptr)

・Springとは?

・SQLインジェクションとは?

・templateの特殊化とは?

・typedefとは?

・Viewとは?

・virtualとは?

・wxDev-C++とは?

・wxWidgetsとは?

・イテレータとは?

・クッキーとは?

・コンストラクタで書かれるコロン「:」って何?

・バイナリモード、テキストモードとは?(ファイルのオープンモード)

・ハッシュとは?

・文字コード(の特徴)とは?

・漏補とは?










boost::spirit::qiの使い方は他の記事に譲りまして、

ここでは、フォーマット定義(rule)を作るためのクラス一覧を書いてみようと思います。


boost 1.55.0 の本家ドキュメントを翻訳する形ですが、英語はちょ~苦手むっ

google先生の翻訳でもよくわからない項目は項目だけ書いています。

すみませんあせる


まあ、間違いが多くても役に立つかもしれないので、とりあえず行ってみましょー。



【一覧の見方】

amebaの機能制限で、4万文字以上1つの記事で書けないようです。

ですので、一覧が別々の記事になってしまっています。

テーマ一覧で見てもらった方が見やすいかもしれないです。



【パーサについて】

一覧にしているパーサは、どのような解釈をするのか?と返り値は何か?が重要です。

返り値は本家のドキュメントのコピーですが、独特の記法で記述しています。

ここでは、その記法について軽く説明しておこうと思います。


記号 説明
 p パーサ
 P パーサpの返り値。
 fa Actionのための関数、関数オブジェクト
 a 任意の定数値。例:0.0 , "Hello"
 cp Character Parsers のどれかを指す。
 Unused パーサの返り値が保管されないことを示します。



<返り値の記法>

p: P --> no_skip[p]: P


上記のように書かれた場合、

パーサpの返り値がPのとき、no_skip[p]の返り値はPになる、という意味になります。



【パーサ一覧について】

文字列パーサ(String Parsers)
パーサ演算子(Parser Operators )
数値パーサ(Numeric Parsers )

パーサへの命令(Parser Directives)

文字パーサ(Character Parsers)

バイナリデータパーサ(Binary Parsers)

返り値補助パーサ(Auxiliary Parsers)

イベント機能等



リファレンスのトップ


記法 説明 返り値と変数への代入(Attribute)
文字列パーサ
String Parsers
文字列にマッチします。
このパーサは、lexemeパーサの機能も持っているので、スキップ機能が働きません。
 
  文字列"" 例: "abc" unused
  lit(s) 例: lit("abc") unused
  string型変数 例: string("abc") string型を返します
Symbols Parser 設定したマップに従って、値を変換します。

例: 入力は、"Banana"
symbols<char, int> sym;
sym.add("Apple", 1)
("Banana", 2)
("Orange", 3)
;
int i;
parse(begin, end, sym, i); //i=2 が入ります。
symbol<Char, T>の場合、 型Tで返り値を返します。


リファレンスのトップ


大項目 記法 説明 返り値と変数への代入(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> >



リファレンスのトップ


大項目 記法 説明 返り値と変数への代入(Attribute)
正数パーサ
Unsigned Integer Parsers
以下のtemplateの型を決めたパーサを提供します。
もちろん、自分でtemplateのパラメタを決めて使用することもできます。
uint_parser<T, Radix, MinDigits, MaxDigits>()
uint_parser<T, Radix, MinDigits, MaxDigits>()(num)

※型Tに応じたオーバーフローもチェックしていることにもご注意ください。
 
  lit(num) numで指定した数値にマッチするもの。 Unused
  ushort_ 正の整数。(num)つきのものは、numで指定した数値にマッチするもの。 unsigned short
  ushort_(num)
  uint_ 同上 unsigned int
  uint_(num)
  bin
  bin(num)
  oct
  oct(num)
  hex
  hex(num)
  ulong_ 同上 unsigned long
  ulong_(num)
  ulong_long 同上 boost::ulong_long_type
  ulong_long(num)
正負数パーサ
Signed Integer Parsers
以下のtemplateの型を決めたパーサを提供します。
もちろん、自分でtemplateのパラメタを決めて使用することもできます。
int_parser<T, Radix, MinDigits, MaxDigits>()
int_parser<T, Radix, MinDigits, MaxDigits>()(num)

※型Tに応じたオーバーフローもチェックしていることにもご注意ください。
 
  lit(num) numで指定した数値にマッチするもの。 unused
  short_ 正の整数。(num)つきのものは、numで指定した数値にマッチするもの。 short
  short_(num)
  int_ 同上 int
  int_(num)
  long_ 同上 long
  long_(num)
  long_long 同上 boost::long_long_type
  long_long(num)
浮動小数パーサ
Real Number Parsers
以下のtemplateの型を決めたパーサを提供します。
もちろん、自分でtemplateのパラメタを決めて使用することもできます。
real_parser<T, RealPolicies>()
real_parser<T, RealPolicies>()(num)

※型Tに応じたオーバーフローもチェックしていることにもご注意ください。
 
  lit(num) numで指定した数値にマッチするもの。 Unused
  float_ 浮動小数。(num)つきのものは、numで指定した数値にマッチするもの。 float
  float_(num)
  double_ 同上 double
  double_(num)
  long_double 同上 long double
  long_double(num)
ブールパーサ
Boolean Parser
以下のtemplateの型を決めたパーサを提供します。
もちろん、自分でtemplateのパラメタを決めて使用することもできます。
bool_parser<T, BoolPolicies>()
bool_parser<T, BoolPolicies>()(num)
 
  lit(boolean) booleanで指定した数値にマッチするもの。 Unused
  true_ bool型を提供します。 bool
  false_
  bool_
  bool_(boolean)