ブースト::スピリットを習得しようとしていて、Cスタイルの識別子の簡単な例に取り掛かりたい。以下の文法は、 'incompatible_start_rule'と主張してコンパイルしません。目標は、この文法が、デフォルトの属性伝播ルールのように、文字列のベクトルの代わりに文字列を返すことです。ブーストスピリット文法のカスタム属性
template <typename IT>
struct cppIdentifier : qi::grammar<IT, std::string, space_type()>
{
cppIdentifier() : cppIdentifier::base_type(start)
{
start = char_("a-zA-Z_")[boost::phoenix::push_back(_val, _1)]
>> *(char_("a-zA-Z0-9_")[boost::phoenix::push_back(_val, _1)]);
}
qi::rule<IT, std::string, space_type> start;
};
これを達成するためには何が必要ですか?
また、私は、この特定の問題のための代替的で便利なオプションが多数存在することはよく知っていますが、私は学問的にカスタム文法の属性タイプを操作する方法に興味がありますので、答えの代わりにコメントに。事前に
おかげで、
[タグ:boost-spirit]の[SO]タグに追加されました。あなたの助けが大いにありがとう! – sehe
ありがとうございました!私はあなたの答えを含め、サイトから多くを学んだので、私が少しでも手助けができたら、私は試してみる。私は自分の答えを書くことからかなり学ぶことも知っています。 –
はい!それはうまくいく、ありがとう。明らかに、ルールと文法のテンプレートの引数を詳しく調べる必要があります。 –