3.4 Процессор

Предыдущая  Содержание  Следующая V*D*V

Как обработать выражение? Если мы хотим выполнять лишь простые арифметические действия над числовыми значениями, то можно расширить функции распознавания и вычислять результат как только распознаны операторы и операнды: sum() ожидала бы результат типа double от каждого вызова product(), выполняла сложение или вычитание так быстро, как возможно, и возвращала результат работы функции также в виде значения типа double.

Если мы хотим создать систему, которая может обрабатывать более сложные выражения, надо сохранять выражения, чтобы выполнять обработку позже. В этом случае можно не только выполнять арифметические действия, но и позволить определения и условную обработку только части выражения, и можно использовать запомненные выражения в качестве пользовательских функций внутри других выражений. Всё, что нам нужно, это достаточно универсальный способ представления выражения. Традиционный метод заключается в использовании бинарного дерева и сохранения token в каждом узле:

 

struct Node {

    enum tokens token;

    struct Node * left, * right;

};

 

Тем не менее, это не очень гибко. Надо ввести в использование union, чтобы создать узел, в котором можно хранить численное значение и впустую тратится память в узлах, представляющих унарные операторы. Кроме того, process() и delete() будут содержать операторы switch, которые будут множиться с каждым новым символом, который мы придумаем.

 

Предыдущая  Содержание  Следующая