掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
boost::spiritを使っての構文解析器を、1つのクラスにまとめたい (ID:70539)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
とりあえず、文法定義時(definition(const Sparser& self))の引数 selfは「grammarの派生クラスである」というI/Fである以上、 本質的に結果に関する情報は、self(Sparser)を経由するのが正道だと思います。 例えば、上の例でname_buffer_が存在するのはそういう理由です。 そして、もしCScriptParserではなくname_buffer自体をSparserが持ってれば、 name_buffer_も不要になるわけですが、selfはconstなので結果を保持できません。 ※言語的には"mutable"を使えばこういうこと(「Sparserはずし」)は可能ですが…用法にはご注意を。 # "Immutable Object"や"mutable"などが良く分からない場合はまずそちらから。 class CScriptParser : public boost::spirit::classic::grammar<CScriptParser> { public: // parse_info boost::spirit::classic::parse_info<> parseInfo; // 構文解析時のトークン保存用 mutable std::string name_buffer; template<typename S> struct definition { typedef boost::spirit::classic::rule<S> rule_t; rule_t A; // 構文解析ルールの記述 definition(const CScriptParser& self) { A = boost::spirit::classic::alpha_p[boost::spirit::classic::assign_a(self.name_buffer)]; } const rule_t& start() const { return A; } }; explicit CScriptParser() { parseInfo = boost::spirit::classic::parse("a", *this, boost::spirit::classic::space_p); } };
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.