Я столкнулся с чем-то странным при попытке разобрать простые строки в кавычках. Итак, я написал этот простой синтаксический анализатор, который успешно анализирует строки в кавычках, такие как "string"
или ""
.
#include <iostream>
#include "boost/spirit/include/qi.hpp"
namespace qi = boost::spirit::qi;
namespace iso8859 = boost::spirit::iso8859_1;
int main( int argc, char* argv[] )
{
using namespace qi;
std::string input = "\"\"";
std::string::const_iterator front = input.cbegin();
std::string::const_iterator end = input.cend();
bool parseSuccess = phrase_parse( front, end,
'\"' >> *~char_('\"') >> '\"',
iso8859::space );
if ( front != end )
{
std::string trail( front, end );
std::cout << "String parsing trail: " << trail << std::endl;
}
if ( !parseSuccess )
std::cout << "Error parsing input string" << std::endl;
std::cout << "Press enter to exit" << std::endl;
std::cin.get();
return 0;
}
Все это отлично работает, но когда я расширяю правила синтаксического анализа, чтобы также анализировать вещи до строки в кавычках, они внезапно ломаются.
Так, например, это успешно анализируется:
std::string input = "normalString 10.0 1.5 1.0 1.0 1.0 1.0"
С правилом разбора:
*char_ >> *double_
А теперь, если я комбинирую это правило с правилом строки в кавычках:
std::string input = "normalString 10.0 1.5 1.0 1.0 1.0 1.0 \"quotedString\""
С правилом разбора:
*char_ >> *double_ >> '\"' >> *~char_('\"') >> '\"'
Внезапно он больше не работает, и синтаксический анализ не выполняется. Понятия не имею почему. Кто-нибудь может это объяснить?
РЕДАКТИРОВАТЬ: на всякий случай я использую Boost 1.53