[C++][第5篇]修改main() 增加負(fù)數(shù)功能 增加取余功能

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ì)算器 系列索引

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容