당신은 당신의 주장이 너무 EOL을 생략하는 경우 (그래서 qi::space
를 사용하지 않는 eol
가 작동하지 않습니다
line = label >> -(token % ',') >> eol;
참고로 빈리스트를 받아 들일 수 있어야하지만, 예를 들어 qi::blank
이 목적을 위해)
또한, token
의 정의에 따라 당신은 어쩌면
뿐만 아니라 "빈"토큰을 받아 변경해야 주석에 대한 응답으로 691,363,210
: 완전 작업 샘플
Live On Coliru
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main()
{
using namespace qi;
using It = std::string::const_iterator;
using Token = std::string;
using Tokens = std::vector<Token>;
rule<It, blank_type> label
= lexeme[+~char_(":")] >> ':'
;
rule<It, Token(), blank_type> token
= lexeme[*~char_(",\n")];
;
rule<It, Tokens(), blank_type> line
= label >> -(token % ',') >> eol
;
for (std::string const input : {
"my first label: 123, 234, 345 with spaces\n",
"1:\n",
"2: \n",
"3: ,,,\n",
"4: , \t ,,\n",
"5: , \t , something something,\n",
})
{
std::cout << std::string(40, '=') << "\nparsing: '" << input << "'\n";
Tokens parsed;
auto f = input.begin(), l = input.end();
bool ok = phrase_parse(f, l, line, blank, parsed);
if (ok)
{
std::cout << "Tokens parsed successfully, number parsed: " << parsed.size() << "\n";
for (auto token : parsed)
std::cout << "token value '" << token << "'\n";
}
else
std::cout << "Parse failed\n";
if (f != l)
std::cout << "Remaining input: '" << std::string(f, l) << "'\n";
}
}
출력 :
========================================
parsing: 'my first label: 123, 234, 345 with spaces
'
Tokens parsed successfully, number parsed: 3
token value '123'
token value '234'
token value '345 with spaces'
========================================
parsing: '1:
'
Tokens parsed successfully, number parsed: 1
token value ''
========================================
parsing: '2:
'
Tokens parsed successfully, number parsed: 1
token value ''
========================================
parsing: '3: ,,,
'
Tokens parsed successfully, number parsed: 4
token value ''
token value ''
token value ''
token value ''
========================================
parsing: '4: , ,,
'
Tokens parsed successfully, number parsed: 4
token value ''
token value ''
token value ''
token value ''
========================================
parsing: '5: , , something something,
'
Tokens parsed successfully, number parsed: 4
token value ''
token value ''
token value 'something something'
token value ''
내가 대신 ANTLR을 사용하는 것이 좋습니다. 나는 이것이 당신이 원했던 대답이 아니라는 것을 알고 있습니다. 그래서 저는 그것을 코멘트로 올리고 있습니다. ANTLR은 장기간 사용하기가 훨씬 쉬우 며 도구 지원이 뛰어나고 배울 수있는 참조가 많습니다. –
@JohnZwinck 우리는 당신이 지금 Spirit을 좋아하지 않는다는 것을 알게됩니다. 그것에 대해 (그리고 일반적으로 C++에 대해)별로 마음에 들지 않습니다. 괜찮아. 그러나 여기에 ANTLR을 사용하라는 제안은 질문 밖에서 어떤 문맥도없이 약간 우스꽝 스럽다. 파리를 날치기 위해 캐논을 가져 오는 것 같아요. – sehe
러시아어 문법에 대한 질문을하는 사람에게 영어로 바꿔야한다고 말하는 것과 같습니다. – Spacemoose