我已經編寫了以下簡單語法來檢測服務器返回的字符串是否爲失敗登錄。我在phrase_parse
函數中使用它內聯,但由於代碼被定期調用,我想創建一個靜態語法實例。我使用的是這樣的:提升精神語法以檢測登錄失敗
bool loginFailed()
{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
// current data is an re2 stringpiece. so .data returns char*
const char* front = currentData.data();
const char* back = currentData.end();
return qi::phrase_parse(front, back, -qi::int_ >> (ascii::no_case[qi::lit("no")] | ascii::no_case[qi::lit("bad")]), qi::space);
}
哪個有效。但是,當我把它翻譯成以下內容時,語法似乎總是失敗。我想這樣做是我的cpp文件:
namespace {
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
struct FailedGrammar : qi::grammar<const char*>
{
FailedGrammar() :
FailedGrammar::base_type(m_start),
m_start()
{
m_start = -qi::int_ >> (ascii::no_case[qi::lit("no")] | ascii::no_case[qi::lit("bad")]);
}
qi::rule<const char*> m_start;
};
const FailedGrammar s_failedInstance;
}
,然後調用這樣的:
bool loginFailed()
{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
// current data is an re2 stringpiece. so .data returns char*
const char* front = currentData.data();
const char* back = currentData.end();
return qi::phrase_parse(front, back, s_failedInstance, qi::space);
}
我想認識的字符串是這樣的:
0002 NO FAILED LOGIN
其中的數字是可選的。我知道其他方法可以用re2來做到這一點,但是我正在尋找一種精神實現。
有沒有人有任何指針或潛在的原因失敗?
編輯: 我發現了很多與我的語法只是探討調試器的問題。首先,我意識到解析一個數字,如0002我應該寫*(qi::int_)
。另外,我擺脫了ascii::space
有利於ascii::blank
「我意識到解析一個數字,如技術我應該寫*(齊:: int_)」 - 如果數字是不可選的,要麼使用'齊:: uint_'或'+ qi :: digit'甚至'repeat(4)[digit]' – sehe
對空白有好的想法。我幾乎要提到它,但我對你的「語法」一無所知,並且不想使其複雜化 – sehe