Курсовая работа: Интерактивный интерпретатор
3. Заносим в стек c.
Состояние стека на этот момент: a, b, c – вершина.
4. Извлекаем из стека операнды операции умножения – b и c и заносим в стек результат.
Стек: a, b*c.
5. Заносим в стек d.
Стек: a, b*c, d.
6. Извлекаем из стека операнды, производим вычитание, заносим в стек результат.
Стек: a, b*c-d.
7. Заносим в стек e.
Стек: a, b*c-d, e.
8. Извлекаем из стека операнды, производим деление, заносим в стек результат.
Стек: a, (b*c-d)/e.
9. Извлекаем из стека операнды, производим сложение, заносим в стек результат.
Итого получаем в стеке a+(b*c-d)/e, что и требовалось.
Для представления выражений в интерпретаторе используется класс Expression. Он содержит обратную польскую запись выражения в виде связанного списка (однонаправленного). Звено этого списка, равно как и стека, используемого при вычислении выражения, представляется объектом вложенного класса Expression.Element, содержащим ссылки на следующее звено и на объект, реализующий интерфейс IComputable, который содержит один метод logic.vartypes.VarBase Compute() – получить значение. Вычисление значения выражения по рассмотренном выше алгоритму производится в методе VarBaseExpression.Calculate(). Строка, содержащая запись выражения, обрабатывается в конструкторе этого класса. Интерфейс IComputable реализован тремя классами:
· VarBase – абстрактный класс, представляющий значение любого типа данных;
· VarName – представляет переменную по ее имени;
· Call – представляет вызов операции либо функции.
Вначале рассмотрим классы, представляющие значения различных типов. Все они являются потомками только что названного класса VarBase. Как было сказано выше, в языке существует четыре типа данных – целое число, вещественное число, строка и массив. При этом числовые и строковый типы, в противоположность массиву, называются простыми типами. Для простых значений базовым является абстрактный класс SingleVar. Целый и вещественный типы также особо выделяются как числовые, и для них существует свой базовый абстрактный класс NumVar. Наконец, каждому из четырех типов данных соответствует свой конкретный класс – IntVar, RealVar, StringVar и ArrayVar. Эта иерархия классов находится в пространстве имен interpr.logic.vartypes. Она изображена на диаграмме на рис. 4.
Рис. 4.
Классы пространства имен interpr . logic . vartypes .
Метод Compute() класса VarBase просто возвращает ссылку this. Методы IsArray(), IsSingle(), IsString(), IsNum(), IsInt(), IsReal() позволяют определить тип значения. Они используют оператор RTTIis языка C#. В классе VarBase объявлены абстрактными унаследованные от System.Object методы Clone() и ToString(), что требует обязательного их переопределения у неабстрактных потомков. Абстрактный метод Serialise() сохраняет объект (значение и его тип) в файле. Класс ArrayVar имеет методы для присвоения и получения значений отдельных элементов массива, получения размера массива, выяснения вопроса, определено ли значение элемента массива с заданным индексом. Класс SingleVar определяет абстрактный метод ToBool(), возвращающий логическое значение объекта. В классе NumVar также имеется абстрактный метод ToDouble(), возвращающий значение объекта как вещественное число. Эти кл?