俺 Tokenizer を作る ~Boost.Tokenizer のカスタマイズ~

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

Tt_clown ( 津川 知朗) 俺 Tokenizer を作る ~ Boost.Tokenizer のカスタマイズ~ 2009/12/121 Boost 勉強会.
わんくま同盟 横浜勉強会 #1 - C++ Day Boost とその実装技術 ~ Boost の薄い話から濃い話まで~
プログラミング言語としてのR 情報知能学科 白井 英俊.
3日で作るtwitterクライアント clown (tt_clown)
Ex7. Search for Vacuum Problem
プログラミング基礎I(再) 山元進.
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
Ex8. Search for Vacuum Problem(2)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
とても使いやすい Boost の serialization
とても使いやすい Boost の serialization
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
第8回 プログラミングⅡ 第8回
条件式 (Conditional Expressions)
Boost.勉強会 #8 大阪 ( ) C++ Tips 3 カンマ演算子編.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第20章 Flyweight ~同じものを共有して無駄をなくす~
関数 関数とスタック.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
アルゴリズムとデータ構造 2011年6月20日
第10回 プログラミングⅡ 第10回
プログラミング演習3 第2回 GUIの復習.
コンパイラの解析 (2) GCJのデータ構造 - 1.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
プログラミング 4 記憶の割り付け.
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
Collection, Generics, Iterator
プログラミング入門2 第11回 情報工学科 篠埜 功.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
プログラミング基礎B 文字列の扱い.
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
Ex7. Search for Vacuum Problem
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
フロントエンドとバックエンドのインターフェース
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
記号表の検索と登録 長谷川啓
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
C#プログラミング実習 第3回.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
Post-Kona paper 解説 P0083R1: Splicing Maps and Sets (Rev.3) 稲葉 一浩
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
プログラミング 4 文字列.
アルゴリズムとデータ構造 2010年6月17日
フレンド関数とフレンド演算子.
演算子のオーバーロード.
PROGRAMMING IN HASKELL
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
情報処理Ⅱ 2005年11月25日(金).
プログラミング入門2 第5回 配列 変数宣言、初期化について
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
値渡しと参照渡しについて.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
Presentation transcript:

俺 Tokenizer を作る ~Boost.Tokenizer のカスタマイズ~ tt_clown (津川 知朗) tt.clown@gmail.com http://d.hatena.ne.jp/tt_clown/ 2009/12/12 Boost 勉強会

自己紹介 tt_clown (津川 知朗) 公開しているもの Blog tt_ プレフィクスは要らない子 小さなベンチャー会社でコードを書いてます 公開しているもの CLX C++ Libraries: http://clx.cielquis.net/ FAQ: Q.名前被ってね? A. ゴメンナサイ Blog Life like a clown: http://d.hatena.ne.jp/tt_clown/ 2009/12/12 Boost 勉強会

目次 今日の目標: scanf () 風の機能を持つクラスの実装 実装指針: Boost.Tokenizer をカスタマイズする FormatSeparator 実装方針 サンプル・コード Scanner クラスの実装 まとめ 2009/12/12 Boost 勉強会

今日の目標 scanf() のような機能を持つクラス scanner を作る http://clx.cielquis.net/scanner.html int main() { std::string s = “2009/12/12T13:10:25” std::string format = “%s/%s/%sT%s:%s:%s”; int year = 0, mon = 0, day = 0; int hour = 0, min = 0, sec = 0; scanner(s, format) % year % mon % sec % hour % min % sec; // 結果を表示するためのコードを書く. return 0; } このクラスを実装する 2009/12/12 Boost 勉強会

実装の指針 Boost.Tokenizer をカスタマイズ ポリシー・クラスとは? ポリシー・クラスのメリット ポリシー・クラスの自作によるカスタマイズの一例 ポリシー・クラスとは? Modern C++ Design [1] で広まった設計思想 あるクラスの鍵となる「動作」に Interface を決めておく この Interface に合致するクラスがポリシー・クラス ポリシー・クラスのメリット 状況に応じて「動作」を選択できるため拡張性が高い [1] アンドレイ・アレキサンドレスク (訳:村上 雅章),“Modern C++ Design”,2001. 2009/12/12 Boost 勉強会

Boost.Tokenizer のポリシー・クラス template < class TokenizerFunc, class Iterator = std::string::const_iterator, class Type = std::string > class tokenizer; ここにポリシー・クラスを指定する TokenizerFunc の Interface class tokenizer_func_skelton { public: template <class InIter, class Token> bool operator()(InIter& next, InIter last, Token& dest); void reset(); }; [next, last) から次のトークンを切り出して dest へ格納する. 切り出しに成功した場合は true,それ以外は false を返す. 2009/12/12 Boost 勉強会

FormatSeparator scanf() 風の文字列分割を実現するためのBoost.Tokenizer のポリシー・クラス class format_separator { public: format_separator(const string_type& fmt, bool x = true) : fmt_(fmt), skipws_(x), cur_(fmt_.begin()) {} void reset() { ... } template <class InIter, class Token> bool operator()(InIter& next, InIter last, Token& dest) { .... } }; 2009/12/12 Boost 勉強会

FormatSeparator 実装方針 変換指定*1以外の文字列マッチで判定 型修飾子は s のみ (%d, %f, %x, などを許さない) 型変換は,scanner に任せる 代入直前に lexical_cast を用いて変換する 空白文字の扱いを scanf() に似せる 書式: %s foo %s bar %s 入力: hoge foo fuga bar boke ()演算子が呼ばれる度に dest にセットする文字列 *1 ``%’’ で始まる文字列 2009/12/12 Boost 勉強会

FormatSeparator サンプルコード int main() { std::string s = “Sat Dec 12 13:10:25 JST 2009”; std::string format = “%s %s %s %s:%s:%s %s %s”; typedef boost::tokenizer<format_separator> fmttokenizer; format_separator sep(format); fmttokenizer token(s, sep); std::cout << “source: “ << s << std::endl; for (fmttokenizer::iterator pos = token.begin(); pos != token.end(); ++pos) { std::cout << “<“ << *pos << “> “; } std::cout << std::endl; return 0; 2009/12/12 Boost 勉強会

Scanner の実装 class scanner { public: scanner(const string_type& s, const string_type& fmt) : v_(), cur_() { format_separator sep(fmt); boost::tokenizer<format_separator> x(s, sep); v_.assign(x.begin(), x.end()); cur_ = v_.begin(); } template <class Type> scanner& operator%(Type& dest) { if (cur_ != v_.end()) { dest = boost::lexical_cast<Type>(*cur_++); return *this; }; 2009/12/12 Boost 勉強会

まとめ scanf() 風の機能を持つクラスの実装 Boost.Tokenizer のカスタマイズと言うアプローチ ポリシー・クラスの作成/利用方法の一例として紹介 ポリシーに基づくクラス設計のメリット 鍵となる「動作」を Interface として抽象化しておく それ以外の部分の再利用性が高まる 状況に応じたポリシー・クラスを選択できる 高いカスタマイズ性を確保できる 2009/12/12 Boost 勉強会

関連URL clx::scanner clx::tokenizer_func boost::tokenizer で scanf を作ってみる http://clx.cielquis.net/scanner.html clx::tokenizer_func http://clx.cielquis.net/tokenizer_func.html boost::tokenizer で scanf を作ってみる http://d.hatena.ne.jp/tt_clown/20090902/1251822236 2009/12/12 Boost 勉強会