驱动程序

  有了所有这些程序片段之后,我们还需要一个驱动程序,以便使所有的事情能够开始。对这个简单的例子,main()就可以完成这件事:

    int main()
    {
        table["pi"] = 3.1415926535897932385;        // 插入预定义的名字
        table["e"] = 2.7182818284590452354;

        while(cin)
        {
            get_token();
            if(curr_tok == END) break;
            if(curr_tok == PRINT) continue;
            cout << expr(false) << '\n';
        }

        return no_of_errors;
    }

按照惯例,main()在正常结束时应该返回0,否则就返回非0(3.2节)。返回出现的错误数正好与此相符。在这里,需要做的初始化工作只有将一些预定义的名字插入符号表中。

  主循环的基本工作就是读入表达式并写出回答,这可以由下面一行完成:

cout << expr(false) << '\n';

参数false告诉expr()它无须调用get_token()去取得要用的单词。

  每次循环都需要检测cin,这样就能保证在输入流出了什么问题时使程序结束。检测END则保证在get_token()遇到文件结束时能正确地退出循环。一个break语句将导致退出最内层的switch语句或者循环(即,for语句、while语句或者do语句)。检测PRINT(即'\n'或者';')将使expr()不必去处理空的表达式。continue语句等价于跳到循环的最后,所以在这里的

    while(cin) {
        // ...
        if(curr_tok == PRINT) continue;
        cout << expr(false) << '\n';
    }

等价于

    while(cin)
    {
        // ...
        if(curr_tok != PRINT)
            cout << expr(false) << '\n';
    }

🔚