2012-07-19 14 views
5

Witam wszystkich, którzy jestem nowy, aby wzmocnić i zwiększyć :: ducha, więc przepraszam za pytanie noob.Wzmocnienie :: Duch wynik frazy_parse

Kiedy używam funkcji qi::phrase_parse, funkcja zwraca tylko zmienną bool, która wskazuje, czy parsowanie się powiodło, czy nie, ale nie wiem, gdzie mogę znaleźć wynik parsowania ... jakieś drzewo składniowe itp.

Jeśli używam makra #define BOOST_SPIRIT_DEBUG Reprezentacja XML drzewa jest drukowana na standardowym wyjściu, ale te węzły muszą być gdzieś przechowywane. Czy możesz mi pomóc?

+1

bez próbki kodu jest to raczej trudne do odpowiedzi na pytanie – sehe

+0

Nie sądzę, każdy duch jest pytanie pytanie noobowe. – Spacemoose

Odpowiedz

8

Możesz "powiązać" odniesienia atrybutów. qi::parse, qi::phrase_parse (i powiązane) akceptuj argumenty variadic, które będą używane do odbierania odsłoniętych atrybutów.

Uproszczony przykład stanowi: (EDIT zawierał utree przykład zbyt)

#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'; 

} 

Wyjścia:

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

Kilka przykładów analizatorów z 'AST' jak struktury danych:

Jeśli chcesz mieć bardzo ogólną strukturę AST, spojrzeć na utree: http://www.boost.org/doc/libs/1_50_0/libs/spirit/doc/html/spirit/support/utree.html

+1

Dodano linki do parserów próbek z odpowiednimi AST. ** EDYTUJ ** zawiera również przykładowy plik – sehe

Powiązane problemy