Читать «Полный справочник по С++» онлайн - страница 443

Герберт Шилдт

Затем наступает очень важный момент. Поскольку лексема содержит знак -, он записывается в переменную ор. Затем анализатор извлекает следующую лексему, рав-

ную числу 3, и вновь начинается нисходящий анализ по цепочке. Сначала, как и прежде, вызывается функция atom(), которая возвращает число 3. Затем это число присваивается переменной result, после чего считывается лексема *. После этого управление возвращается по цепочке в функцию eval_exp3 (), которая считывает последнюю лексему, равную числу 2. В этот момент выполняется первая арифметическая операция — умножение 2*3. Результат возвращается в функцию eval_exp2(), в которой выполняется вычитание. Результатом вычитания является число 4. Хотя, на первый взгляд, процесс анализа выглядит довольно запутанным, его проверка на других примерах показывает, что все функции работают правильно.

На основе этого синтаксического анализатора можно создать простой калькулятор. Однако прежде чем внедрять этот калькулятор в более сложные программы, папри-мер, в базы данных, необходимо научить его работать с переменными. Этому посвящен следующий раздел.

Ш Синтаксический анализатор, работающий с переменными

Все языки программирования, многие калькуляторы и электронные таблицы используют переменные для хранения величин. Поскольку во всех этих приложениях применяется синтаксический анализ выражений, необходимо научиться обрабатывать переменные. Для этого следует усовершенствовать наш синтаксический анализатор. Как указывалось выше, для обозначения переменных используются буквы от А до z. Переменные будут храниться в массиве, принадлежащем классу parser. Следовательно, в класс parser необходимо включить новый член.

| double vars[NUMVARS]; II Хранит значения переменных.

Кроме того, придется изменить конструктор класса parser.

II Конструктор класса constructor parser::parser()

{

int i ;

exp_ptr = NULL;

for(i=0; i<NUMVARS; i++) vars[i] = 0.0;

}

Как видим, переменные инициализируются нулем.

Кроме того, нам понадобится функция, определяющая значение переменной. Поскольку переменные называются буквами от А до z, их легко использовать в качестве индексов массива vars, вычитая из имен переменных ASCII-код буквы А. Эту операцию выполняет функция-член find_var().