1
인용 부호가있는 경우 일부 입력을 long
또는 std::string
으로 구문 분석하고 싶습니다. 이에 대한 합리적인 해결책은 x3::variant<long, std::string>
을 사용하여 데이터를 저장하는 것입니다.부스트 스피릿 X3 : 데이터를 x3 :: variant로 추출하는 경우 <...>은 항상 비어 있습니다.
#include <iostream>
#include <string>
#include <boost/spirit/home/x3.hpp>
#include <boost/spirit/home/x3/support/ast/variant.hpp>
namespace x3 = boost::spirit::x3;
const x3::rule<class number_tag, long> number = "number";
const auto number_def = x3::long_;
BOOST_SPIRIT_DEFINE(number);
const x3::rule<class string_tag, std::string> string = "string";
const auto string_def = x3::lexeme['"' >> *(x3::char_ - '"') >> '"'];
BOOST_SPIRIT_DEFINE(string);
using any_type = x3::variant<long, std::string>;
const x3::rule<class any_tag, any_type> any = "any";
const auto any_def = number | string;
BOOST_SPIRIT_DEFINE(any);
int main()
{
const std::string src = "18";
any_type result;
auto iter = src.begin();
bool success = x3::phrase_parse(iter, src.end(), any, x3::space, result);
if (!success || iter != src.end())
return 1;
else
std::cout << "Result: " << result << std::endl;
}
내 예상 결과는 다음과 같습니다 : 다음은 샘플 프로그램입니다 그러나
Result: 18
은, 실제 결과는 단순히 : 내가 잘못 뭐하는 거지
Result:
? 부스트 버전은 1.61입니다.
재미있는 ...'연산자 <<'일반'부스트에 : : variant'그냥 작동합니다. –