[English][日本語]

Yet another parser library for C++, yapc++

yapc++について

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 

ダウンロード

ドキュメント

Coming soon...

開発者