它很大程度上取決於您指定屬性的目標類型,以及(在較小程度上)空白策略是什麼,即語法是否使用船長。
現在,這裏就是我會寫:
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
template <typename V>
void test(const V& input)
{
typedef typename V::const_iterator It;
using namespace qi;
rule<It, bool(), space_type> preambule = +(!lit("KEYWORD") > omit[char_]) > attr(true) | attr(false);
rule<It, std::string(), space_type> word = +char_;
It first(input.begin()), last(input.end());
bool hasPreamble;
std::string furtherText;
bool ok = phrase_parse(first, last,
preambule > "KEYWORD" > raw[ *char_ ], space,
hasPreamble, furtherText);
if (ok)
std::cout << (hasPreamble?"T ":"") << "KEYWORD " << furtherText << std::endl;
if (first!=last)
std::cout << "hmmm: '" << std::string(first, last) << "'" << std::endl;
}
int main()
{
test(std::string("KEYWORD further text"));
test(std::string("one KEYWORD further text"));
test(std::string("one two KEYWORD further text"));
}
輸出繼電器:
KEYWORD further text
T KEYWORD further text
T KEYWORD further text
它失敗。怎麼樣?什麼? – sehe
謝謝,sehe。精神在我看來有點棘手。 –
是的,我知道你的意思。這對我來說是值得的,但如果你正在尋找更簡單的東西來獲得正確的(並且更快的編譯),我衷心推薦['CoCo/R C++'](http://ssw.jku.at/coco/# CPP),我在Spirit之前使用了我所有的解析需求。它具有能夠以多種語言(C#,Java,C++,C#,VB,Oberon,Ruby,Python,Oberon,Ada等)重用現有語法的顯着優勢。 – sehe