#include #include /////////////////////////////////////////////////////////////// namespace spirit { // This will be available in spirit V1.3 template struct grammar : public parser > { template match parse(IteratorT& first, IteratorT const& last) const { static typename DerivedT::definition def; return def.start().parse(first, last); } }; } using namespace spirit; using namespace std; /////////////////////////////////////////////////////////////////////////////// namespace { void doInt(char const* str, char const* end) { string s(str, end); cout << s << endl; } void doAdd(char const*, char const*) { cout << "ADD\n"; } void doSubt(char const*, char const*) { cout << "SUBT\n"; } void doMult(char const*, char const*) { cout << "MULT\n"; } void doDiv(char const*, char const*) { cout << "DIV\n"; } } /////////////////////////////////////////////////////////////// struct my_grammar : public grammar { template struct definition { rule expr, integer, group, expr1, expr2; definition() { integer = lexeme[ (!(ch_p('+') | '-') >> +digit)[&doInt] ]; group = '(' >> expr >> ')'; expr1 = integer | group; expr2 = expr1 >> *(('*' >> expr1)[&doMult] | ('/' >> expr1)[&doDiv]); expr = expr2 >> *(('+' >> expr2)[&doAdd] | ('-' >> expr2)[&doSubt]); } rule const& start() const { return expr; } }; }; int main() { cout << "/////////////////////////////////////////////////////////\n\n"; cout << "\t\tGrammar demonstration...\n\n"; cout << "/////////////////////////////////////////////////////////\n\n"; cout << "Type an expression...or [q or Q] to quit\n\n"; my_grammar g; while (true) { char str[256]; cin.getline(str, 256); if (str[0] == 'q' || str[0] == 'Q') break; if (parse(str, g, space).full) cout << "parsing succeeded\n"; else cout << "parsing failed\n"; } return 0; }