Напомним, что существует целый ряд методов синтаксического
разбора и вычисления выражений. Для целей данной статьи предполо-
жим, что выражения являются рекурсивными структурными данными,
которые определяются в терминах самих себя. Если вы ограничитесь
использованием в выражениях только операторов +, -, *, / и ско-
бок, то сможете сказать, что все выражения могут быть определены
в терминах следующих правил:
выражение=>терм[+терм][-терм]
терм=>множитель[*множитель][/множитель]
множитель=>переменная, число или (выражение)
где любая часть может быть пустой. Квадратные скобки обозначают
необязательность, а => - порождение. Фактически правила являются
правилами порождения выражений. Предшествование операторов подра-
зумевается способом порождения выражений.
Выражение
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.
Если вы немного запутались, не беспокойтесь. Это сложная концеп-
ция. Нужно усвоить два момента о данном рекурсивном взгляде на
выражения: во-первых, предшествование операторов является неявным
при заданных правилах порождения выражений; во-вторых, данный ме-
тод синтаксического разбора и вычисления выражений очень похож на
то, как это делается вручную.