The multi-function calculator needs a symbol table for keeping track of the
names and meanings of variables and functions. This doesn't affect the grammar
rules or the calculator's directives, but it requires that the parser class
defines some additional bf(C++) types as well as several additional data
members.

The symbol table itself varies in size and contents once tt(mfcalc) is
used. It is defined as the em(data member)
tt(d_symbols) in the Parser's header file. In contrast, the em(function table)
has a em(fixed) size and contents. Because of this the function table is
defined as a em(static) data member. Both tables are defined as 
tt(std::unordered_map) containers: their keys are
tt(std::string) objects, their values, respecively, tt(double)s and tt(double
(*)(double))s. Here is the declaration of tt(d_symbols) and tt(s_functions) as
used in tt(mfcalc)'s parser:
        verb(
    std::unordered_map<std::string, double> d_symbols;

    static std::unordered_map<std::string, double (*)(double)> s_functions;
        )
    As tt(s_functions) is a static member, it can be initialized em(compile
time) from an em(array of pairs). To ease the definition of such an array a
tt(private typedef)
        verb(
    typedef std::pair<char const *, double (*)(double)> FunctionPair;
        )
    is added to the parser class, as well as a private array
        verb(
    static FunctionPair s_funTab[];
        )
    These definitions allow us to initialize tt(s_functions) in a separate
source file (tt(data.cc)):
        verbinclude(mfcalc/parser/data.cc)
    By simply editing the definition of tt(s_funTab), additional
functions can be added to the calculator.
