Мне нужно проанализировать 1-строчные выражения, содержащие пары ключ / значение и пары ключ / подвыражение, например:
123=a 456=b 789=(a b c) 111=((1=a 2=b 3=c) (1=x 2=y 3=z) (123=(x y z))) 666=evil
Чтобы упростить анализатор, я хочу выполнить синтаксический анализ в несколько этапов, разделив теги первого уровня (здесь 123, 456, 789, 111 и 666, а затем проанализировав их содержимое на другом этапе.
Здесь значение 789 будет "a b c"
, значение 111 будет (1=a 2=b 3=c) (1=x 2=y 3=z) (123=(x y z))
.
Но в этот момент меня обошли грамматики, чтобы я мог найти способ получить выражения между соответствующими скобками. Все, что я получаю за 111, это (1=a 2=b 3=c
, который заканчивается на первой закрывающей скобке.
Я нашел этот удобный пример и попытался использовать его, но безуспешно:
#include <map>
#include <string>
#include <boost/spirit/include/classic.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
namespace qi = boost::spirit::qi;
void main()
{
auto value = +qi::char_("a-zA-Z_0-9");
auto key = qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9");
qi::rule<std::string::iterator, std::pair<std::string, std::string>()> pair = key >> -('=' >> value);
qi::rule<std::string::iterator, std::map<std::string, std::string>()> query = pair >> *((qi::lit(';') | '&') >> pair);
std::string input("key1=value1;key2;key3=value3"); // input to parse
std::string::iterator begin = input.begin();
std::string::iterator end = input.end();
std::map<std::string, std::string> m; // map to receive results
bool result = qi::parse(begin, end, query, m); // returns true if successful
}
Как я могу это сделать?
Редактировать: Я нашел пример в http://boost -spirit.com / home / Articles / qi-example / parsing-a-list-of-key-value-pair-using -spirit-й /