Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同实例的输出错误_C++_Parsing - Fatal编程技术网

C++ 不同实例的输出错误

C++ 不同实例的输出错误,c++,parsing,C++,Parsing,我正在通过预定义的语法规则解决数学表达式。这是节目单。它适用于所有输入,当我在控制台窗口()中输入,然后后退一步并尝试插入(2+3)之类的表达式时。我发现“')”未找到错误。如果我键入“(”后跟表达式then'),结果是可以的。谁能告诉我这个错误是怎么来的吗。这是错误代码 (2) );这就是我键入的表达式。。 libc++abi.dylib:应以std::runtime_error:)类型的未捕获异常终止 #包括“std_lib_facilities.h” 类标记{//定义标记类 公众: 炭类;

我正在通过预定义的语法规则解决数学表达式。这是节目单。它适用于所有输入,当我在控制台窗口()中输入,然后后退一步并尝试插入(2+3)之类的表达式时。我发现“')”未找到错误。如果我键入“(”后跟表达式then'),结果是可以的。谁能告诉我这个错误是怎么来的吗。这是错误代码

(2) );这就是我键入的表达式。。 libc++abi.dylib:应以std::runtime_error:)类型的未捕获异常终止

#包括“std_lib_facilities.h”
类标记{//定义标记类
公众:
炭类;
双重价值;
令牌(char ch){//1
种类=ch;
数值=0;
}
令牌(char-ch,double-val){//构造函数2
种类=ch;
值=val;
}
};
令牌获取_令牌();//get_令牌函数的声明
双表达式();//表达式函数的声明
双项();//术语功能声明
双主();//主要功能声明
int main(){

您在什么操作系统上运行此操作?如果您“退出”,程序实际上可能正在读取“退出”作为退格字符(
'\x08'
),因此实际输入类似于
(2+3\x08)
好的,你的第一个问题是你有意大利面代码。不要在一堆不同的函数中使用cin。这使得在任何给定的时间都很难计算出输入流的状态。使用它一次就可以获得整个输入,然后将输入解析成一个令牌列表,然后将这些令牌组织到你的表达式中这样,您就不必阅读整个程序来猜测bug在哪里,而只需查看您的tokenize()中的令牌函数并查看它们是否正确。@DarkSquirtings这是其中之一。我不会对此发表评论,但让您得出自己的结论;-).Yesomite。我没有使用带有箭头键的“del”按钮移动到所需位置并替换为新数字。似乎我输入的方式不正确。我可能只应该使用“del”。否则结果并不像预期的那样。它仍然是意大利面代码。而且,“这是一个有3个bug的程序!猜猜它们在哪里!”可能不是启动程序的好模板。
#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 (';');
}