あなたは「サブルール」(SpiritV1 / classicが持っていたもの)を探していると思います。これらは現在廃止されています。
見て
c++11auto
およびBOOST_AUTO
auto subexpression = int_ >> ',' >> double_;
qi::rule<It> rule = "A:" >> subexpression >> "Rest:" >> (subexpression % eol);
auto
以前はSpiritルール(特にMSVC)の使用に問題がありました( 2秒で0から60 MPHを参照してください!およびコメント)が、これは(すぐに)問題ではなくなったと通知されました:
Yep. Anyway,FYI, it's fixed in Spirit-3. You can
use auto all you want.
Regards,
--
Joel de Guzman
qi :: lazy
- 継承された引数-MiniXMLで導入-ASTsチュートリアル
これは、共通のサブルールをさまざまな「複合」ルールに渡して、でラップできるようにする概念()
実証[]
です{}
。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
typedef std::string::const_iterator It;
template <typename R>
void test(const std::string& input, R const& rule)
{
It f(input.begin()), l(input.end());
bool ok = qi::phrase_parse(f,l,rule,qi::space);
std::cout << "'" << input << "'\tparse " << (ok?"success":"failure") << "\n";
}
int main()
{
typedef qi::rule<It, qi::space_type> common_rule;
typedef qi::rule<It, void(common_rule), qi::space_type> compound_rule;
common_rule common = qi::int_;
compound_rule
in_parens = qi::lit('(') >> qi::_r1 >> ')',
in_brackets = qi::lit('[') >> qi::_r1 >> ']',
in_braces = qi::lit('{') >> qi::_r1 >> '}';
test("{ 231 }" , in_braces (phx::ref(common )) );
test("{ hello }", in_braces (phx::val("hello")) );
test("( 231 )" , in_parens (phx::ref(common )) );
test("( hello )", in_parens (phx::val("hello")) );
test("[ 231 ]" , in_brackets(phx::ref(common )) );
test("[ hello ]", in_brackets(phx::val("hello")) );
}
出力:
'{ 231 }' parse success
'{ hello }' parse success
'( 231 )' parse success
'( hello )' parse success
'[ 231 ]' parse success
'[ hello ]' parse success
PS。上記は典型的なスピリット文法ではないことに注意してください。'common'ルールが異なる属性を公開する場合、この方法はあまりうまく機能しません。