Шрифт:
и не прекращать работу, пока пользователь не введет строку
Входные данные для калькулятора вводятся с клавиатуры. Это затрудняет тестирование: каждый раз, внося улучшение, мы должны напечатать множество контрольных примеров (каждый раз заново!), чтобы убедиться, что программа по-прежнему работает. Было бы лучше, если бы контрольные примеры где-то хранились и вызывать их одной командой. Некоторые операционные системы (в частности, Unix) упрощают эту задачу, позволяя потоку
Рассмотрим примеры.
Мы хотели бы вывести результат (
приводит к этому результату, а более очевидная строка
вызывает ошибку Ожидается первичное выражение. Где следует искать эту ошибку? Конечно, в функции
Если обнаруживаем точку с запятой, то вызываем функцию
Это повышает надежность обработки ошибок. Таким образом, теперь можно искать новые пути улучшения калькулятора.
7.4. Отрицательные числа
Проверив калькулятор, легко убедиться, что он не слишком элегантно обрабатывает отрицательные числа. Например, выражение
является ошибочным.
Для того чтобы калькулятор работал корректно, мы должны были бы написать
Однако это неприемлемо.
В данном случае необходимо внести исправления в грамматику, чтобы предусмотреть унарный минус. На первый взгляд легче всего внести исправления в пункт Первичное выражение. Сейчас он выглядит так:
Нам требуется, чтобы этот пункт выглядел примерно таким образом: