C++实现计算器按X/x退出报primary expected错误,该如何解决?
问题根源
- 主函数的退出逻辑仅判断了小写
'x'作为退出标记,没有匹配Token_stream::get()中返回的大写'X'类型Token。输入大写X时,该Token不会触发break逻辑,会被放回缓冲区,后续调用expression()解析时,primary()函数无法识别'X'类型,就抛出了“primary expected”错误。 - 若在表达式解析过程中读取到x/X,也会因为解析逻辑无对应处理分支触发同类报错,你描述的主动按下x/X退出的场景中,第一个问题是核心诱因。
修复方案
1. 修复退出判断逻辑
将main函数中对应的退出判断代码修改为同时匹配大小写即可解决你的问题:
// 替换原有退出判断行 if (t.kind == 'x' || t.kind == 'X') break; // 按x或X均可退出
2. 修复隐藏的减法运算bug
你当前expression()函数中处理减号的分支存在笔误,将减法写成了加法,会导致所有减法运算结果错误,同步修改即可:
case '-': left -= term(); // 原代码写为left += term() t = ts.get(); break;
可选优化
如果需要支持用户输入完表达式后直接跟X退出(无需单独输入X),可以在primary()函数中增加x/X的处理分支:
double primary() { Token t = ts.get(); switch (t.kind) { case 'x': case 'X': exit(0); // 原有其他分支不变 case '(': { double d = expression(); t = ts.get(); if (t.kind != ')') error("')' expected"); return d; } case '8': return t.value; default: error("primary expected"); } }
内容的提问来源于stack exchange,提问作者Daniel Aviles
相关产品推荐
相关产品推荐

