Энциклопедия Turbo Pascal. Главы 5-8
Страница 32. Выражения


 

Выражения

     Хотя выражения могут включать информацию всех типов,  мы бу-
дем рассматривать только один тип: численные выражения. Для целей
данной  статьи  предположим,  что численные выражения могут вклю-
чать:
     - числа;
     - операторы +,-,/,*,^, и =;
     - скобки;
     - переменные.

     Символ ^ обозначает возведение в степень как в языке Бейсик,
а символ = - оператор присваивания.  Все эти элементы подчиняются
правилам алгебры, с которыми вы знакомы. Несколько примеров выра-
жений:

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

 
« Предыдущая статья   Следующая статья »