挺怪的程序异常
挺怪的程序错误`
#include "stdafx.h "
#include <iostream>
#include <cstring>
#include <map>
#include <stdexcept>
using namespace std;
map <string, double> table;
enum Token_value{
NAME, NUMBER, END,
PLUS= '+ ', MINUS= '- ', MUL= '* ', DIV= '/ ',
PRINT= '; ',ASSIGN= '= ',LP= '( ',RP= ') ',
};
Token_value curr_tok=PRINT;
struct LineCount{
LineCount():line_(1){}
unsigned long current(){return line_;}
void new_line(){++line_;}
private:
unsigned long line_;
};
LineCount line_count;
int no_of_errors;
double error(const string &msg)
{
no_of_errors++;
cerr < < "error (line " < <line_count.current() < < "): " < <msg < < '\n ';
return 1;
}
double number_value;
string string_value;
Token_value get_token()
{
char ch;
do{ //跳过空白,除了'\n'
if (!cin.get(ch) ) return curr_tok=END;
}while(ch!= '\n '&& isspace(ch) );
switch(ch){
case '; ': line_count.new_line();
case '\n ':
return curr_tok=PRINT;
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;
return curr_tok=NUMBER;
default:
if(isalpha(ch)){
string_value=ch;
while(cin.get(ch) && isalnum(ch)) string_value.push_back(ch);
cin.putback(ch);
return curr_tok=NAME;
}
error( "bad token ");
return curr_tok=PRINT;
}
}
double expr(bool);
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:
#include "stdafx.h "
#include <iostream>
#include <cstring>
#include <map>
#include <stdexcept>
using namespace std;
map <string, double> table;
enum Token_value{
NAME, NUMBER, END,
PLUS= '+ ', MINUS= '- ', MUL= '* ', DIV= '/ ',
PRINT= '; ',ASSIGN= '= ',LP= '( ',RP= ') ',
};
Token_value curr_tok=PRINT;
struct LineCount{
LineCount():line_(1){}
unsigned long current(){return line_;}
void new_line(){++line_;}
private:
unsigned long line_;
};
LineCount line_count;
int no_of_errors;
double error(const string &msg)
{
no_of_errors++;
cerr < < "error (line " < <line_count.current() < < "): " < <msg < < '\n ';
return 1;
}
double number_value;
string string_value;
Token_value get_token()
{
char ch;
do{ //跳过空白,除了'\n'
if (!cin.get(ch) ) return curr_tok=END;
}while(ch!= '\n '&& isspace(ch) );
switch(ch){
case '; ': line_count.new_line();
case '\n ':
return curr_tok=PRINT;
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;
return curr_tok=NUMBER;
default:
if(isalpha(ch)){
string_value=ch;
while(cin.get(ch) && isalnum(ch)) string_value.push_back(ch);
cin.putback(ch);
return curr_tok=NAME;
}
error( "bad token ");
return curr_tok=PRINT;
}
}
double expr(bool);
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: