yapc++ は C++ 用のとてもシンプルなライブラリです。 yapc++ は BNF のような記法を用いて、 cpp ファイルに直接パーサを記述することが出来ます。 yapc++ は入力にイテレータ ―ポインタや、STL のイテレータ― を 取ることが出来るので、字句解析器としても使用することが出来ます。 例えば、 char* を挙げてみます。 char* は字句解析器への入力データですが、 yapc++ はそれを、 字句解析にも、パースにも使用することが出来ます。 この使い方のおかげで、 yapc++ はとても便利で拡張性があり軽量なパーサライブラリです。 また、 boost::spirit のように 複雑な使用法を学ぶことなく、 パーサとしても、字句解析器としても、 スキャナとしても、文法解析器としても使うことが出来ます。
それでは、 CVS データのパーサプログラムを書いてみましょう。
#include <iostream>
#include <vector>
#include <iterator>
#include <yapcpp/yapcpp.h>
#include <yapcpp/stdrules.h>
using namespace std;
using namespace yapcpp;
int main() {
const char* csvdata = "1,2,3,4\n5,6,7,8\n9,10,11,12\n";
// まずパーサを定義します。
parser<char> p(csvdata, csvdata + strlen(csvdata));
// それから、 BNF のような記法を持ちいて CVS を解析するルールを定義します。
rule<char, vector<int> > csvline = sepby_p(int_p(), symbol_p(","));
rule<char, vector<vector<int> > > csv = *hold(csvline[_] >> newline_p());
// そして、解析し、
vector<vector<int> > data;
p.run(csv[&data]);
// 出力します。
for (vector<vector<int> >::iterator ite = data.begin();
ite != data.end(); ++ite) {
copy(ite->begin(), ite->end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
}
// 1 2 3 4
// 5 6 7 8
// 9 10 11 12
最新版: 0.0.1a
Coming soon...