У меня проблема с разбором моего проекта. По крайней мере, я нашел минимальный пример кода, на котором появляется проблема. Итак, сейчас пытается разобрать строку
"логическая функция1; константная логическая функция2;"
Вот минимальный пример кода:
namespace qi = boost::spirit::qi;
using qi::lexeme;
using qi::string;
typedef boost::spirit::ascii::space_type TSkipper;
struct MyField
{
bool isConst;
std::string mtype;
std::string name;
};
BOOST_FUSION_ADAPT_STRUCT
(
MyField,
(bool, isConst)
(std::string, mtype)
(std::string, name)
)
void SpiritTestSimple()
{
qi::rule<std::string::const_iterator, std::string(), TSkipper> valid_symbols;
qi::rule<std::string::const_iterator, MyField(), TSkipper> field;
valid_symbols %= lexeme[*qi::char_("a-zA-Z")];
field %= qi::matches[string("const")] >> valid_symbols >> valid_symbols;
std::string data = "aaa aaaa; const bbb bbbb;";
//-----------------------------------------------------------------
std::string::const_iterator first = data.begin(), last = data.end();
std::list<MyField> parsed_vals;
bool is_parsed;
try
{
is_parsed = qi::phrase_parse( first, last,
+(field > ';'),
boost::spirit::ascii::space, parsed_vals);
}
catch(const qi::expectation_failure<std::string::const_iterator>& e)
{
std::string frag(e.first, e.last);
std::cout << e.what() << "'" << frag << "'" << std::endl;
}
BOOST_ASSERT(is_parsed && "the example not parsed");
}
Я написал
+(field > ';')
потому что в моем проекте этот блок может отсутствовать. И каждое объявление функции должно заканчиваться знаком ';'. Когда запускается приведенный выше пример кода, я вижу, что возникло исключение, и в консоли появилась запись:
boost::spirit::qi::expectation_failure''
Как я правильно понимаю - после последней точки с запятой синтаксический анализатор пытается проанализировать следующее правило поля, и он проанализировал "совпадения" (потому что он возвращает значение в любом случае), но следующий синтаксический анализ valid_symbols не удается, потому что после последней точки с запятой нет данных . Так что синтаксический анализ не работает.
Как избежать сбоя синтаксического анализа в моем случае?