いくつかのオプションパーツを備えた単純なパーサーがあります。また、カスタム構造体を属性として使用すると、省略された値がゼロで初期化されることに気付きました。
struct face_triplet
{
int v, vt, vn;
};
BOOST_FUSION_ADAPT_STRUCT(
face_triplet,
(int, v)
(int, vt)
(int, vn)
)
void test( std::string_view line )
{
namespace x3 = boost::spirit::x3;
std::vector<face_triplet> f;
auto line_begin = line.begin();
if( x3::phrase_parse( line_begin, line.end(),
'f' >> +( x3::lexeme[ x3::int_ >> -( ( '/' >> -x3::int_ >> -( '/' >> x3::int_ ) ) ) ] ), x3::lit(' ')|'\t', f ) )
{
std::cout << "f ";
for( auto && v : f )
std::cout << v.v << '/' << v.vt << '/' << v.vn << ' ';
std::cout << '\n';
}
}
たとえば、解析f 1//100 2//200 3//300
するf
と次のようになります。1/0/100 2/0/200 3/0/300
この動作に依存できますか? それとも、将来のバージョンで壊れる可能性があるのは単なる偶然ですか?