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;
}
當(dāng)用戶輸入用例 1+2; q ,按照期待,應(yīng)該是先輸出 =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,而是繼續(xù)依次調(diào)用expression() term() primary(),由于q不是Primary,從而輸出錯誤信息。"
摘自 中文版 基礎(chǔ)篇 第7章 140頁
支持負(fù)數(shù)
- 修改primary文法來支持負(fù)數(shù)
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’ 來表示一個浮點(diǎn)數(shù)
return t.value; // 返回浮點(diǎn)數(shù)的值
case '-':
return -primary(); // 處理負(fù)數(shù)
case '+':
return primary();
default:
error("primary expected");
}
}
-
負(fù)數(shù)用例展示
負(fù)數(shù)用例展示
> 1+-2;
= -1
> 1+-2*3;
= -5
> 1+-2+-3+-4;
= -8
支持取余運(yùn)算
具體代碼
// 在 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
>
基于文法的簡單算術(shù)表達(dá)式計(jì)算器 系列索引
-
[C++][第0篇] 系列索引 基于文法的算術(shù)表達(dá)式解釋器
關(guān)鍵詞 系列索引
