Boost::spirit

  • Автор темы xfree86
  • Дата начала
Статус
Закрыто для дальнейших ответов.
X

xfree86

#1
Добрый день!

Помогите написать грамматику для 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])
)
это пока ни к чему
про это можно забыть и откинуть
 
Статус
Закрыто для дальнейших ответов.