pascalabcnet/TreeConverter/TreeRealization/internal_interfaces.cs

664 lines
22 KiB
C#
Raw Normal View History

// 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;
}
}
}
}