2019-07-28 23:53:15 +03:00
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
2015-06-01 22:15:17 +03:00
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
2015-05-14 22:35:07 +03:00
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 ;
}
}
}
}