Хотя выражения могут включать информацию всех типов, мы бу-
дем рассматривать только один тип: численные выражения. Для целей
данной статьи предположим, что численные выражения могут вклю-
чать:
- числа;
- операторы +,-,/,*,^, и =;
- скобки;
- переменные.
Символ ^ обозначает возведение в степень как в языке Бейсик,
а символ = - оператор присваивания. Все эти элементы подчиняются
правилам алгебры, с которыми вы знакомы. Несколько примеров выра-
жений:
10-8
(100-5)*14/6
а+в-с
10^5
а=10-в
Примем следующее старшинство операторов:
старшие: ^
*/
+ -
младшие: =
Оператору присваивания предшествуют вычисления слева и спра-
ва.
В примерах данной главы приняты следующие предположения: Все
переменные являются однобуквенными, что означает, что возможно 26
переменных. Все числа имеют тип integer (целые), хотя вы могли бы
легко написать процедуры для работы с числами с плавающей запя-
той. Наконец, только минимальное количество проверок на ошибки
включено в процедуры, чтобы сохранить логическую ясность и не су-
етиться.
Попытайтесь вычислить следующее простое выражение:
10-2*3
Это выражение имеет значение 4. Хотя вы легко бы написали
программу, которая вычисляет данное специфическое выражение, но
гораздо интереснее создать программу, которая будет давать пра-
вильный ответ для любого выражения. Во-первых, предположим, что
вы применяете процедуру, аналогичную следующей:
a:=взять первый операнд
while(операнды присутствуют) do
begin
op:=взять оператор;
b:=взять второй операнд;
a:=a op b
end;
Согласно данной процедуре вы могли бы взять первый операнд,
оператор и второй операнд; выполнить операцию; затем взять следу-
ющий оператор и операнд, если таковые имеются; выполнить эту опе-
рацию и так далее. Если вы пользуетесь этим базовым методом, то
выражение 10-2*3 даст результат 24(8*3) вместо правильного ответа
4, так как процедура пренебрегает старшинством операторов. Вы не
можете брать операнды в другом порядке, кроме как слева направо,
а умножение должно выполняться до вычитания. Начинающий может по-
думать, что преодолеть данный момент просто; иногда в очень огра-
ниченных случаях это так, но проблема становится действительно
сложной, когда добавляются скобки, возведения в степень, перемен-
ные и вызовы функций.
Хотя существует несколько методов написания процедур, кото-
рые вычисляют выражения подобного сорта, вы изучите один, который
является самым распространенным и простым (некоторые другие мето-
ды, использующиеся для написания программ грамматического разбо-
ра, применяют сложные таблицы, которые требуют программ для их
генерации). Метод, который вы будете изучать, называется рекур-
сивным нисходящим синтаксическим разбором; в данной главе вы уви-
дите, как он оправдывает свое название.