caperとは
modernでクリーンなC++コードを出力するLALR(1)パーサジェネレータです。
おまけでJavaScript/C#/D/Java/Boo/Ruby/PHP/Haxe用のパーサも出力できます。
ニュース・履歴はダウンロードのページで。
English page is here.
コンセプト
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個をインクルードするだけで、パーサを利用できてしまいます。
詳しくはチュートリアルで!