/* This program is a recursive descent parser. */ #include #include #include #include int token; void end_of_line(); int expression(); int term(); int factor(); int number(); int digit(); void error() { cerr << "parse error" << endl; exit(1); } void getToken() { scanf("%c", &token); //token = getchar(); } void match(char c) { if(token == c) getToken(); else error(); } void end_of_line() { int result = expression(); if(token == '\n') cout <<"The result is: " << result << endl; else error(); } int expression() { int result = term(); while (token == '+') { match('+'); result += term(); } return result; } int term() { int result = factor(); while(token == '*') { match('*'); result *= factor(); } return result; } int factor() { int result; if(token =='(') { match('('); result = expression(); match(')'); } else result = number(); return result; } int number() { int result = digit(); while(isdigit(token)) result = 10 * result+ digit(); return result; } int digit() { int result; if(isdigit(token)) { result = token - '0'; // convert to a number match(token); } else error(); return result; } void parse_it() { cout << "Input an arithmetic expression, use positive integers," << endl; cout << "zero, '(', ')', '+', and '*' " << endl; getToken(); end_of_line(); } main() { parse_it(); return 0; }