/*! * bnf::BnfParser * * Copyright (c) 2007 tkuri {at} fat.coara.or.jp */ #ifndef BNF_HPP_ #define BNF_HPP_ namespace bnf { //========================================================= // このモジュールが使う文字型です. // bnf_string.hpp も,この型を参照しています. typedef char char_t; //========================================================= // Callback(option, rule_name, start, len) // option = BnfParser::parse 第3引数の値がそのまま渡ってきます // rule_name = マッチしたルール名 // start = マッチ開始位置 // len = マッチした長さ // // ルール名を持つルールがマッチした *かもしれない* 時に // 呼ばれるコールバックです。 // ただし,マッチは確定ではありません. // // ルールの例: // rule ::= foo bar // foo ::= "foo" // bar ::= "bar" // // 入力の例: // foobaz // // まず foo がマッチしたかも知れないという事で,このコールバックが呼ばれます. // しかし次に bar がマッチしないので,結局,入力は受理されません. // もう少し複雑な例はサイトの方で... typedef bool (* Callback)(void *, char_t const *, int, int); //========================================================= /*! * BNF解析器のフロントエンドです. */ class BnfParser { class Context * x_; public: /*! * ルール文字列を入力し,インスタンスを初期化します */ BnfParser(char_t const * rule); /*! * データを入力し,ルールにそって解析します */ void parse( char_t const * data, char_t const * top_rule, void * option, Callback callback); /*! * デストラクタ */ ~BnfParser(); }; //========================================================= // 主にデバッグ用. // IMatcher のインスタンス数を返します int get_matchers_count(); } // end of namespace #endif // BNF_HPP_