Как сделать простое правило с помощью boost::spirit c++?

187
12 июля 2018, 02:10

Мне нужно, чтобы слова подходящие к правилу выводились на экран. Правило - слова в которых есть 6 больших букв подряд(например: АНДРЕЙ, АНДРИАНА, АБВГДЕЖзыий). Я пробовал переделать чужой код, но не сильно получилось.

#include <iostream>
#include <string>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
template <typename Iterator>
struct calculator_simple : qi::grammar<Iterator>{
    calculator_simple() : calculator_simple::base_type(expression){
        expression = term >> term >> term >> term >> term >> term;
        term       = expression|'Q'|'W'|'E'|'R'|'T'|'Y'|'U'|'I'|'O'|'P'|'A'|'S'|'D'|'F'|'G'|'H'|'J'|'K'|'L'|'Z'|'X'|'C'|'V'|'B'|'N'|'M';}
    qi::rule<Iterator> expression, term;
};

int main(){
    std::cout << "Welcome to the expression parser!\n\n";
    std::cout << "Type an expression or [0] to quit\n\n";
    typedef std::string     str_t;
    typedef str_t::iterator str_t_it;
    str_t expression;
    calculator_simple<str_t_it> calc;
    while(true){
        std::getline(std::cin, expression);
        if(expression == "0") break;
        str_t_it begin = expression.begin(), end = expression.end();
        bool success = qi::parse(begin, end, calc);
        std::cout << "---------------------\n";
        if(success && begin == end)
                std::cout << "Parsing succeeded\n";
        else
                std::cout << "Parsing failed\nstopped at: \""
                          << str_t(begin, end) << "\"\n";
        std::cout << "---------------------\n";
    }
}

Оригинал программы которую я переделывал:

#include <iostream>
#include <string>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
template <typename Iterator>
struct calculator_simple : qi::grammar<Iterator>{
    calculator_simple() : calculator_simple::base_type(expression){
        expression = term   >> *( '+' >> term   | '-' >> term );
        term       = factor >> *( '*' >> factor | '/' >> factor );
        factor     = 
            qi::uint_
            |  '(' >> expression >> ')'
            | '+' >> factor
            | '-' >> factor;
    }
    qi::rule<Iterator> expression, term, factor;
};

int main(){
    std::cout << "Welcome to the expression parser!\n\n";
    std::cout << "Type an expression or [q or Q] to quit\n\n";
    typedef std::string     str_t;
    typedef str_t::iterator str_t_it;
    str_t expression;
    calculator_simple<str_t_it> calc;
    while(true){
        std::getline(std::cin, expression);
        if(expression == "q" || expression == "Q") break;
        str_t_it begin = expression.begin(), end = expression.end();
        bool success = qi::parse(begin, end, calc);
        std::cout << "---------------------\n";
        if(success && begin == end)
                std::cout << "Parsing succeeded\n";
        else
                std::cout << "Parsing failed\nstopped at: \""
                          << str_t(begin, end) << "\"\n";
        std::cout << "---------------------\n";
    }
}
READ ALSO
При проверке clang-ом выдает ошибку [закрыт]

При проверке clang-ом выдает ошибку [закрыт]

Если включить вcpp файл QtWidgets, то при проверке синтаксе clang (clang_complete, vim) отметиться ошибка, при переходе по которой мы поподем в файл qglobal

179
Изъятие значения QspinBox из сигнала

Изъятие значения QspinBox из сигнала

Накануне делаю простенькое приложение, а именно график на кривые ЛиссажуПочти все сделал, но остаётся маленькая загвоздка

213
Синхронизация двух потоков

Синхронизация двух потоков

Здравствуйте возник вопрос в синхронизации отдельной части приложения, вот пример:

202