Новости           

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности

Гостевая книга

От автора

ВЫРАЖЕНИЯ

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

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

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

(с)Все права защищены

По всем интересующим вопросампрошу писать на электронный адрес

    Rambler's Top100 PROext: Top 1000
    Rambler's Top100 Яндекс цитирования
Hosted by uCoz