caperとは

modernでクリーンなC++コードを出力するLALR(1)パーサジェネレータです。

おまけでJavaScript/C#/D用のパーサも出力できます。

ニュース・履歴はダウンロードのページで。

コンセプト

caperで出力したパーサのコードを他のプロジェクトと混ぜて「手書きのパーサですがなにか?」 と強弁できるのが理想。

格闘ゲームのコマンド解析に使えるくらい使いやすく!

たとえば?

こんな感じの入力ファイルが

%token Number<int> Add Sub Mul Div;
%namespace calc;
%dont_use_stl;

Expr<int> : [Identity] Term(0)
          | [MakeAdd] Expr(0) Add Term(1)
          | [MakeSub] Expr(0) Sub Term(1)
          ;

Term<int> : [Identity] Number(0)
          | [MakeMul] Term(0) Mul Number(1)
          | [MakeDiv] Term(0) Div Number(1)
          ;

こんな感じになって出てきます。(実装は省略)

namespace calc {

enum Token {
    token_eof,
    token_Add,
    token_Div,
    token_Mul,
    token_Number,
    token_Sub,
};

template < class Value, class SemanticAction, int StackSize >
class Parser {
public:
    typedef Token token_type;
    typedef Value value_type;

public:
    Parser( SemanticAction& sa );

    void reset();
    bool post( token_type token, const value_type& value );
    bool accept( value_type& v );
    bool error();
};

} // namespace calc

このヘッダファイル1個をインクルードするだけで、パーサを利用できてしまいます。

詳しくはチュートリアルで!