rudvil
05.02.2010, 19:41
Вот часть кодаvoid print_num (double num) {
std::cout << "(" << num << ")";
}
template <typename Iterator>
struct grammar : qi::grammar<Iterator, ascii::space_type> {
grammar() : grammar::base_type(expression) {
using qi::double_;
using qi::alpha;
using qi::alnum;
identifier = -('_' >> +alnum) >> alpha >> *alnum;
expression = term >> *(('+' >> term) | ('-' >> term));
term = factor >> *(('*' >> factor) | ('/' >> factor) | ('%' >> factor));
factor = identifier | double_[&print_num] | '(' >> expression >> ')' | ('-' >> factor) | ('+' >> factor);
}
qi::rule<Iterator, ascii::space_type>
identifier,
expression,
term,
factor,
program;
};
с получением значения из "double_" проблем нет - там все понятно, т.к. в spirit все уже сделано за тебя...
Собственно вопрос, как можно получить содержимое переменной "identifier"?
Т.е. чтобы было примерно так void print_str (std::string str) {
std::cout << "(" << str << ")";
}
void print_num (double num) {
std::cout << "(" << num << ")";
}
template <typename Iterator>
struct grammar : qi::grammar<Iterator, ascii::space_type> {
grammar() : grammar::base_type(expression) {
using qi::double_;
using qi::alpha;
using qi::alnum;
identifier = -('_' >> +alnum) >> alpha >> *alnum;
expression = term >> *(('+' >> term) | ('-' >> term));
term = factor >> *(('*' >> factor) | ('/' >> factor) | ('%' >> factor));
factor = identifier[&print_str] | double_[&print_num] | '(' >> expression >> ')' | ('-' >> factor) | ('+' >> factor);
}
qi::rule<Iterator, ascii::space_type>
identifier,
expression,
term,
factor,
program;
};
и соотвественно будет выведено содержимое identifier'a.
В доках про мой случай много чего написано о Phoenix и Bind, но я в эти вещи ещё не "въехал" =/
std::cout << "(" << num << ")";
}
template <typename Iterator>
struct grammar : qi::grammar<Iterator, ascii::space_type> {
grammar() : grammar::base_type(expression) {
using qi::double_;
using qi::alpha;
using qi::alnum;
identifier = -('_' >> +alnum) >> alpha >> *alnum;
expression = term >> *(('+' >> term) | ('-' >> term));
term = factor >> *(('*' >> factor) | ('/' >> factor) | ('%' >> factor));
factor = identifier | double_[&print_num] | '(' >> expression >> ')' | ('-' >> factor) | ('+' >> factor);
}
qi::rule<Iterator, ascii::space_type>
identifier,
expression,
term,
factor,
program;
};
с получением значения из "double_" проблем нет - там все понятно, т.к. в spirit все уже сделано за тебя...
Собственно вопрос, как можно получить содержимое переменной "identifier"?
Т.е. чтобы было примерно так void print_str (std::string str) {
std::cout << "(" << str << ")";
}
void print_num (double num) {
std::cout << "(" << num << ")";
}
template <typename Iterator>
struct grammar : qi::grammar<Iterator, ascii::space_type> {
grammar() : grammar::base_type(expression) {
using qi::double_;
using qi::alpha;
using qi::alnum;
identifier = -('_' >> +alnum) >> alpha >> *alnum;
expression = term >> *(('+' >> term) | ('-' >> term));
term = factor >> *(('*' >> factor) | ('/' >> factor) | ('%' >> factor));
factor = identifier[&print_str] | double_[&print_num] | '(' >> expression >> ')' | ('-' >> factor) | ('+' >> factor);
}
qi::rule<Iterator, ascii::space_type>
identifier,
expression,
term,
factor,
program;
};
и соотвественно будет выведено содержимое identifier'a.
В доках про мой случай много чего написано о Phoenix и Bind, но я в эти вещи ещё не "въехал" =/