我有很多具有共同的前綴和後綴規則:分解出精神的公用部分規則
rule = begin_stuff >> some >> other >> stuff >> end_stuff.
(其中begin_stuff
和end_stuff
從文字組成)
我希望能夠到說
rule = wrapped(some >> other >> stuff);
我試過的東西沿着
線但我所得到的大部分是來自Qi的編譯時間斷言。
我該如何以這種方式重構Spirit規則?
我有很多具有共同的前綴和後綴規則:分解出精神的公用部分規則
rule = begin_stuff >> some >> other >> stuff >> end_stuff.
(其中begin_stuff
和end_stuff
從文字組成)
我希望能夠到說
rule = wrapped(some >> other >> stuff);
我試過的東西沿着
線但我所得到的大部分是來自Qi的編譯時間斷言。
我該如何以這種方式重構Spirit規則?
我認爲你需要使用Spirit Repository的Qi Confix Parser Derective。這正是你需要的。
我認爲你正在尋找'subrules'(即Spirit V1/classic曾經有過)。現在已經過時了。
看一看
C++ 11 auto
和BOOST_AUTO
auto subexpression = int_ >> ',' >> double_;
qi::rule<It> rule = "A:" >> subexpression >> "Rest:" >> (subexpression % eol);
過去有問題與精神的規則使用auto
(尤其是與MSVC)(見Zero to 60 MPH in 2 seconds!和評論)但我已被告知(很快)is no longer an issue:
Yep. Anyway,FYI, it's fixed in Spirit-3. You can use auto all you want. Regards, -- Joel de Guzman
這裏介紹的是概念的證明通過一個共同的子規則不同的「化合物」的規則,以允許在()
包裝, []
或{}
:
#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。注意以上是不是典型的Spirit語法。當「通用」規則會暴露不同的屬性時,這種方式並不會奏效。
謝謝你能回答。你能完成它嗎?最後一個字「也」告訴我,你有更多的話要說... – Arkadiy
@Arkadiy我不記得任何具體的我要說。除了我可能添加的關於「自動」的事情。乾杯 – sehe
問題:我們如何從val(「hello」)到common_rule? – Arkadiy