Boost::Spirit результат фразы_parse

Привет всем, я новичок в бусте и бусте:: дух, поэтому прошу прощения за нубский вопрос.

Когда я использую qi::phrase_parsefunction, функция возвращает только логическую переменную, которая указывает, был ли синтаксический анализ успешным или нет, но я не знаю, где я могу найти результат синтаксического анализа... какое-то синтаксическое дерево и т. д.

Если я использую макрос #define BOOST_SPIRIT_DEBUG, XML-представление дерева выводится на стандартный вывод, но эти узлы должны где-то храниться. Не могли бы вы мне помочь?


person Michal    schedule 19.07.2012    source источник
comment
Без примера кода довольно сложно ответить на ваш вопрос   -  person sehe    schedule 19.07.2012
comment
Я не думаю, что любой духовный вопрос — это нубский вопрос.   -  person Spacemoose    schedule 28.06.2015


Ответы (1)


Вы можете «связать» ссылки на атрибуты. qi::parse, qi::phrase_parse (и связанные с ними) принимают переменные аргументы, которые будут использоваться для получения открытых атрибутов.

Упрощенный пример: (в EDIT также включен пример utree)

#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_utree.hpp>

namespace qi = boost::spirit::qi;

int main()
{
    using namespace qi;

    std::string input("1 2 3 4 5");
    std::string::const_iterator F(input.begin()), f(F), l(input.end());

    std::vector<int> ints;
    if (qi::phrase_parse(f = F, l, *qi::int_, qi::space, ints))
        std::cout << ints.size() << " ints parsed\n";

    int i;
    std::string s;
    // it is variadic:
    if (qi::parse(f = F, l, "1 2 " >> qi::int_ >> +qi::char_, i, s))
        std::cout << "i: " << i << ", s: " << s << '\n';

    std::pair<int, std::string> data;
    // any compatible sequence can be used:
    if (qi::parse(f = F, l, "1 2 " >> qi::int_ >> +qi::char_, data))
        std::cout << "first: " << data.first << ", second: " << data.second << '\n';

    // using utree:
    boost::spirit::utree tree;
    if (qi::parse(f = F, l, "1 2 " >> qi::int_ >> qi::as_string [ +qi::char_ ], tree))
        std::cout << "tree: " << tree << '\n';

}

Выходы:

5 ints parsed
i: 3, s:  4 5
first: 3, second:  4 5
tree: ( 3 " 4 5" )

Несколько примеров парсеров со структурами данных, подобными AST:

Если вы хотите иметь очень общую структуру AST, посмотрите utree: http://www.boost.org/doc/libs/1_50_0/libs/spirit/doc/html/spirit/support/utree.html

person sehe    schedule 19.07.2012
comment
Добавлены ссылки на образцы парсеров с правильными AST. EDIT также включил пример utree - person sehe; 19.07.2012