我通过预定义的语法规则解决数学表达式。这是程序。它适用于所有输入,当我进入控制台窗口()然后退后一步并尝试插入像(2 + 3)这样的表达式时。我正在')'找不到错误。如果我输入'('后跟表达式然后')',结果就可以了。谁能告诉我这个错误是怎么来的。这是错误代码
(2);这就是我输入的表达式.. libc ++ abi.dylib:以std :: runtime_error类型的未捕获异常终止:)IS EXPECTED
#include "std_lib_facilities.h"
class Token { // Defining the Token class
public:
char kind;
double value;
Token (char ch){ // Constructor 1
kind = ch;
value = 0;
}
Token (char ch, double val){// Constructor 2
kind = ch;
value = val;
}
};
Token get_token (); // declaration of get_token function
double expression (); // declaration of expression function
double term (); // declaration of term function
double primary (); // declaration of primary function
int main (){
cout << "> ";
double t = expression ();
cout << " = " << t ;
return 0;
}
double expression (){ // expression function definition
double left = term(); // term can be an expression ist rule in expression
//cout << "The left value in expression is " << left;
Token t = get_token();
while (t.kind != ';' && t.kind != ')') { // expression can be terminated by either ';' or ')'(sub expression)
switch (t.kind){
case '+':
left += term();// expression + term rule no 2
t = get_token();
break;
case '-':
left -= term(); // expression - term rule no 3
t = get_token();
break;
default:;
}
}
if (t.kind == ')')
cin.putback (t.kind);
return left;
}
double term (){ // term function definition
double left = primary(); // primary can be a term, first rule of term
Token t = get_token();
while (t.kind != ';' && t.kind != '+' && t.kind != '-' && t.kind != ')'){
switch (t.kind){
case '*' :
left *= primary();
t = get_token();
break;
case '/' :{
double d = primary();
if (d == 0) error ("divide by zero");
left /= d;
t = get_token();
break;
}
default:
break;
}
}
if (t.kind == ';' || t.kind == '+' || t.kind == '-' || t.kind == ')')
cin.putback(t.kind);
return left;
}
double primary () {
double d;
Token t = get_token();
//cout << "The token value is " << t.value << " token operator is" << t.kind;
switch (t.kind){
case '(' :{
d = expression();
t = get_token();
if (t.kind != ')') error (") IS EXPECTED");
break;
}
case '8' :
d = t.value;
break;
}
return d;
}
Token get_token (){
char ch;
//cout << "Enter the expression in get_token: ";
cin >> ch;
switch (ch){
case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
return Token(ch);
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{ // Any variable defined in switch should be in a block
cin.putback(ch);
double val;
cin >> val;
return Token('8',val);
break;
}
default :;
}
return Token (';');
}