// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (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 { /// /// Вид внутреннего интерфейса, реализуемого типом. /// public enum internal_interface_kind { ordinal_interface, delegate_interface, unsized_array_interface , bounded_array_interface}; /// /// Внутренний интерфейс. Это не интерфейс, который будет потом доступен из среды исполнения, /// а используемый о внутренних целях компилятора. /// [Serializable] public abstract class internal_interface { public abstract internal_interface_kind internal_interface_kind { get; } } /* /// /// Внутренний интерфейс, который должны предоставлять все порядковые типы. /// [Serializable] public abstract class ordinal_type_interface : internal_interface { /// /// Тип внутреннего интерфейса. /// public override internal_interface_kind internal_interface_kind { get { return internal_interface_kind.ordinal_interface; } } /// /// Возвращает узел дерева, с операцией увеличения expr на 1. /// /// Выражение для инкремента. /// Инкрементированное выражение. public abstract expression_node inc_node(expression_node expr); /// /// Возвращает узел дерева, с операцией уменьшения expr на 1. /// /// Выражение для декремента. /// Декрементированное выражение. public abstract expression_node dec_node(expression_node expr); /// /// Возвращает булевское выражение, представляющие операцию сравнения двух выражений. /// /// Левое выражение перечеслимого типа. /// Правое выражение перечеслимого типа. /// Возвращаит true если левое меньше или равро правого, иначе false. public abstract expression_node lower_eq_node(expression_node left, expression_node right); /// /// Возвращает булевское выражение, представляющие операцию сравнения двух выражений. /// /// Левое выражение перечеслимого типа. /// Правое выражение перечеслимого типа. /// Возвращаит true если левое больше или равро правого, иначе false. public abstract expression_node greater_eq_node(expression_node left, expression_node right); /// /// Наименьшее значение перечеслимого типа. /// public abstract constant_node lower_value { get; } /// /// Наибольшее значение перечеслимого типа. /// public abstract constant_node upper_value { get; } /// /// Возвращает выражение с операцией приведения данного типа к целому. /// /// Выражение для приведения. /// Выражение с операцией приведения типа. public abstract expression_node expression_to_int(expression_node expr); /// /// Приводит тип к целому. Используется при компиляции. /// /// Константа для приведения. /// Целое число, соответствующее константе перечеслимого типа. public abstract int ordinal_type_to_int(constant_node cn); } */ /// /// Делегат, преобразующий константу указанного типа в целое число. /// /// Значение константы. /// Целое число к которому приведена константа. public delegate int ordinal_type_to_int(constant_node cn); [Serializable] public class ordinal_type_interface : internal_interface { /// /// Метод инкрементирования переменной порядкового типа. /// private function_node _inc_method; /// /// Метод декрементирования переменной порядкового типа. /// private function_node _dec_method; /// /// Метод получения следующего значения порядкового типа. Должен принимать одно значение данного типа и возвращать следующее. /// private function_node _inc_value_method; /// /// Метод получения предыдущего значения порядкового типа. Должен принимать одно значение данного типа и возвращать предыдущее. /// private function_node _dec_value_method; //private function_node _internal_inc_value; //private function_node _internal_dec_value; /// /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и /// возвращаит true если левое меньше или равро правого. Иначе false. /// private function_node _lower_eq_method; /// /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и возвращаит true /// если левое больше или равро правого. Иначе false. /// private function_node _greater_eq_method; private function_node _lower_method; private function_node _greater_method; /// /// Наименьшее значени перечислимого типа. /// private constant_node _lower_value; /// /// Наибольшее значение перечеслимого типа. /// private constant_node _upper_value; /// /// Метод преобразования значения перечислимого типа в целое число. /// Должен принимать одно значение перечислимого типа и возвращать значение целого типа. /// private function_node _value_to_int; /// /// Делегат, который позволяет преобразовывать значение перечислимого типа в целое во время компиляции. /// private ordinal_type_to_int _ordinal_type_to_int; /// /// Конструктор класса. /// /// Метод получения следующего значения порядкового типа. /// Метод получения предыдущего значения порядкового типа. /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и возвращаит true если левое меньше или равро правого. Иначе false. /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и возвращаит true если левое больше или равро правого. Иначе false. /// Наименьшее значени перечислимого типа. /// Наибольшее значение перечеслимого типа. /// Метод преобразования значения перечислимого типа в целое число. /// Делегат, который позволяет преобразовывать значение перечислимого типа в целое во время компиляции. 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; } } */ /// /// Метод инкрементирования переменной порядкового типа. /// public function_node inc_method { get { return _inc_method; } } /// /// Метод декрементирования переменной порядкового типа. /// public function_node dec_method { get { return _dec_method; } } /// /// Метод получения следующего значения порядкового типа. Должен принимать одно значение данного типа и возвращать следующее. /// public function_node inc_value_method { get { return _inc_value_method; } } /// /// Метод получения предыдущего значения порядкового типа. Должен принимать одно значение данного типа и возвращать предыдущее. /// public function_node dec_value_method { get { return _dec_value_method; } } /// /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и /// возвращаит true если левое меньше или равро правого. Иначе false. /// public function_node lower_eq_method { get { return _lower_eq_method; } } public function_node lower_method { get { return _lower_method; } } /// /// Метод сравнения двух значений данного типа. Принимает два значения перечислимого типа и возвращаит true /// если левое больше или равро правого. Иначе false. /// public function_node greater_eq_method { get { return _greater_eq_method; } } public function_node greater_method { get { return _greater_method; } } /// /// Наименьшее значени перечислимого типа. /// public constant_node lower_value { get { return _lower_value; } } /// /// Наибольшее значение перечеслимого типа. /// public constant_node upper_value { get { return _upper_value; } } /// /// Метод преобразования значения перечислимого типа в целое число. /// Должен принимать одно значение перечислимого типа и возвращать значение целого типа. /// public function_node value_to_int { get { return _value_to_int; } } /// /// Делегат, который позволяет преобразовывать значение перечислимого типа в целое во время компиляции. /// 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; } } } }