X
Добрый день!
Помогите написать грамматику для boost::spirit
Я не силен в этом, а надо решить задачу побыстрее
Разбираем строку
строка может быть или выражением состоящим из положительных целых чисел и операций +-*/ приоритет одинаковый
т.е. 5+2*2=14, а не 9
либо комментарий
выражение начинается со знака =, комментарий — со знака %
в результате для выражения мы должны получить результат, для комментария — текст без знака %
взял за основу пример калькулятора стандартный, но что-то запутался...
поправьте
понятное дело, что нужно копать в грамматике
это пока ни к чему
про это можно забыть и откинуть
Помогите написать грамматику для boost::spirit
Я не силен в этом, а надо решить задачу побыстрее
Разбираем строку
строка может быть или выражением состоящим из положительных целых чисел и операций +-*/ приоритет одинаковый
т.е. 5+2*2=14, а не 9
либо комментарий
выражение начинается со знака =, комментарий — со знака %
в результате для выражения мы должны получить результат, для комментария — текст без знака %
взял за основу пример калькулятора стандартный, но что-то запутался...
поправьте
Код:
#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;
}
Код:
term
= factor[term.val = arg1]
>> *( ('A' >> factor[term.val *= arg1])
| ('B' >> factor[term.val /= arg1])
)
про это можно забыть и откинуть