двойной синтаксический анализатор boost spirit x3 с ограничениями

#c #parsing #boost-spirit #boost-spirit-x3

#c #синтаксический анализ #boost-spirit #boost-spirit-x3

Вопрос:

В настоящее время я анализирую удвоения, используя boost spirit x3 с помощью этого синтаксического анализатора:

boost::spirit::x3::real_parser<double, x3::strict_real_policies<double> > const strict_double = {};

но он также анализирует двойники, подобные .356 , и 356. я хотел бы избежать этого, и вместо этого пользователь пишет 0.356 and 356.0 . Как я могу применить такое ограничение к этому существующему синтаксическому анализатору? Есть ли способ без написания собственного двойного синтаксического анализатора с нуля?

Ответ №1:

Вы можете очень легко создать пользовательскую политику, которая делает то, что вы хотите:

 template <typename ValueType>
struct really_strict_real_policies : boost::spirit::x3::strict_real_policies<ValueType>
{
    static bool const allow_leading_dot = false;
    static bool const allow_trailing_dot = false;
};
  

Полный пример (работает на WandBox)

 #include <iostream>
#include <boost/spirit/home/x3.hpp>

template <typename ValueType>
struct really_strict_real_policies : boost::spirit::x3::strict_real_policies<ValueType>
{
    static bool const allow_leading_dot = false;
    static bool const allow_trailing_dot = false;
};

template <typename Parser>
void parse(const std::stringamp; input, const Parseramp; parser, bool expected)
{
    std::string::const_iterator iter=input.begin(), end=input.end();

    bool result = boost::spirit::x3::parse(iter,end,parser);

    if( (result amp;amp; (iter==end))==expected )
        std::cout << "Yay" << std::endl;
}

int main()
{
    boost::spirit::x3::real_parser<double, really_strict_real_policies<double> > const really_strict_double = {};

    parse(".2",really_strict_double,false);
    parse("2.",really_strict_double,false);
    parse("2.2",really_strict_double,true);
}
  

Комментарии:

1. большое вам спасибо, это даже больше, чем я ожидал, я думал, что смогу реализовать свой собственный двойной синтаксический анализатор