3.4 Процессор |
Предыдущая Содержание Следующая |
Как обработать выражение? Если мы хотим выполнять лишь простые арифметические действия над числовыми значениями, то можно расширить функции распознавания и вычислять результат как только распознаны операторы и операнды: sum() ожидала бы результат типа double от каждого вызова product(), выполняла сложение или вычитание так быстро, как возможно, и возвращала результат работы функции также в виде значения типа double. Если мы хотим создать систему, которая может обрабатывать более сложные выражения, надо сохранять выражения, чтобы выполнять обработку позже. В этом случае можно не только выполнять арифметические действия, но и позволить определения и условную обработку только части выражения, и можно использовать запомненные выражения в качестве пользовательских функций внутри других выражений. Всё, что нам нужно, это достаточно универсальный способ представления выражения. Традиционный метод заключается в использовании бинарного дерева и сохранения token в каждом узле:
struct Node { enum tokens token; struct Node * left, * right; };
Тем не менее, это не очень гибко. Надо ввести в использование union, чтобы создать узел, в котором можно хранить численное значение и впустую тратится память в узлах, представляющих унарные операторы. Кроме того, process() и delete() будут содержать операторы switch, которые будут множиться с каждым новым символом, который мы придумаем.
|
Предыдущая Содержание Следующая |