나는 부스트 스피릿을 사용하여 문법을 파싱하고 있으며 모든 복잡한 부분은 훌륭하게 작동합니다. 그러나, 나는 숫자 변수를 받아들이려고 노력하고있어, 제대로 파싱 할 수없는 것 같습니다. 문자열로 저장하는 것을 제외하고는 숫자로 아무것도하고 싶지는 않지만 일할 일반 숫자와 일치하는 문자열 파서를 얻을 수없는 것 같습니다. 여기boost spirit qi로 구문 분석 번호
문제 보여준다 코드 :
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main()
{
std::vector<std::string> testVec;
testVec.push_back("25.16");
testVec.push_back("2516");
std::string result;
std::string::const_iterator it, endIt;
for (unsigned int i = 0; i < testVec.size(); ++i)
{
it = testVec[i].begin();
endIt = testVec[i].end();
result.clear();
std::cout << "test" << i << "a: ";
bool r = qi::phrase_parse(
it,
endIt,
+qi::digit >> -(qi::string(".") >> +qi::digit),
qi::space,
result
);
if (!r || it != endIt)
{
std::cout << "failed" << std::endl;
}
else
{
std::cout << result << std::endl;
}
it = testVec[i].begin();
endIt = testVec[i].end();
result.clear();
std::cout << "test" << i << "b: ";
r = qi::phrase_parse(
it,
endIt,
+qi::digit >> (qi::string(".") >> +qi::digit),
qi::space,
result
);
if (!r || it != endIt)
{
std::cout << "failed" << std::endl;
}
else
{
std::cout << result << std::endl;
}
}
return 0;
}
을 그리고 출력은 다음과 같습니다
test0a: 25.
test0b: 25.16
test1a: 2516
test1b: failed
두 번째 방법은 예상대로 행동하지만, 단순히 소수 부분 옵션 변경을 배제하는 결과를 만들고있다 소수점 이하의 수치.
도움을 주시면 감사하겠습니다.
편집 :이 작업을 수행하려는 이유는 하나의 문법을 구문 분석하여 약간 다른 문법으로 변환하기 때문입니다. 분명히, 둘 다 숫자를 같게 처리하므로 번호가 무엇인지 상관하지 않습니다. 단지 그것이 잘 형성되어 있다는 것입니다.
축하드립니다. 모든 사람 만이 정확한 세부 사항을 제시하고 분명한 질문을하기 위해 노력할 것입니다. – Casey
또 다른 가능한 대안은'qi :: raw [qi :: double_]'(아마도'qi :: as_string [qi :: raw [qi :: double _]]') 일 수 있습니다. 이것은 double과 일치하고, 속성을 무시하고, double의 처음부터 끝까지 반복자 범위를 "반환"합니다. 이 범위는 문자열에 대해 (사용하는 것에 따라 암시 적으로 또는 명시 적으로) 변환됩니다. – llonesmiz
숫자를 문자열로 파싱하는 이유는 무엇입니까? qi :: raw [qi :: lexeme [+ qi :: digit >> - ('.'>> + qi :: digit)]]''lexeme'의 사용에주의하십시오 *** (!!!) *** 또는 실제로 @cv_and_he가 제안한'qi :: double_' 파서 (** [Live on Coliru] (http://coliru.stacked-crooked.com/a/3d173afd62f2ad74)를 참조하십시오.) **) – sehe