pascalabcnet/SemanticTree/SemanticTree.cs
Ivan Bondarev 4817fd07e1 #2448
2021-02-21 11:40:39 +01:00

2592 lines
62 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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.Generic;
namespace PascalABCCompiler.SemanticTree
{
//Вид объекта.
//basic-базовый объект, не определяемый в программе, например метод сложения двух целых чисел.
//common-обычный тип, метод и т.д., определяемый пользователем.
//compiled-тип, метод или другой узел, определяемый пользователем.
public enum node_kind {basic,common,compiled,indefinite};
//Уровень доступа класса. Хотя зачем я это пишу? И так понятно из названия.
public enum type_access_level {tal_public,tal_internal};
//Как мы будем представлять ссылочные и размерные типы?
//public enum reference_or_value_type {reference_type,value_type};
//Расположение элемента - в функции, в классе, в пространстве имен.
public enum node_location_kind {in_function_location,in_class_location,in_namespace_location, in_block_location, indefinite};
//Уровень доступа к элементам класса.
public enum field_access_level { fal_private, fal_internal, fal_protected, fal_public };
//Обычный, статический или виртуальный элемент класса.
public enum polymorphic_state {ps_static,ps_common,ps_virtual,ps_virtual_abstract};
public enum type_special_kind { none_kind, not_set_kind, array_kind, enum_kind, typed_file, binary_file, short_string, array_wrapper, record, set_type, base_set_type, diap_type, text_file };
public enum attribute_qualifier_kind {none_kind, return_kind, assembly_kind, param_kind, type_kind, field_kind, event_kind, property_kind, method_kind}
//Тип передачи параметра - по ссылке или по значению.
public enum parameter_type { value, var, cnst };
//Тип базовой функции.
public enum basic_function_type
{
none,
iadd, isub, imul, idiv, imod, igr, ism, igreq, ismeq, ieq, inoteq, ishl, ishr, ior, inot, ixor, iand, iunmin, iinc, idec, isinc, isdec, iassign, //signed integer (4 byte)
uiadd, uisub, uimul, uidiv, uimod, uigr, uism, uigreq, uismeq, uieq, uinoteq, uishl, uishr, uior, uinot, uixor, uiand, uiunmin, uiinc, uidec, uisinc, uisdec, uiassign, //unsigned integer (4 byte)
badd, bsub, bmul, bdiv, bmod, bgr, bsm, bgreq, bsmeq, beq, bnoteq, bshl, bshr, bor, bnot, bxor, band, bunmin, binc, bdec, bsinc, bsdec, bassign, //unsigned byte
sbadd, sbsub, sbmul, sbdiv, sbmod, sbgr, sbsm, sbgreq, sbsmeq, sbeq, sbnoteq, sbshl, sbshr, sbor, sbnot, sbxor, sband, sbunmin, sbinc, sbdec, sbsinc, sbsdec, sbassign, //signed byte
sadd, ssub, smul, sdiv, smod, sgr, ssm, sgreq, ssmeq, seq, snoteq, sshl, sshr, sor, snot, sxor, sand, sunmin, sinc, sdec, ssinc, ssdec, sassign, //short (2-byte)
usadd, ussub, usmul, usdiv, usmod, usgr, ussm, usgreq, ussmeq, useq, usnoteq, usshl, usshr, usor, usnot, usxor, usand, usunmin, usinc, usdec, ussinc, ussdec, usassign, //unsigned short (2 byte)
ladd, lsub, lmul, ldiv, lmod, lgr, lsm, lgreq, lsmeq, leq, lnoteq, lshl, lshr, lor, lnot, lxor, land, lunmin, linc, ldec, lsinc, lsdec, lassign, //long (8 byte)
uladd, ulsub, ulmul, uldiv, ulmod, ulgr, ulsm, ulgreq, ulsmeq, uleq, ulnoteq, ulshl, ulshr, ulor, ulnot, ulxor, uland, ulunmin, ulinc, uldec, ulsinc, ulsdec, ulassign, //unsigned long (8 byte)
fadd, fsub, fmul, fdiv, fgr, fsm, fgreq, fsmeq, feq, fnoteq, funmin, fassign,//float
dadd, dsub, dmul, ddiv, dgr, dsm, dgreq, dsmeq, deq, dnoteq, dunmin, dassign,//double
boolgr, boolsm, boolgreq, boolsmeq, booleq, boolnoteq, boolor, boolnot, boolxor, booland, boolassign, //boolean
chargr, charsm, chargreq, charsmeq, chareq, charnoteq, cinc, cdec, csinc, csdec, charassign, //char
chartous, chartoi, chartoui, chartol, chartoul, chartof, chartod, chartob, chartosb, chartos,
btos, btous, btoi, btoui, btol, btoul, btof, btod, btosb, btochar, //byte to ...
sbtos, sbtoi, sbtol, sbtof, sbtod, sbtob, sbtous, sbtoui, sbtoul, sbtochar,//signed byte to short, int, long, float, double
stoi, stol, stof, stod, stob, stosb, stous, stoui, stoul, stochar, //short to ...
ustoi, ustoui, ustol, ustoul, ustof, ustod, ustob, ustosb, ustos, ustochar, //unsigned short to ...
itol, itof, itod, itob, itosb, itos, itous, itoui, itoul, itochar, //integer to ...
uitol, uitoul, uitob, uitosb, uitos, uitous, uitoi, uitof, uitod, uitochar, //uint to ...
ltof, ltod, ltob, ltosb, ltos, ltous, ltoi, ltoui, ltoul, ltochar, //long to ...
ultob, ultosb, ultos, ultous, ultoi, ultoui, ultol, ultochar, ultof, ultod, //ulong to ...
ftod, ftob, ftosb, ftos, ftous, ftoi, ftoui, ftol, ftoul, ftochar, //float to ...
dtob, dtosb, dtos, dtous, dtoi, dtoui, dtol, dtoul, dtof, dtochar,
objassign, objeq, objnoteq, //присваивание и эквивалентность объектов по ссылке.
//write,writei,writed,writec,writeb,read,readi,readd,readc,readb,expd,absd,absi //temporary functions (Нужны только на начальном этапе отладки. Потом обязательно удалить.)
objtoobj, boolinc, booldec, boolsinc, boolsdec, booltoi, enumgr, enumgreq, enumsm, enumsmeq,
booltob, booltosb, booltos, booltous, booltoui, booltol, booltoul,
ltop, ptol
};
public enum runtime_statement_type { invoke_delegate, ctor_delegate, begin_invoke_delegate, end_invoke_delegate };
public enum generic_parameter_kind { gpk_none, gpk_class, gpk_value };
//Документ в котором описан этот узел.
public interface IDocument
{
//Полный путь к файлу.
string file_name
{
get;
}
}
//Документ и позиция в которой описан этот узел.
public interface ILocation
{
//Строка, в которой распологается начало данного элемента.
int begin_line_num
{
get;
}
//Столбец, в которой распологается начало данного элемента.
int begin_column_num
{
get;
}
//Строка, в которой распологается конец данного элемента.
int end_line_num
{
get;
}
//Столбец, в которой распологается конец данного элемента.
int end_column_num
{
get;
}
//Документ, в котором определен данный элемент дерева.
IDocument document
{
get;
}
}
public interface ILocated
{
ILocation Location
{
get;
}
}
//Базовый интерфейс для всех интерфейсов узлов дерева.
public interface ISemanticNode
{
void visit(ISemanticVisitor visitor);
}
//Базовый класс, для пердставления определений в программе (определений типов, переменных и т.д.). Никогда не создается.
public interface IDefinitionNode : ISemanticNode
{
string Documentation
{
get;
}
IAttributeNode[] Attributes
{
get;
}
}
//Базовый интерфейс для классов, которые описывают типы. Никогда не создается.
public interface ITypeNode : IDefinitionNode
{
//Вид узла - базовый(basic), обычный (common) или экспортируемый (compiled).
node_kind node_kind
{
get;
}
//Имя типа. Для языков не чувствительных к регистрам хранит имя в том виде, в каком тип объявлен.
string name
{
get;
}
//Базовый тип для данного типа. Для object-а =null.
ITypeNode base_type
{
get;
}
bool is_value_type
{
get;
}
bool is_nullable_type
{
get;
}
type_special_kind type_special_kind
{
get;
}
ITypeNode element_type
{
get;
}
//ssyy
bool is_class
{
get;
}
bool IsInterface
{
get;
//set;
}
bool IsAbstract
{
get;
}
bool IsEnum
{
get;
}
bool IsDelegate
{
get;
}
List<ITypeNode> ImplementingInterfaces
{
get;
}
//Является ли generic-параметром
bool is_generic_parameter
{
get;
}
bool is_generic_type_definition
{
get;
}
bool is_generic_type_instance
{
get;
}
//Зависит ли от некоторого неопределенного типа
bool depended_from_indefinite
{
get;
}
//Описание generic-типа, содержащее данный параметр
ICommonTypeNode generic_type_container
{
get;
}
ICommonFunctionNode common_generic_function_container
{
get;
}
//\ssyy
}
//Интерфейс для описания базовых типов.
//При генерации .Net кода этот класс не нужен. Он может пригодится, например для генерации машинного кода.
//Там он может быть использован, например для представления целых чисел.
//Хотя возможно в этом случае удобнее использовать compiled_type_node.
//Для него могут быть не определены свойства name и base_type.
//В общем когда понадобится, тогда и будем думать. Пока этот интерфейс нигде не должен использоваться.
public interface IBasicTypeNode : ITypeNode
{
}
public interface IUnsizedArray : ITypeNode
{
ITypeNode element_type
{
get;
}
}
//Синонимы типов, определяемые пользователем в программе.
public interface ITypeSynonym : IDefinitionNode, ILocated
{
//Имя типа. Для языков не чувствительных к регистрам хранит имя в том виде, в каком тип объявлен.
string name
{
get;
}
//Тип, которому даётся синоним
ITypeNode original_type
{
get;
}
}
public interface ITemplateClass : IDefinitionNode
{
byte[] serialized_tree
{
get;
}
string name
{
get;
}
}
//Интерфейс для generic-типов
public interface IGenericInstance
{
List<ITypeNode> generic_parameters
{
get;
}
}
//Интерфейс для generic-инстанций
public interface IGenericTypeInstance: IGenericInstance, ICommonTypeNode
{
ITypeNode original_generic
{
get;
}
System.Collections.Hashtable used_members
{
get;
}
}
public interface ICommonGenericTypeInstance : IGenericTypeInstance
{
}
public interface ICompiledGenericTypeInstance : IGenericTypeInstance
{
}
public interface IGenericFunctionInstance : IGenericInstance, ICommonFunctionNode
{
IFunctionNode original_function
{
get;
}
}
public interface ICompiledGenericMethodInstance : IGenericFunctionInstance, ICommonMethodNode
{
}
//Описывет обычные типы, определяемые пользователем в программе.
public interface ICommonTypeNode : ITypeNode, INamespaceMemberNode, ILocated
{
bool IsSealed
{
get;
}
//Тип public или internal.
type_access_level type_access_level
{
get;
}
//Методы типа.
ICommonMethodNode[] methods
{
get;
}
//Поля типа.
ICommonClassFieldNode[] fields
{
get;
}
//Свойства типа.
ICommonPropertyNode[] properties
{
get;
}
//Константы, определенные в типе.
IClassConstantDefinitionNode[] constants
{
get;
}
ICommonEventNode[] events
{
get;
}
IPropertyNode default_property
{
get;
}
IConstantNode lower_value
{
get;
}
IConstantNode upper_value
{
get;
}
ICommonMethodNode static_constructor
{
get;
}
int rank
{
get;
}
//(ssyy) Является ли описанием generic-типа
bool is_generic_type_definition
{
get;
}
List<ICommonTypeNode> generic_params
{
get;
}
ICommonClassFieldNode runtime_initialization_marker
{
get;
}
bool has_static_constructor
{
get;
}
}
//Интерфейс для описания типов, экспортируемых из сборки.
//Для представления откомпилированных типов я обращаюсь непосредственно к System.Reflection.
//Это завязывает нашу систему на .Net. Можно избавится от этого с помощью введения дополнительного уровня абстракции.
//Для этого нужно определить, какие данные нам нужны от откомпилированных типов, и сделать еще одну прослойку
//между System.Reflection и нашими типами. Тогда при генерации кода под другую платформу (например машинного кода)
//нужно будет только привязать прослойку к другому источнику данных. Например, информация о типах будет
//браться не из сборок, а из dll-библиотек. Я не могу сейчас сделать эту прослойку, т.к. я пока не определил
//какие запросы нужны к откомпилированным модулям. Поэтому пока я использую System.Reflection в котором
//вроде все есть. Потом нужно будет обсудить вопрос создания этой прослойки.
public interface ICompiledTypeNode : ITypeNode
{
//Откомпилированный тип.
System.Type compiled_type
{
get;
}
int rank
{
get;
}
}
//Интерфейс, представляющий индексируемый с 0 массив.
public interface IRefTypeNode : ITypeNode
{
ITypeNode pointed_type
{
get;
}
}
public interface IShortStringTypeNode : ITypeNode
{
int Length
{
get;
}
}
public interface ISimpleArrayNode : ITypeNode
{
int length
{
get;
}
ITypeNode element_type
{
get;
}
}
public interface ISimpleArrayIndexingNode : IAddressedExpressionNode
{
IExpressionNode array
{
get;
}
IExpressionNode[] indices
{
get;
}
IExpressionNode index
{
get;
}
}
//Базовый интерфейс для statement-ов. Объекты, реализующие только этот интерфейс нигде не должны создаваться.
//Должны создаваться классы, реализующие интерфейсы производные от данного интерфейса.
//Звучит очень запутано, но вобщем то, что написано выше не очень важно :-).
public interface IStatementNode : ISemanticNode, ILocated
{
}
public interface IRuntimeManagedMethodBody : IStatementNode
{
runtime_statement_type runtime_statement_type
{
get;
}
}
//Базовый интерфейс для выражений.
public interface IExpressionNode : IStatementNode
{
//Тип выражения.
ITypeNode type
{
get;
}
ITypeNode conversion_type
{
get;
}
}
//Базовый интерфейс для вызовов функций. Нигде не создается.
public interface IFunctionCallNode : IExpressionNode
{
//Список фактических параметров. Количество и типы формальных и фактических параметров сверяется
//на этапе построения семантического дерева. При необходимости при построении семантического дерева
//вставляются узлы преобрызования типов.
IExpressionNode[] real_parameters
{
get;
}
//Вызываемый метод.
IFunctionNode function
{
get;
}
//ssyy
//Нужно для генерации унаследованных интерфейсных функций
bool last_result_function_call
{
get;
set;
}
//\ssyy
}
//Вызов базового метода.
public interface IBasicFunctionCallNode : IFunctionCallNode
{
//Вызываемый метод.
IBasicFunctionNode basic_function
{
get;
}
}
public interface INonStaticMethodCallNode : IFunctionCallNode
{
bool virtual_call
{
get;
set;
}
}
//Вызов функции, определенной в пространстве имен.
public interface ICommonNamespaceFunctionCallNode : IFunctionCallNode
{
//Вызываемый метод.
ICommonNamespaceFunctionNode namespace_function
{
get;
}
}
//Вызов функции, определенной в другой функции.
public interface ICommonNestedInFunctionFunctionCallNode : IFunctionCallNode
{
//Вызываемый метод.
ICommonNestedInFunctionFunctionNode common_function
{
get;
}
//Статическая глубина вложенной функции.
int static_depth
{
get;
}
}
//Вызов метода класса.
public interface ICommonMethodCallNode : INonStaticMethodCallNode
{
//Вызываемый метод.
ICommonMethodNode method
{
get;
}
//Экземпляр класса, данный метод которого нужно вызвать.
IExpressionNode obj
{
get;
}
}
//Узел, соответствующий указателю this в программе.
public interface IThisNode : IExpressionNode
{
}
public interface IAsNode : IExpressionNode
{
IExpressionNode left
{
get;
}
ITypeNode right
{
get;
}
}
public interface IIsNode : IExpressionNode
{
IExpressionNode left
{
get;
}
ITypeNode right
{
get;
}
}
public interface ISizeOfOperator : IExpressionNode
{
ITypeNode oftype
{
get;
}
}
public interface ITypeOfOperator : IExpressionNode
{
ITypeNode oftype
{
get;
}
}
//Вызов статичекого метода класса.
public interface ICommonStaticMethodCallNode : IFunctionCallNode
{
//Вызываемый метод.
ICommonMethodNode static_method
{
get;
}
//Тип, статический метод которого вызываем.
ICommonTypeNode common_type
{
get;
}
}
//Вызов конструктора common-класса.
public interface ICommonConstructorCall : ICommonStaticMethodCallNode
{
//ssyy
bool new_obj_awaited();
//\ssyy
}
//Вызов откомпилированного метода.
public interface ICompiledMethodCallNode : INonStaticMethodCallNode
{
//Вызываемый метод.
ICompiledMethodNode compiled_method
{
get;
}
//Экземпляр класса, данный метод которого нужно вызвать.
IExpressionNode obj
{
get;
}
}
//Вызов статического метода, откомптлированного класса.
public interface ICompiledStaticMethodCallNode : IFunctionCallNode
{
//Вызываемый метод.
ICompiledMethodNode static_method
{
get;
}
//Тип, статический метод которого мы вызываем.
ICompiledTypeNode compiled_type
{
get;
}
ITypeNode[] template_parametres
{
get;
}
}
//Вызов конструктора откомпилированного метода.
public interface ICompiledConstructorCall : IFunctionCallNode
{
ICompiledConstructorNode constructor
{
get;
}
ICompiledTypeNode compiled_type
{
get;
}
//ssyy
bool new_obj_awaited();
//\ssyy
}
//Базовый интерфейс для описания функций. Никогда не создается.
public interface IFunctionNode : IDefinitionNode
{
//Вид узла - базовый (basic), обычный (common) или экспортируемый (compiled).
node_kind node_kind
{
get;
}
//Список формальных параметров функции.
IParameterNode[] parameters
{
get;
}
//Тип возвращаемого значения функции.
ITypeNode return_value_type
{
get;
}
//Имя функции. Для языков не чувствительных к регистру - в том виде, в котором функция определена.
string name
{
get;
}
//Расположение функции - в функции, в классе, в пространстве имен.
node_location_kind node_location_kind
{
get;
}
//Является ли generic-функцией
bool is_generic_function
{
get;
}
//Число типов-параметров generic-функции. 0 для не-generic.
int generic_parameters_count
{
get;
}
}
//Интерфейс члена класса.
public interface IClassMemberNode
{
//Тип, содержащий этот член класса.
ITypeNode comperehensive_type
{
get;
}
//Статический, обычный или виртуальный метод.
polymorphic_state polymorphic_state
{
get;
}
//Уровень доступа к члену класса.
field_access_level field_access_level
{
get;
}
}
//Интерфейс члена откомпилированного класса.
public interface ICompiledClassMemberNode : IClassMemberNode
{
//Тип, содержащий член класса.
ICompiledTypeNode comprehensive_type
{
get;
}
}
//Интерфейс члена обычного класса.
public interface ICommonClassMemberNode : IClassMemberNode
{
//Тип, содержащий член класса.
ICommonTypeNode common_comprehensive_type
{
get;
}
}
//Интерфейс переменной или функции, определенной внутри функции.
public interface IFunctionMemberNode
{
//Функция, содержащая этот обьъект.
ICommonFunctionNode function
{
get;
}
}
//Интерфейс переменной или функции, определенной в пространстве имен.
public interface INamespaceMemberNode
{
//Пространство имен, в котором определен элемент.
ICommonNamespaceNode comprehensive_namespace
{
get;
}
}
//Класс для описания базовых, нигде не определенных функций (например, сложение двух целых чисел).
public interface IBasicFunctionNode : IFunctionNode
{
//Какая именно это базовая функция.
basic_function_type basic_function_type
{
get;
}
}
public enum SpecialFunctionKind
{
None, New, Dispose, NewArray
}
//Интерфейс для описания функции, определяемой пользователем.
public interface ICommonFunctionNode : IFunctionNode, ILocated
{
SpecialFunctionKind SpecialFunctionKind
{
get;
}
bool is_overload
{
get;
}
//Список переменных, определяемых в функции.
ILocalVariableNode[] var_definition_nodes
{
get;
}
//Список вложенных функций.
ICommonNestedInFunctionFunctionNode[] functions_nodes
{
get;
}
//Код функции.
IStatementNode function_code
{
get;
}
//Переменная, которая содержит возвращаемое значение функции. Для процедур - null.
ILocalVariableNode return_variable
{
get;
}
//Константы, определенные в функции.
ICommonFunctionConstantDefinitionNode[] constants
{
get;
}
//Generic-параметры функции
List<ICommonTypeNode> generic_params
{
get;
}
}
//Функция, определенная непосредственно в пространстве имен.
public interface ICommonNamespaceFunctionNode : ICommonFunctionNode, INamespaceMemberNode
{
//Прстранство имен, в котором определена эта функция.
ICommonNamespaceNode namespace_node
{
get;
}
ITypeNode ConnectedToType
{
get;
}
}
//Функция, определенная в другой функции.
public interface ICommonNestedInFunctionFunctionNode : ICommonFunctionNode, IFunctionMemberNode
{
}
//Метод класса, определяемый пользователем.
public interface ICommonMethodNode : ICommonFunctionNode, ICommonClassMemberNode
{
bool is_constructor
{
get;
}
IFunctionNode overrided_method
{
get;
}
bool is_final
{
get;
set;
}
bool newslot_awaited
{
get;
set;
}
}
//Класс для описания экспортируемых (compiled) функций.
public interface ICompiledMethodNode : IFunctionNode, ICompiledClassMemberNode
{
//Откомпилированный метод.
System.Reflection.MethodInfo method_info
{
get;
}
bool is_extension
{
get;
}
}
//Вызов конструктора откомпилированного типа.
public interface ICompiledConstructorNode : IFunctionNode, ICompiledClassMemberNode
{
System.Reflection.ConstructorInfo constructor_info
{
get;
}
}
//Интерфейс для описания конструкции if.
public interface IIfNode : IStatementNode
{
//Условие.
IExpressionNode condition
{
get;
}
//Тело then.
IStatementNode then_body
{
get;
}
//Тело else. Если if без then это свойство = null.
IStatementNode else_body
{
get;
}
}
//Интерфейс для конструкции while.
public interface IWhileNode : IStatementNode
{
//Условие.
IExpressionNode condition
{
get;
}
//Тело while.
IStatementNode body
{
get;
}
}
//Интерфейс для конструкции repeat.
public interface IRepeatNode : IStatementNode
{
//Тело do .. while (repeat .. until).
IStatementNode body
{
get;
}
//Условие.
IExpressionNode condition
{
get;
}
}
//Класс для описания конструкции for.
//For - C++/C# - овский. Для моделирования паскалевского for он преобразуется в эту конструкцию.
public interface IForNode : IStatementNode
{
//Инициализация переменных цикла.
IStatementNode initialization_statement
{
get;
}
//Условие продолжения цикла.
IExpressionNode while_expr
{
get;
}
IExpressionNode init_while_expr
{
get;
}
//Изменение счетчиков цикла.
IStatementNode increment_statement
{
get;
}
//Тело цикла.
IStatementNode body
{
get;
}
bool IsBoolCycle
{
get;
}
}
public interface IWhileBreakNode : IStatementNode
{
IWhileNode while_node
{
get;
}
}
public interface IRepeatBreakNode : IStatementNode
{
IRepeatNode repeat_node
{
get;
}
}
public interface IForBreakNode : IStatementNode
{
IForNode for_node
{
get;
}
}
public interface IForeachBreakNode : IStatementNode
{
IForeachNode foreach_node
{
get;
}
}
public interface IExitProcedure : IStatementNode
{
}
public interface IWhileContinueNode : IStatementNode
{
IWhileNode while_node
{
get;
}
}
public interface IRepeatContinueNode : IStatementNode
{
IRepeatNode repeat_node
{
get;
}
}
public interface IForContinueNode : IStatementNode
{
IForNode for_node
{
get;
}
}
public interface IForeachContinueNode : IStatementNode
{
IForeachNode foreach_node
{
get;
}
}
public interface IExternalStatementNode : IStatementNode
{
string module_name
{
get;
}
string name
{
get;
}
}
public interface IPInvokeStatementNode : IStatementNode
{
}
public interface ISwitchNode : IStatementNode
{
IExpressionNode case_expression
{
get;
}
ICaseVariantNode[] case_variants
{
get;
}
IStatementNode default_statement
{
get;
}
}
public interface ICaseVariantNode : IStatementNode
{
IIntConstantNode[] elements
{
get;
}
ICaseRangeNode[] ranges
{
get;
}
IStatementNode statement_to_execute
{
get;
}
}
public interface ICaseRangeNode : IStatementNode
{
IIntConstantNode lower_bound
{
get;
}
IIntConstantNode high_bound
{
get;
}
}
/*// switch.
public interface ISwitchNode : IStatementNode
{
}
//Один из вариантов констракции swithc.
public interface ICaseVariantNode : IStatementNode
{
//Выражения, при которых нужно исполгить код, соответствующий этому узлу.
IExpressionNode[] expressions
{
get;
}
//Диапазоны, при попадании в которые нужно исполнить код, соответствующий этому узлу.
IRangExpression[] ranges
{
get;
}
//Код этого узла.
IStatementNode statement
{
get;
}
}
public interface IRangeExpression : IExpressionNode
{
IExpressionNode lower_bound
{
get;
}
IExpressionNode upper_bound
{
get;
}
}*/
//Интерфейс для описания списка statement-ов.
public interface IStatementsListNode : IStatementNode
{
ILocalBlockVariableNode[] LocalVariables
{
get;
}
//Список statement-ов.
IStatementNode[] statements
{
get;
}
//Положение левой логической скобки
ILocation LeftLogicalBracketLocation
{
get;
}
//Положение правой логической скобки
ILocation RightLogicalBracketLocation
{
get;
}
}
public interface IThrowNode : IStatementNode
{
IExpressionNode exception_expresion
{
get;
}
}
public interface ITryBlockNode : IStatementNode
{
IStatementNode TryStatements
{
get;
}
IStatementNode FinallyStatements
{
get;
}
IExceptionFilterBlockNode[] ExceptionFilters
{
get;
}
}
public interface IExceptionFilterBlockNode : IStatementNode
{
ITypeNode ExceptionType
{
get;
}
ILocalBlockVariableReferenceNode ExceptionInstance
{
get;
}
IStatementNode ExceptionHandler
{
get;
}
}
/*
public interface ICatchNode : IStatementNode
{
ISemanticNode[] catch_body
{
get;
}
}
public interface ITryStatementNode : IStatementNode
{
IStatementNode[] try_body
{
get;
}
}
*/
//Узел пространства имен.
public interface INamespaceNode : IDefinitionNode
{
string namespace_name
{
get;
}
}
//Узел пространства имен, определенного пользователем.
public interface ICommonNamespaceNode : INamespaceNode, ILocated
{
//Пространства имен, вложенные в это пространство имен.
ICommonNamespaceNode[] nested_namespaces
{
get;
}
//Пространство имен, в которое вложенно это пространство имен.
INamespaceNode comprehensive_namespace
{
get;
}
//Типы, описанные в namespace.
ICommonTypeNode[] types
{
get;
}
ITypeSynonym[] type_synonims
{
get;
}
ITemplateClass[] templates
{
get;
}
//Переменные, описанные в этом namespace.
ICommonNamespaceVariableNode[] variables
{
get;
}
//Функции, описанные в namespace.
ICommonNamespaceFunctionNode[] functions
{
get;
}
//Константы, описанные в namespace. Они должны экспортироваться как нибудь.
INamespaceConstantDefinitionNode[] constants
{
get;
}
ICommonNamespaceEventNode[] events
{
get;
}
bool IsMain
{
get;
}
}
//Откомпилированное пространство имен.
public interface ICompiledNamespaceNode : INamespaceNode
{
}
/// Базовый интерфейс для программ и dll.
public interface IProgramBase : IDefinitionNode, ILocated
{
//Пространства имен, содержащиеся в программе или dll.
ICommonNamespaceNode[] namespaces
{
get;
}
string[] UsedNamespaces
{
get;
}
}
//Узел dll библиотеки.
public interface IDllNode : IProgramBase
{
//Метод инициализации dll.
ICommonNamespaceFunctionNode initialization_function
{
get;
}
//Метод финализации dll.
ICommonNamespaceFunctionNode finalization_function
{
get;
}
}
//Корневой узел программы.
public interface IProgramNode : IProgramBase
{
//Главная функция. Ее выполнение равносильно выполнению программы.
//Она включает вызовы методов инициализации модулей (в начале), выполнение основной программы
//и вызовы методов финализации модулей.
ICommonNamespaceFunctionNode main_function
{
get;
}
//Инстанции generic-типов, использующиеся в программе.
List<IGenericTypeInstance> generic_type_instances
{
get;
}
//Инстанции generic-типов, использующиеся в программе.
List<IGenericFunctionInstance> generic_function_instances
{
get;
}
IStatementNode InitializationCode
{
get;
}
}
//Тип выражений, которые могут возвращать адрес (например переменная).
public interface IAddressedExpressionNode : IExpressionNode
{
}
//Оператор return.
public interface IReturnNode : IStatementNode
{
IExpressionNode return_value
{
get;
}
}
//ssyy добавил
//Оператор return из .ctor.
/*public interface ICtorReturnNode : IStatementNode
{
}*/
//\ssyy
public interface IReferenceNode : IAddressedExpressionNode
{
//Определение локальной переменной.
IVAriableDefinitionNode Variable
{
get;
}
}
//Интерфейс, представляющий обращение к локальной переменной в теле программы.
public interface ILocalVariableReferenceNode : IReferenceNode
{
//Определение локальной переменной.
ILocalVariableNode variable
{
get;
}
//Разность статических глубин, между определением и вхождением.
int static_depth
{
get;
}
}
//Интерфейс, представляющий обращение к локальной переменной в блоке.
public interface ILocalBlockVariableReferenceNode : IReferenceNode
{
//Определение локальной переменной.
ILocalBlockVariableNode Variable
{
get;
}
}
//Интерфейс, представляющий обращение к переменной, определенной непосредственно в namespace.
public interface INamespaceVariableReferenceNode : IReferenceNode
{
//Переменная.
ICommonNamespaceVariableNode variable
{
get;
}
}
//Интерфейс, представляющий обращение к полю класса.
public interface ICommonClassFieldReferenceNode : IReferenceNode
{
//Поле класса.
ICommonClassFieldNode field
{
get;
}
//Объект класса.
IExpressionNode obj
{
get;
}
}
//Интерфейс, представляющий обращение к статическому полю класса.
public interface IStaticCommonClassFieldReferenceNode : IReferenceNode
{
//Статическое поле класса.
ICommonClassFieldNode static_field
{
get;
}
//Класс, к статическому методу которого мы обращаемся.
ICommonTypeNode class_type
{
get;
}
}
//Обращение к полю откомпилированного класса.
public interface ICompiledFieldReferenceNode : IReferenceNode
{
//Поле класса.
ICompiledClassFieldNode field
{
get;
}
//Объект класса.
IExpressionNode obj
{
get;
}
}
//Интерфейс, представляющий обращение к статическому полю откомпилированного класса.
public interface IStaticCompiledFieldReferenceNode : IReferenceNode
{
//Поле класса.
ICompiledClassFieldNode static_field
{
get;
}
//Класс, к статическому полю которого мы обращаемся.
ICompiledTypeNode class_type
{
get;
}
}
//Обращение к параметру метода.
public interface ICommonParameterReferenceNode : IReferenceNode
{
//Параметр метода, к которому мы обращаемся.
ICommonParameterNode parameter
{
get;
}
//Разность статических глубин, между обращением к параметру и методом в котором он объявлен.
int static_depth
{
get;
}
}
//Базовый узел для представления констант в теле программы (не именованных констант, а чисел, строк и т.д.).
public interface IConstantNode : IExpressionNode
{
object value
{
get;
}
}
//Интерфейс для представления булевских констант.
public interface IBoolConstantNode : IConstantNode
{
//Значение константы.
bool constant_value
{
get;
}
}
//Интерфейс для представления byte констант.
public interface IByteConstantNode : IConstantNode
{
//Значение константы.
byte constant_value
{
get;
}
}
//Интерфейс для представления signed byte констант.
public interface ISByteConstantNode : IConstantNode
{
//Значение константы.
sbyte constant_value
{
get;
}
}
//Интерфейс для представления signed short констант.
public interface IShortConstantNode : IConstantNode
{
//Значение константы.
short constant_value
{
get;
}
}
//Интерфейс для представления unsigned short констант.
public interface IUShortConstantNode : IConstantNode
{
//Значение константы.
ushort constant_value
{
get;
}
}
//Интерфейс для представления int констант.
public interface IIntConstantNode : IConstantNode
{
//Значение константы.
int constant_value
{
get;
}
}
//Интерфейс для представления unsigned int констант.
public interface IUIntConstantNode : IConstantNode
{
//Значение константы.
uint constant_value
{
get;
}
}
//Интерфейс для представления long констант.
public interface ILongConstantNode : IConstantNode
{
//Значение константы.
long constant_value
{
get;
}
}
//Интерфейс для представления unsigned long констант.
public interface IULongConstantNode : IConstantNode
{
//Значение константы.
ulong constant_value
{
get;
}
}
//Интерфейс для представления float констант.
public interface IFloatConstantNode : IConstantNode
{
//Значение константы.
float constant_value
{
get;
}
}
//Интерфейс для представления double констант.
public interface IDoubleConstantNode : IConstantNode
{
//Значение константы.
double constant_value
{
get;
}
}
//Интерфейс для представления char констант (этот класс для 2-байтных char - widechar в delphi).
public interface ICharConstantNode : IConstantNode
{
//Значение константы.
char constant_value
{
get;
}
}
//Интерфейс для представления string-констант.
public interface IStringConstantNode : IConstantNode
{
//Значение константы.
string constant_value
{
get;
}
}
public interface IEnumConstNode : IConstantNode
{
int constant_value
{
get;
}
}
public interface IArrayConstantNode : IConstantNode
{
IConstantNode[] ElementValues
{
get;
}
ITypeNode ElementType
{
get;
}
}
public interface IArrayInitializer : IExpressionNode
{
IExpressionNode[] ElementValues
{
get;
}
ITypeNode ElementType
{
get;
}
}
public interface IRecordConstantNode : IConstantNode
{
IConstantNode[] FieldValues
{
get;
}
}
public interface IRecordInitializer : IExpressionNode
{
IExpressionNode[] FieldValues
{
get;
}
}
public interface ICompiledStaticMethodCallNodeAsConstant : IConstantNode
{
ICompiledStaticMethodCallNode MethodCall
{
get;
}
}
public interface ICompiledStaticFieldReferenceNodeAsConstant : IConstantNode
{
IStaticCompiledFieldReferenceNode FieldReference
{
get;
}
}
public interface ICommonNamespaceFunctionCallNodeAsConstant : IConstantNode
{
ICommonNamespaceFunctionCallNode MethodCall
{
get;
}
}
public interface IBasicFunctionCallNodeAsConstant : IConstantNode
{
IBasicFunctionCallNode MethodCall
{
get;
}
}
public interface IDefaultOperatorNodeAsConstant : IConstantNode
{
IDefaultOperatorNode DefaultOperator
{
get;
}
}
public interface ITypeOfOperatorAsConstant : IConstantNode
{
ITypeOfOperator TypeOfOperator
{
get;
}
}
public interface ICompiledConstructorCallAsConstant : IConstantNode
{
ICompiledConstructorCall MethodCall
{
get;
}
}
/*public interface IClassConstantNode : IConstantNode
{
}*/
/*//Узел для представления оператора присваивания.
public interface IAssignNode : IExpressionNode
{
//Чему присваиванием.
IAddressedExpressionNode to
{
get;
}
//Что присваиваем.
IExpressionNode from
{
get;
}
}*/
//Базовй интерфейс для формальных параметров функций, локальных переменных, глобальных переменных программы и модуля и полей класса. Нигде не создается.
public interface IVAriableDefinitionNode : IDefinitionNode
{
//Имя переменной.
string name
{
get;
}
//Тип переменной.
ITypeNode type
{
get;
}
IExpressionNode inital_value
{
get;
}
//Раположение переменной.
node_location_kind node_location_kind
{
get;
}
}
//Интерфейс для описания локальных переменных.
public interface ILocalVariableNode : IVAriableDefinitionNode, IFunctionMemberNode, ILocated
{
//Используется, ли переменная во вложенных функчиях. Исрользуется для оптимизации.
bool is_used_as_unlocal
{
get;
}
}
//Интерфейс для описания локальных переменных.
public interface ILocalBlockVariableNode : IVAriableDefinitionNode, ILocated
{
IStatementsListNode Block
{
get;
}
}
//Интерфейс, представляющий глобальную переменную, описанную в модуле или программе.
public interface ICommonNamespaceVariableNode : IVAriableDefinitionNode, INamespaceMemberNode, ILocated
{
}
//Интерфейс для описания полей класса.
public interface ICommonClassFieldNode: IVAriableDefinitionNode, ICommonClassMemberNode, ILocated
{
}
//Переменная, определенная в откомпилированном классе.
public interface ICompiledClassFieldNode : IVAriableDefinitionNode, ICompiledClassMemberNode
{
System.Reflection.FieldInfo compiled_field
{
get;
}
}
//Базовый интерфейс для интерфейсов, представляющих параметры базовых, обычных и откомпилированных функций.
public interface IParameterNode : IVAriableDefinitionNode
{
//Тип параметра.
parameter_type parameter_type
{
get;
}
//Функция, в которой описан этот праметр.
IFunctionNode function
{
get;
}
bool is_params
{
get;
}
bool is_const
{
get;
}
IExpressionNode default_value
{
get;
}
}
//Интерфейс для представления параметров common функций.
public interface ICommonParameterNode : IParameterNode, ILocated
{
//Функция, в которой определен параметер.
ICommonFunctionNode common_function
{
get;
}
//Используется ли параметр во вложенных функциях.
bool is_used_as_unlocal
{
get;
}
}
//Интерфейс, представляющий параметры базовых функций.
public interface IBasicParameterNode : IParameterNode
{
}
//Интерфейс, представляющий параметры откомпилироанных функций.
public interface ICompiledParameterNode : IParameterNode
{
//Функция, в которой определен параметер.
ICompiledMethodNode compiled_function
{
get;
}
}
//Интерфейс, описывающий определение константы.
public interface IConstantDefinitionNode : IDefinitionNode
{
//Имя константы.
string name
{
get;
}
//Тип константы.
ITypeNode type
{
get;
}
//Значение константы.
IConstantNode constant_value
{
get;
}
}
//Константа, определенная в классе.
public interface IClassConstantDefinitionNode : IConstantDefinitionNode, IClassMemberNode, ILocated
{
}
public interface ICompiledClassConstantDefinitionNode : IConstantDefinitionNode, IClassMemberNode
{
ICompiledTypeNode comprehensive_type
{
get;
}
}
//Константа, определенная в пространстве имен.
public interface INamespaceConstantDefinitionNode : IConstantDefinitionNode, ILocated
{
ICommonNamespaceNode comprehensive_namespace
{
get;
}
}
//Константа, определенная в функции.
public interface ICommonFunctionConstantDefinitionNode : IConstantDefinitionNode, ILocated
{
ICommonFunctionNode comprehensive_function
{
get;
}
}
//Константа, определенная в откомпилированном типе.
public interface ICompiledConstantNode : IConstantDefinitionNode
{
ICompiledTypeNode comprehensive_type
{
get;
}
}
//Узел, описывающий свойство класса. Никогда не создается.
public interface IPropertyNode : IDefinitionNode
{
//Вид объекта (basic, common, compiled).
node_kind node_kind
{
get;
}
//Имя свойства.
string name
{
get;
}
//Тип, который содержит это свойство.
ITypeNode comprehensive_type
{
get;
}
//Тип свойства.
ITypeNode property_type
{
get;
}
//Функция, которая возвращает значение свойства.
IFunctionNode get_function
{
get;
}
//Функция, которая устанавливает значение свойства.
IFunctionNode set_function
{
get;
}
IParameterNode[] parameters
{
get;
}
}
//Определяемое пользователем свойство.
public interface ICommonPropertyNode : IPropertyNode, ICommonClassMemberNode, ILocated
{
//Тип, который содержит это свойство.
/*ICommonTypeNode common_comprehensive_type
{
get;
}*/
//Функция, которая возвращает значение свойства.
/*ICommonClassMemberNode get_common_function
{
get;
}
//Функция, которая устанавливает значение свойства.
ICommonClassMemberNode set_common_function
{
get;
}*/
}
//Базовое свойство. Пока нигде не нужно, но для реализации машинного кода может очень пригодится.
public interface IBasicPropertyNode : IPropertyNode
{
}
//Свойство в откомпилированном типе.
public interface ICompiledPropertyNode : IPropertyNode, ICompiledClassMemberNode
{
//Свойство в сборке.
System.Reflection.PropertyInfo property_info
{
get;
}
//Тип, который содержит это свойство.
ICompiledTypeNode compiled_comprehensive_type
{
get;
}
//Функция, которая возвращает значение свойства.
ICompiledMethodNode compiled_get_method
{
get;
}
//Функция, которая устанавливает значение свойства.
ICompiledMethodNode compiled_set_method
{
get;
}
}
public interface IGetAddrNode : IExpressionNode
{
IExpressionNode addr_of_expr
{
get;
}
}
public interface IDereferenceNode : IAddressedExpressionNode
{
IExpressionNode derefered_expr
{
get;
}
}
public interface INullConstantNode : IConstantNode
{
}
public interface IStatementsExpressionNode : IExpressionNode
{
IStatementNode[] statements
{
get;
}
IExpressionNode expresion
{
get;
}
}
public interface IQuestionColonExpressionNode : IExpressionNode
{
IExpressionNode condition
{
get;
}
IExpressionNode ret_if_true
{
get;
}
IExpressionNode ret_if_false
{
get;
}
}
public interface IDoubleQuestionColonExpressionNode : IExpressionNode
{
IExpressionNode condition
{
get;
}
IExpressionNode ret_if_null
{
get;
}
}
public interface ILabelNode : IDefinitionNode, ILocated
{
//Имя метки. Для языков не чувствительных к регистрам хранит имя в том виде, в каком тип объявлен.
string name
{
get;
}
//встречена ли метка в коде
/*bool is_defined
{
get;
set;
}*/
}
public interface ILabeledStatementNode : IStatementNode, ILocated
{
//Метка, которой помечен statement
ILabelNode label
{
get;
}
//Сама инструкция
IStatementNode statement
{
get;
}
}
public interface IGotoStatementNode : IStatementNode, ILocated
{
//Метка, на которую происходит переход
ILabelNode label
{
get;
}
}
public interface IForeachNode : IStatementNode, ILocated
{
IVAriableDefinitionNode VarIdent
{
get;
}
IExpressionNode InWhatExpr
{
get;
}
IStatementNode Body
{
get;
}
}
public interface ILockStatement : IStatementNode, ILocated
{
IExpressionNode LockObject
{
get;
}
IStatementNode Body
{
get;
}
}
public interface IRethrowStatement : IStatementNode, ILocated
{
}
public interface INamespaceConstantReference : IConstantNode, ILocated
{
INamespaceConstantDefinitionNode Constant
{
get;
}
}
public interface IFunctionConstantReference : IConstantNode, ILocated
{
ICommonFunctionConstantDefinitionNode Constant
{
get;
}
}
public interface IFunctionConstantDefinitionNode : IConstantDefinitionNode, ILocated
{
ICommonFunctionNode function
{
get;
}
}
public interface ICommonConstructorCallAsConstant : IConstantNode, ILocated
{
ICommonConstructorCall ConstructorCall
{
get;
}
}
public interface IEventNode : IDefinitionNode
{
}
public interface ICompiledEventNode : IEventNode
{
System.Reflection.EventInfo CompiledEvent
{
get;
}
}
public interface ICommonEventNode : IDefinitionNode, IEventNode, ICommonClassMemberNode, ILocated
{
string Name
{
get;
}
ITypeNode DelegateType
{
get;
}
ICommonMethodNode AddMethod
{
get;
}
ICommonMethodNode RemoveMethod
{
get;
}
ICommonMethodNode RaiseMethod
{
get;
}
ICommonClassFieldNode Field
{
get;
}
bool IsStatic
{
get;
}
}
public interface ICommonNamespaceEventNode : IDefinitionNode, IEventNode, ILocated
{
string Name
{
get;
}
ITypeNode DelegateType
{
get;
}
ICommonNamespaceFunctionNode AddFunction
{
get;
}
ICommonNamespaceFunctionNode RemoveFunction
{
get;
}
ICommonNamespaceFunctionNode RaiseFunction
{
get;
}
ICommonNamespaceVariableNode Field
{
get;
}
}
public interface IStaticEventReference : IAddressedExpressionNode
{
IEventNode Event
{
get;
}
}
public interface INonStaticEventReference : IStaticEventReference
{
IExpressionNode obj
{
get;
}
}
public interface IDefaultOperatorNode : IExpressionNode
{
}
public interface IAttributeNode : ISemanticNode, ILocated
{
IFunctionNode AttributeConstructor
{
get;
}
attribute_qualifier_kind qualifier
{
get;
}
ITypeNode AttributeType
{
get;
}
IConstantNode[] Arguments
{
get;
}
IPropertyNode[] PropertyNames
{
get;
}
IConstantNode[] PropertyInitializers
{
get;
}
IVAriableDefinitionNode[] FieldNames
{
get;
}
IConstantNode[] FieldInitializers
{
get;
}
}
public interface ILambdaFunctionNode : IExpressionNode
{
//Вид узла - базовый (basic), обычный (common) или экспортируемый (compiled).
node_kind node_kind
{
get;
}
//Список формальных параметров функции.
IParameterNode[] parameters
{
get;
}
//Тип возвращаемого значения функции.
ITypeNode return_value_type
{
get;
}
IStatementNode body
{
get;
}
IFunctionNode function
{
get;
}
//Расположение функции - в функции, в классе, в пространстве имен.
node_location_kind node_location_kind
{
get;
}
//Является ли generic-функцией
bool is_generic_function
{
get;
}
//Число типов-параметров generic-функции. 0 для не-generic.
int generic_parameters_count
{
get;
}
}
public interface ILambdaFunctionCallNode : IExpressionNode
{
//Список фактических параметров. Количество и типы формальных и фактических параметров сверяется
//на этапе построения семантического дерева. При необходимости при построении семантического дерева
//вставляются узлы преобрызования типов.
IExpressionNode[] parameters
{
get;
}
//Вызываемый метод.
ILambdaFunctionNode lambda
{
get;
}
}
/*public interface ICompiledFunctionNode : IFunctionNode
{
string test
{
get;
}
}*/
}