不同实例的输出错误

时间:2015-09-21 13:14:19

标签: c++ parsing

我通过预定义的语法规则解决数学表达式。这是程序。它适用于所有输入,当我进入控制台窗口()然后退后一步并尝试插入像(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 (';');
}

0 个答案:

没有答案