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