boost::spiritの使用方法を学習していますが、非常に単純なパーサーでもいくつかの問題に直面しています。コロンで区切られた数字のリスト (0 または 1 のみ) を受け入れるパーサーを構築しようとしています。リストには 3 桁または 4 桁を含めることができます。したがって、0:0:0
and1:0:1:0
は有効ですが、たとえば0:0
or0:0:0:0:0
は有効ではありません。
次のコードでは、オプションの演算子を使用して最初の桁が存在するかどうかを指定する方法を確認できます。ただし、機能しません (シーケンスの解析に失敗します0:0:0
)。コードに何か問題がありますか? それは正しいと思いますが、繰り返しになりますが、私はスピリットを学び始めたばかりです。
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
namespace phoenix = boost::phoenix;
void parse_tuple(const std::string& tuple) {
using qi::char_;
auto begin = tuple.begin();
auto end = tuple.end();
bool r = qi::parse(begin, end,
-(char_('0', '1') >> ':') >>
char_('0', '1') >> ':' >>
char_('0', '1') >> ':' >>
char_('0', '1')
);
if (!r || begin != end)
throw std::runtime_error("wrong format");
}
int main() {
parse_tuple("0:0:0"); // It fails for this one
parse_tuple("0:0:0:0");
try { parse_tuple("0:0"); } catch (...) {
std::cout << "expected error\n"; }
try { parse_tuple("0:0:0:0:0"); } catch (...) {
std::cout << "expected error\n"; }
}