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個をインクルードするだけで、パーサを利用できてしまいます。
詳しくはチュートリアルで!