/
n-dimens
/
pascalabcnet
Обзор
Документация
Войти
/
n-dimens
/
pascalabcnet
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
TreeConverter/TreeRealization/internal_interfaces.cs
663 строки
22 KB
Mikhalkovich Stanislav
Mikhalkovich в Copyright
28 июл 2019, 23:53
28 июл 2019, 23:53
e603b1f
Код
Авторство
О чём код?
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; using System.Collections; namespace PascalABCCompiler.TreeRealization { /// <summary> /// Вид внутреннего интерфейса, реализуемого типом. /// </summary> public enum internal_interface_kind { ordinal_interface, delegate_interface, unsized_array_interface , bounded_array_interface}; /// <summary> /// Внутренний интерфейс. Это не интерфейс, который будет потом доступен из среды исполнения, /// а используемый о внутренних целях компилятора. /// </summary> [Serializable] public abstract class internal_interface { public abstract internal_interface_kind internal_interface_kind { get; } } /* /// <summary> /// Внутренний интерфейс, который должны предоставлять все порядковые типы. /// </summary> [Serializable] public abstract class ordinal_type_interface : internal_interface { /// <summary> /// Тип внутреннего интерфейса. /// </summary> public override internal_interface_kind internal_interface_kind { get { return internal_interface_kind.ordinal_interface; } } /// <summary> /// Возвращает узел дерева, с операцией увеличения expr на 1. /// </summary> /// <param name="expr">Выражение для инкремента.</param> /// <returns>Инкрементированное выражение.</returns> public abstract expression_node inc_node(expression_node expr); /// <summary> /// Возвращает узел дерева, с операцией уменьшения expr на 1. /// </summary> /// <param name="expr">Выражение для декремента.</param> /// <returns>Декрементированное выражение.</returns> public abstract expression_node dec_node(expression_node expr); /// <summary> /// Возвращает булевское выражение, представляющие операцию сравнения двух выражений. /// </summary> /// <param name="left">Левое выражение перечеслимого типа.</param> /// <param name="right">Правое выражение перечеслимого типа.</param> /// <returns>Возвращаит true если левое меньше или равро правого, иначе false.</returns> public abstract expression_node lower_eq_node(expression_node left, expression_node right); /// <summary> /// Возвращает булевское выражение, представляющие операцию сравнения двух выражений. /// </summary> /// <param name="left">Левое выражение перечеслимого типа.</param> /// <param name="right">Правое выражение перечеслимого типа.</param> /// <returns>Возвращаит true если левое больше или равро правого, иначе false.</returns> public abstract expression_node greater_eq_node(expression_node left, expression_node right); /// <summary> /// Наименьшее значение перечеслимого типа. /// </summary> public abstract constant_node lower_value { get; } /// <summary> /// Наибольшее значение перечеслимого типа. /// </summary> public abstract constant_node upper_value { get; } /// <summary> /// Возвращает выражение с операцией приведения данного типа к целому. /// </summary> /// <param name="expr">Выражение для приведения.</param> /// <returns>Выражение с операцией приведения типа.</returns> public abstract expression_node expression_to_int(expression_node expr); /// <summary> /// Приводит тип к целому. Используется при компиляции. /// </summary> /// <param name="cn">Константа для приведения.</param> /// <returns>Целое число, соответствующее константе перечеслимого типа.</returns> public abstract int ordinal_type_to_int(constant_node cn); } */ /// <summary> /// Делегат, преобразующий константу указанного типа в целое число. /// </summary> /// <param name="cn">Значение константы.</param> /// <returns>Целое число к которому приведена константа.</returns> public delegate int ordinal_type_to_int(constant_node cn); [Serializable] public class ordinal_type_interface : internal_interface { /// <summary> /// Метод инкрементирования переменной порядкового типа. /// </summary> private function_node _inc_method; /// <summary> /// Метод декрементирования переменной порядкового типа. /// </summary> private function_node _dec_method; /// <summary> /// Метод получения следующего значения порядкового типа. Должен принимать одно значение данного типа и возвращать следующее. /// </summary> private function_node _inc_value_method; /// <summary> /// Метод получения предыдущего значения порядкового типа. Должен принимать одно значение данного типа и возвращать предыдущее. /// </summary> private function_node _dec_value_method; //private function_node _internal_inc_value; //private function_node _internal_dec_value; /// <summary> /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и /// возвращаит true если левое меньше или равро правого. Иначе false. /// </summary> private function_node _lower_eq_method; /// <summary> /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и возвращаит true /// если левое больше или равро правого. Иначе false. /// </summary> private function_node _greater_eq_method; private function_node _lower_method; private function_node _greater_method; /// <summary> /// Наименьшее значени перечислимого типа. /// </summary> private constant_node _lower_value; /// <summary> /// Наибольшее значение перечеслимого типа. /// </summary> private constant_node _upper_value; /// <summary> /// Метод преобразования значения перечислимого типа в целое число. /// Должен принимать одно значение перечислимого типа и возвращать значение целого типа. /// </summary> private function_node _value_to_int; /// <summary> /// Делегат, который позволяет преобразовывать значение перечислимого типа в целое во время компиляции. /// </summary> private ordinal_type_to_int _ordinal_type_to_int; /// <summary> /// Конструктор класса. /// </summary> /// <param name="inc_method">Метод получения следующего значения порядкового типа.</param> /// <param name="dec_method">Метод получения предыдущего значения порядкового типа.</param> /// <param name="lower_eq_method">Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и возвращаит true если левое меньше или равро правого. Иначе false.</param> /// <param name="greater_eq_method">Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и возвращаит true если левое больше или равро правого. Иначе false.</param> /// <param name="lower_value">Наименьшее значени перечислимого типа.</param> /// <param name="upper_value">Наибольшее значение перечеслимого типа.</param> /// <param name="value_to_int">Метод преобразования значения перечислимого типа в целое число.</param> /// <param name="ordinal_type_to_int_method">Делегат, который позволяет преобразовывать значение перечислимого типа в целое во время компиляции.</param> public ordinal_type_interface(function_node inc_method, function_node dec_method, function_node inc_value_method, function_node dec_value_method, function_node lower_eq_method, function_node greater_eq_method, function_node lower_method, function_node greater_method, constant_node lower_value, constant_node upper_value, function_node value_to_int, ordinal_type_to_int ordinal_type_to_int_method) { _inc_method = inc_method; _dec_method = dec_method; _inc_value_method = inc_value_method; _dec_value_method = dec_value_method; _lower_eq_method = lower_eq_method; _greater_eq_method = greater_eq_method; _lower_method = lower_method; _greater_method = greater_method; _lower_value = lower_value; _upper_value = upper_value; _value_to_int = value_to_int; _ordinal_type_to_int = ordinal_type_to_int_method; } /* public function_node internal_inc_value { get { return _internal_inc_value; } } public function_node internal_dec_value { get { return _internal_dec_value; } } */ /// <summary> /// Метод инкрементирования переменной порядкового типа. /// </summary> public function_node inc_method { get { return _inc_method; } } /// <summary> /// Метод декрементирования переменной порядкового типа. /// </summary> public function_node dec_method { get { return _dec_method; } } /// <summary> /// Метод получения следующего значения порядкового типа. Должен принимать одно значение данного типа и возвращать следующее. /// </summary> public function_node inc_value_method { get { return _inc_value_method; } } /// <summary> /// Метод получения предыдущего значения порядкового типа. Должен принимать одно значение данного типа и возвращать предыдущее. /// </summary> public function_node dec_value_method { get { return _dec_value_method; } } /// <summary> /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и /// возвращаит true если левое меньше или равро правого. Иначе false. /// </summary> public function_node lower_eq_method { get { return _lower_eq_method; } } public function_node lower_method { get { return _lower_method; } } /// <summary> /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и возвращаит true /// если левое больше или равро правого. Иначе false. /// </summary> public function_node greater_eq_method { get { return _greater_eq_method; } } public function_node greater_method { get { return _greater_method; } } /// <summary> /// Наименьшее значени перечислимого типа. /// </summary> public constant_node lower_value { get { return _lower_value; } } /// <summary> /// Наибольшее значение перечеслимого типа. /// </summary> public constant_node upper_value { get { return _upper_value; } } /// <summary> /// Метод преобразования значения перечислимого типа в целое число. /// Должен принимать одно значение перечислимого типа и возвращать значение целого типа. /// </summary> public function_node value_to_int { get { return _value_to_int; } } /// <summary> /// Делегат, который позволяет преобразовывать значение перечислимого типа в целое во время компиляции. /// </summary> public ordinal_type_to_int ordinal_type_to_int { get { return _ordinal_type_to_int; } } public override internal_interface_kind internal_interface_kind { get { return internal_interface_kind.ordinal_interface; } } public type_node elems_type { get { return lower_value.type; } } } [Serializable] public class delegate_internal_interface : internal_interface { private parameter_list _parametres=new parameter_list(); private type_node _return_value_type; private function_node _invoke_method; private function_node _constructor; public delegate_internal_interface(type_node return_value_type, function_node invoke_method, function_node constructor) { _return_value_type = return_value_type; _invoke_method = invoke_method; _constructor = constructor; } public parameter_list parameters { get { return _parametres; } } public type_node return_value_type { get { return _return_value_type; } } public function_node invoke_method { get { return _invoke_method; } } public function_node constructor { get { return _constructor; } } public override internal_interface_kind internal_interface_kind { get { return (internal_interface_kind.delegate_interface); } } } [Serializable] public class array_internal_interface : internal_interface { private type_node _element_type; private int _rank=1; public array_internal_interface(type_node element_type, int rank) { _element_type = element_type; _rank = rank; } public type_node element_type { get { return _element_type; } } public int rank { get { return _rank; } } public override internal_interface_kind internal_interface_kind { get { return (internal_interface_kind.unsized_array_interface); } } } /* [Serializable] public class pascal_array_internal_interface : internal_interface { private type_node _index_type; private constant_node _lower_index_value; private constant_node _upper_index_value; private int _int_upper_index_value; private int _int_lower_index_value; private type_node _elem_type; public pascal_array_internal_interface(type_node index_type, constant_node lower_index_value, constant_node upper_index_value, int int_lower_index_value, int int_upper_index_value, type_node elem_type) { _index_type = index_type; _lower_index_value = lower_index_value; _upper_index_value = upper_index_value; _int_lower_index_value = int_lower_index_value; _int_upper_index_value = int_upper_index_value; _elem_type = elem_type; } public type_node elem_type { get { return _elem_type; } } public int int_upper_index_value { get { return _int_upper_index_value; } } public int int_lower_index_value { get { return _int_lower_index_value; } } public int length { get { return (_int_upper_index_value - _int_lower_index_value + 1); } } public type_node index_type { get { return _index_type; } } public constant_node lower_index_value { get { return _lower_index_value; } } public constant_node upper_index_value { get { return _upper_index_value; } } public override internal_interface_kind internal_interface_kind { get { return internal_interface_kind.pascal_array_internal_interface; } } } */ /* [Serializable] public class diap_internal_interface : internal_interface { private constant_node _lower_value; private constant_node _upper_value; public diap_internal_interface(constant_node lower_value, constant_node upper_value) { _lower_value = lower_value; _upper_value = upper_value; } public constant_node lower_value { get { return _lower_value; } } public constant_node upper_value { get { return _upper_value; } } public override internal_interface_kind internal_interface_kind { get { return internal_interface_kind.diap_internal_interface; } } } */ [Serializable] public class bounded_array_interface : internal_interface { private ordinal_type_interface _oti; private type_node _element_type; private common_property_node _index_property; private type_node _index_type; private class_field _int_array; public bounded_array_interface(ordinal_type_interface oti, type_node element_type, common_property_node index_property, type_node index_type, class_field int_array) { _oti = oti; _element_type = element_type; _index_property = index_property; _index_type = index_type; _int_array = int_array; } public class_field int_array { get { return _int_array; } } public ordinal_type_interface ordinal_type_interface { get { return _oti; } } public common_property_node index_property { get { return _index_property; } } public type_node index_type { get { return _index_type; } } public type_node element_type { get { return _element_type; } } public override internal_interface_kind internal_interface_kind { get { return internal_interface_kind.bounded_array_interface; } } } }