#include #include #include using namespace std; const int ZERO = 0, LPAREN = 1, RPAREN = 2, COMMA = 3, EOI = 4; class Scanner { public: Scanner() {}; void scan(string & input) { if(0 == input.size()) { cerr << "Empty input!\n"; exit(1); } for(unsigned int i = 0; i < input.size(); ++i) { switch(input[i]) { case '(': _tokens.push_back(LPAREN); break; case ')': _tokens.push_back(RPAREN); break; case '0': _tokens.push_back(ZERO); break; case ',': _tokens.push_back(COMMA); break; case ' ': case '\t': break; default: cerr << "Bad character (" << static_cast(input[i]) << ")\n"; exit(1); }; } _tokens.push_back(EOI); }; void next_token() { _tokens.pop_front(); } int token() { return * (_tokens.begin()); } void printout() { for(list::iterator it = _tokens.begin(); it != _tokens.end(); ++it) { cout << ' '; if(*it == 0) cout << "ZERO"; else if(*it == 1) cout << "LPAREN"; else if(*it == 2) cout << "RPAREN"; else if(*it == 3) cout << "COMMA"; else if(*it == 4) cout << "EOF"; else cout << "CRAP"; } cout << '\n'; } private: list _tokens; }; Scanner scanner; int A(int); int B(int); int C(int); int main() { unsigned int max_depth; string buffer; cout << "Enter input: "; getline(cin, buffer); scanner.scan(buffer); max_depth = A(0); if(EOI != scanner.token()) { cerr << "Expected no more input\n"; cerr << scanner.token(); } else { cout << "Your input is valid! Max depth: " << max_depth << '\n'; } return 0; } int A(int md) { if(LPAREN == scanner.token()) { scanner.next_token(); md = B(md + 1); if(RPAREN == scanner.token()) { scanner.next_token(); return md; } else { cerr << "Error: A expects ')'\n"; exit(1); } } else if(ZERO == scanner.token()) { scanner.next_token(); return md; } else { cerr << "Error: A expects '(' or '0'\n"; exit(1); } } int B(int md) { int da, dc; da = A(md); dc = C(md); if(da > dc) { return da; } else { return dc; } } int C(int md) { if(COMMA == scanner.token()) { int da, dc; scanner.next_token(); da = A(md); dc = C(md); if(da > dc) { return da; } else { return dc; } } return md; }