Язык программирования C++ для профессионалов


Анализатор - часть 2


double expr()// складывает и вычитает { double left = term();

for(;;) // ``вечно'' switch(curr_tok) { case PLUS: get_token();// случай '+' left += term(); break; case MINUS: get_token();// случай '-' left -= term(); break; default: return left; } }

Сама по себе эта функция делает немного. Как принято в высокоуровневых функциях больших программ, она выполняет задание, вызывая другие функции. Отметим, что выражения вида 2-3+4 вычисляются как (2-3)+4, что предопределяется правилами грамматики. Непривычная запись for(;;) - это стандартный способ задания бесконечного цикла, и его можно обозначить словом "вечно". Это вырожденная форма оператора for, и альтернативой ей может служить оператор while(1). Оператор switch выполняется повторно до тех пор, пока не перестанут появляться операции + или - , а тогда по умолчанию выполняется оператор return (default).

Операции += и -= используются для выполнения операций сложения и вычитания. Можно написать эквивалентные присваивания: left=left+term() и left=left-term(). Однако вариант left+=term() и left-=term() не только короче, но и более четко определяет требуемое действие. Для бинарной операции @ выражение x@=y означает x=x@y, за исключением того, что x вычисляется только один раз. Это применимо к бинарным операциям:

+ - * / % & | ^ << >>

поэтому возможны следующие операции присваивания:

+= -= *= /= %= &= |= ^= <<= >>=

Каждая операция является отдельной лексемой, поэтому a + =1 содержит синтаксическую ошибку (из-за пробела между + и =). Расшифровка операций следующая: % - взятие остатка, &, | и ^ - разрядные логические операции И, ИЛИ и Исключающее ИЛИ; << и >> сдвиг влево и сдвиг вправо. Функции term() и get_token() должны быть описаны до определения expr(). В лекции 4 рассматривается построение программы в виде совокупности файлов. За одним исключением, все программы калькулятора можно составить так, чтобы в них все объекты описывались только один раз и до их использования. Исключением является функция expr(), которая вызывает функцию term(), а она, в свою очередь, вызывает prim(), и уже та, наконец, вызывает expr(). Этот цикл необходимо как-то разорвать, для чего вполне подходит заданное до определения prim() описание:




Начало  Назад  Вперед



Книжный магазин