/*! * 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 = マッチした長さ // // ★ 「マッチした長さ」は,コールバックされた理由を表す場合もあります. // len == -1 => これから rule_name のマッチングを開始します // len >= 0 => rule_name がマッチしました // len == -2 => rule_name がマッチしませんでした // // ただし,マッチは「確定」ではありません. // 後のマッチングによっては,結局受理されない事が判明する場合もあります. // // ルールの例: // rule ::= foo bar // foo ::= "foo" // bar ::= "bar" // // 入力の例: // foobaz // // このコールバックが呼ばれる順序: // rule_name = "rule", start = 0, len = -1 (これから rule のマッチングを開始します) // rule_name = "foo", start = 0, len = -1 (これから foo のマッチングを開始します) // rule_name = "foo", start = 0, len = 3 (foo がマッチしました) // rule_name = "bar", start = 3, len = -1 (これから bar のマッチングを開始します) // rule_name = "bar", start = 3, len = -2 (bar はマッチしませんでした) // rule_name = "rule", start = 0, len = -2 (rule はマッチしませんでした) // // この例では,ルール foo は一応マッチしたように報告されますが, // 最終的なトップルール rule は入力全体を受理しませんでしたとさ. // 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_