main()修改
- 增加打印提示符
> - 处理无法识别 q 的BUG
int main()
try
{
while (cin) {
cout << "> ";
Token t = ts.get();
while (t.kind == ';') t=ts.get(); // eat ‘;’
if (t.kind == 'q') {
keep_window_open();
return 0;
}
ts.putback(t);
cout << "= " << expression() << '\n';
}
keep_window_open();
return 0;
}
catch (exception& e) {
cerr << e.what() << '\n';
keep_window_open("~~");
return 1;
}
catch (...) {
cerr << "exception \n";
keep_window_open("~~");
return 2;
}
当用户输入用例 1+2; q ,按照期待,应该是先输出 =3,紧接着程序退出;
如果按照原先的写法会给出primary expected的错误提示信息:
// 原先的写法
while (cin) {
Token t = ts.get();
if (t.kind == 'q') break; // 'q' for quit
if (t.kind == ';') // ';' for "print now"
cout << "=" << val << '\n';
else
ts.putback(t);
val = expression();
}
" 原因在于在上面的代码中,判断输入是分号后便不再检查
q,而是继续依次调用expression() term() primary(),由于q不是Primary,从而输出错误信息。"
摘自 中文版 基础篇 第7章 140页
支持负数
- 修改primary文法来支持负数
Primary:
Number
"(" Expression ")"
"–" Primary
"+" Primary
- 具体代码修改
double primary()
{
Token t = ts.get();
switch (t.kind) {
case '(': // 处理 ‘(’ expression ‘)’
{
double d = expression();
t = ts.get();
if (t.kind != ')') error("')' expected");
return d;
}
case '8': // 使用 ‘8’ 来表示一个浮点数
return t.value; // 返回浮点数的值
case '-':
return -primary(); // 处理负数
case '+':
return primary();
default:
error("primary expected");
}
}
-
负数用例展示
负数用例展示
> 1+-2;
= -1
> 1+-2*3;
= -5
> 1+-2+-3+-4;
= -8
支持取余运算
具体代码
// 在 Token_stream::get() 增加
case '%':
// 在term()里面增加
case '%':
{
double d = primary();
if (d == 0) error("divide by zero");
left = fmod(left,d);
t = ts.get();
break;
}
-
fmod()来自<cmath> -
x % y可以定义成x - y * int(x / y)
取余用例展示

取余用例展示
> 2%11;
= 2
> 26%12;
= 2
> 3.14%1.3;
= 0.54
>
基于文法的简单算术表达式计算器 系列索引
-
[C++][第0篇] 系列索引 基于文法的算术表达式解释器
关键词 系列索引
