掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
boost::spiritの文法内のセマンティックアクションを自作 (ID:70547)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
すいません、先の質問(spiritに関する)の続きとなってしまいます。 Banさんのソースでばっちり上手くいったのですが、また別に問題が出てきてしまいまして……。 そのソースでは、セマンティックアクションは定義済みのアクション(boost::spirit::classic::assign_a(name_buffer))が使われていまして、これはまったく問題ありません。 しかし、自分で関数を作り、それをアクションさせようとすると、どうしてもエラーが出てきてしまいます。 最終的にはCScriptParser内のname_bufferに解析したものを保存出来ればいいのですが、それを行うための関数はCScriptParser内のメンバ関数にしたいと思っています。 メンバ関数にしたい理由は、“外部に関数を書くのなら簡単に出来るが、その場合、今度はCScriptParser::name_bufferに保存するための操作が複雑化してしまう”からです。 なにかスマートな記述方法はないでしょうか。 よろしくお願いします。 ↓以下には、私が採用させて頂いたBanさんのソースをそのまま転載します↓ 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.