主题:那位大哥棒棒我解释这个c 程序,急用...
#include "iostream"
#include "map"
#include "string"
#include "cctype"
using namespace std;
map<string, double> table;
int no_of_errors;
double number_value;
string string_value;
double error(const string& s) {
no_of_errors++;
cerr << "ERROR: " << s << endl;
return 1;
}
enum Token_value {
NAME, NUMBER, LINE_END, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')'
};
Token_value curr_tok = LINE_END;
double expr(bool);
Token_value get_token() {
char ch = 0;
do {
if (!cin.get(ch)) return curr_tok = END;
}while (ch != '\n' && isspace(ch));
switch(ch) {
case '\n': curr_tok=LINE_END; break;
case ';':
curr_tok=PRINT; break;
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
curr_tok = Token_value(ch); break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '.':
cin.putback(ch);
cin >> number_value;
curr_tok = NUMBER; break;
default:
if (isalpha(ch)) {
string_value = ch;
while (cin.get(ch) && isalnum(ch)) string_value.push_back(ch);
cin.putback(ch);
curr_tok = NAME;
break;
}
error("bad token");
curr_tok = PRINT; break;
}
return curr_tok;
}
double prim(bool get) {
if (get) get_token();
switch (curr_tok) {
case NUMBER: {
double v = number_value;
get_token();
return v;
}
case NAME: {
double& v = table[string_value];
if (get_token() == ASSIGN) v = expr(true);
return v;
}
case MINUS:
return -prim(true);
case LP: {
double e = expr(true);
if (curr_tok != RP) return error(") expected");
get_token();
return e;
}
default:
return error("primary expected");
}
}
double term(bool get)
{
double left = prim(get);
for (;;)
switch (curr_tok) {
case MUL:
left *= prim(true);
break;
case DIV:
if (double d = prim(true)) {
left /= d;
break;
}
return error("divide by 0");
default: return left;
}
}
double expr(bool get)
{
double left = term(get);
for (;;) {
switch (curr_tok) {
case PLUS:
left += term(true);
break;
case MINUS:
left -= term(true);
break;
default:
return left;
}
}
}
int main(int argc, char* argv[])
{
//符号表,可以事先定义一些常量
table["pi"] = 3.141592654;
table["e"] = 2.71828;
while(cin) {
get_token();
if (curr_tok == END) break;
if (curr_tok == LINE_END) continue;
double p= (expr(false));
if (curr_tok == PRINT)
cout << "The result is: " << p << endl;
}
return no_of_errors;
}
#include "map"
#include "string"
#include "cctype"
using namespace std;
map<string, double> table;
int no_of_errors;
double number_value;
string string_value;
double error(const string& s) {
no_of_errors++;
cerr << "ERROR: " << s << endl;
return 1;
}
enum Token_value {
NAME, NUMBER, LINE_END, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')'
};
Token_value curr_tok = LINE_END;
double expr(bool);
Token_value get_token() {
char ch = 0;
do {
if (!cin.get(ch)) return curr_tok = END;
}while (ch != '\n' && isspace(ch));
switch(ch) {
case '\n': curr_tok=LINE_END; break;
case ';':
curr_tok=PRINT; break;
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
curr_tok = Token_value(ch); break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '.':
cin.putback(ch);
cin >> number_value;
curr_tok = NUMBER; break;
default:
if (isalpha(ch)) {
string_value = ch;
while (cin.get(ch) && isalnum(ch)) string_value.push_back(ch);
cin.putback(ch);
curr_tok = NAME;
break;
}
error("bad token");
curr_tok = PRINT; break;
}
return curr_tok;
}
double prim(bool get) {
if (get) get_token();
switch (curr_tok) {
case NUMBER: {
double v = number_value;
get_token();
return v;
}
case NAME: {
double& v = table[string_value];
if (get_token() == ASSIGN) v = expr(true);
return v;
}
case MINUS:
return -prim(true);
case LP: {
double e = expr(true);
if (curr_tok != RP) return error(") expected");
get_token();
return e;
}
default:
return error("primary expected");
}
}
double term(bool get)
{
double left = prim(get);
for (;;)
switch (curr_tok) {
case MUL:
left *= prim(true);
break;
case DIV:
if (double d = prim(true)) {
left /= d;
break;
}
return error("divide by 0");
default: return left;
}
}
double expr(bool get)
{
double left = term(get);
for (;;) {
switch (curr_tok) {
case PLUS:
left += term(true);
break;
case MINUS:
left -= term(true);
break;
default:
return left;
}
}
}
int main(int argc, char* argv[])
{
//符号表,可以事先定义一些常量
table["pi"] = 3.141592654;
table["e"] = 2.71828;
while(cin) {
get_token();
if (curr_tok == END) break;
if (curr_tok == LINE_END) continue;
double p= (expr(false));
if (curr_tok == PRINT)
cout << "The result is: " << p << endl;
}
return no_of_errors;
}