Boost::spirit

Тема в разделе "Общие вопросы по С и С++", создана пользователем xfree86, 3 авг 2007.

Статус темы:
Закрыта.
  1. xfree86

    xfree86 Гость

    Добрый день!

    Помогите написать грамматику для boost::spirit
    Я не силен в этом, а надо решить задачу побыстрее

    Разбираем строку
    строка может быть или выражением состоящим из положительных целых чисел и операций +-*/ приоритет одинаковый
    т.е. 5+2*2=14, а не 9
    либо комментарий
    выражение начинается со знака =, комментарий — со знака %
    в результате для выражения мы должны получить результат, для комментария — текст без знака %

    взял за основу пример калькулятора стандартный, но что-то запутался...

    поправьте

    Код (Text):
    #include <boost/spirit/core.hpp>
    #include <boost/spirit/attribute.hpp>
    #include <iostream>
    #include <string>

    ////////////////////////////////////////////////////////////////////////////
    using namespace std;
    using namespace boost::spirit;
    using namespace phoenix;


    struct calc_closure : boost::spirit::closure<calc_closure, double>
    {
    member1 val;
    };

    struct calculator : public grammar<calculator, calc_closure::context_t>
    {
    template <typename ScannerT>
    struct definition
    {
    definition(calculator const& self)
    {
    top = expression[self.val = arg1];

    expression
    =  term[expression.val = arg1]
    >> *(  ('+' >> term[expression.val += arg1])
    |  ('-' >> term[expression.val -= arg1])
    |  ('*' >> term[expression.val *= arg1])
    |  ('/' >> term[expression.val /= arg1])
    )
    ;

    term
    =  factor[term.val = arg1]
    >> *(  ('A' >> factor[term.val *= arg1])
    |  ('B' >> factor[term.val /= arg1])
    )
    ;

    factor
    =  ureal_p[factor.val = arg1]
    |   anychar_p
    |  ('=' >> factor[factor.val = arg1])
    |   ('%' >> factor[factor.val = arg1])
    ;
    }

    typedef rule<ScannerT, calc_closure::context_t> rule_t;
    rule_t expression, term, factor, text;
    rule<ScannerT> top;

    rule<ScannerT> const&
    start() const { return top; }
    };
    };

    int main()
    {
    cout << "/////////////////////////////////////////////////////////\n\n";
    cout << "\t\tExpression parser using Phoenix...\n\n";
    cout << "/////////////////////////////////////////////////////////\n\n";
    cout << "Type an expression...or [q or Q] to quit\n\n";

    calculator calc;    // Our parser

    string str;
    while (getline(cin, str))
    {
    if (str.empty() || str[0] == 'q' || str[0] == 'Q')
    break;

    double n = 0;
    parse_info<> info = parse(str.c_str(), calc[var(n) = arg1], space_p);

    if (info.full)
    {
    cout << "-------------------------\n";
    cout << "Parsing succeeded\n";
    cout << "result = " << n << endl;
    cout << "-------------------------\n";
    }
    else
    {
    cout << "-------------------------\n";
    cout << "Parsing failed\n";
    cout << "stopped at: \": " << info.stop << "\"\n";
    cout << "-------------------------\n";
    }
    }

    cout << "Bye... :-) \n\n";
    return 0;
    }
    понятное дело, что нужно копать в грамматике

    Код (Text):
    term
    =  factor[term.val = arg1]
    >> *(  ('A' >> factor[term.val *= arg1])
    |  ('B' >> factor[term.val /= arg1])
    )
    это пока ни к чему
    про это можно забыть и откинуть
     
Загрузка...
Похожие Темы - Boost spirit
  1. DarkKnight
    Ответов:
    0
    Просмотров:
    2.202
  2. tumanovalex
    Ответов:
    1
    Просмотров:
    840
  3. sasha465
    Ответов:
    1
    Просмотров:
    1.783
Статус темы:
Закрыта.

Поделиться этой страницей