Энциклопедия Turbo Pascal. Главы 5-8
Страница 34. Синтаксический разбор


Синтаксический разбор

     Напомним, что существует целый ряд  методов  синтаксического
разбора и вычисления выражений. Для целей данной статьи предполо-
жим,  что выражения являются рекурсивными  структурными  данными,
которые определяются в терминах самих себя.  Если вы ограничитесь
использованием в выражениях только операторов +,  -,  *, / и ско-
бок,  то сможете сказать, что все выражения могут быть определены
в терминах следующих правил:
     выражение=>терм[+терм][-терм]
     терм=>множитель[*множитель][/множитель]
     множитель=>переменная, число или (выражение)
где любая часть может быть пустой.  Квадратные скобки  обозначают
необязательность,  а => - порождение. Фактически правила являются
правилами порождения выражений. Предшествование операторов подра-
зумевается способом порождения выражений.
     Выражение
      10+5*В
состоит из двух термов: 10 и 5*В. Однако, включает три множителя:
10,  5 и В.  Этими множителями являются два числа и одна перемен-
ная.
     С другой стороны выражение
      14*(7-С)
имеет два  терма 10 и (7-С),  один из которых является числом,  а
другая дочерним выражением. Дочернее выражение распадается на од-
но число и одну переменную.
     Данный процесс формирует основу для рекурсивного нисходящего
синтаксического  разбора,  который представляет собой набор общих
рекурсивных процедур,  носящих цепочный характер. На каждом соот-
ветствующем  шаге  синтаксический разбор может выполнять заданные
операции в алгебраически правильной последовательности.  Для при-
мера рассмотрим синтаксический разбор входного выражения 9/3-(100
+56) и выполнение операций по шагам.

     Шаг 1. Взять первую лексему: 9/3
     Шаг 2. Взять оба множителя и выполнить операцию деления.
            В результате получается 3.
     Шаг 3. Взять вторую лексему: (100+56). В данной точке вы
            должны рекурсивно  проанализировать второе выражение.
     Шаг 4. Взять оба числа и сложить. В результате получается
            156.
     Шаг 5. Возвратиться из рекурсивного вызова и вычесть 156 из
            3, что дает ответ - 153.

Если вы немного запутались,  не беспокойтесь. Это сложная концеп-
ция.  Нужно  усвоить  два момента о данном рекурсивном взгляде на
выражения: во-первых, предшествование операторов является неявным
при заданных правилах порождения выражений; во-вторых, данный ме-
тод синтаксического разбора и вычисления выражений очень похож на
то, как это делается вручную.

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