Страница 32 из 37
Выражения Хотя выражения могут включать информацию всех типов, мы бу- дем рассматривать только один тип: численные выражения. Для целей данной статьи предположим, что численные выражения могут вклю- чать: - числа; - операторы +,-,/,*,^, и =; - скобки; - переменные.
Символ ^ обозначает возведение в степень как в языке Бейсик, а символ = - оператор присваивания. Все эти элементы подчиняются правилам алгебры, с которыми вы знакомы. Несколько примеров выра- жений:
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, так как процедура пренебрегает старшинством операторов. Вы не можете брать операнды в другом порядке, кроме как слева направо, а умножение должно выполняться до вычитания. Начинающий может по- думать, что преодолеть данный момент просто; иногда в очень огра- ниченных случаях это так, но проблема становится действительно сложной, когда добавляются скобки, возведения в степень, перемен- ные и вызовы функций. Хотя существует несколько методов написания процедур, кото- рые вычисляют выражения подобного сорта, вы изучите один, который является самым распространенным и простым (некоторые другие мето- ды, использующиеся для написания программ грамматического разбо- ра, применяют сложные таблицы, которые требуют программ для их генерации). Метод, который вы будете изучать, называется рекур- сивным нисходящим синтаксическим разбором; в данной главе вы уви- дите, как он оправдывает свое название.
|