2019-07-28 23:53:15 +03:00
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
2015-06-02 23:06:57 +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.Generic ;
namespace PascalABCCompiler.SemanticTree
{
2015-12-28 14:25:15 +03:00
//Вид объекта.
//basic-базовый объект, не определяемый в программе, например метод сложения двух целых чисел.
//common-обычный тип, метод и т.д., определяемый пользователем.
//compiled-тип, метод или другой узел, определяемый пользователем.
2015-05-14 22:35:07 +03:00
public enum node_kind { basic , common , compiled , indefinite } ;
2015-12-28 14:25:15 +03:00
//Уровень доступа класса. Хотя зачем я это пишу? И так понятно из названия.
2015-05-14 22:35:07 +03:00
public enum type_access_level { tal_public , tal_internal } ;
2015-12-28 14:25:15 +03:00
//Как мы будем представлять ссылочные и размерные типы?
2015-05-14 22:35:07 +03:00
//public enum reference_or_value_type {reference_type,value_type};
2015-12-28 14:25:15 +03:00
//Расположение элемента - в функции, в классе, в пространстве имен.
2015-05-14 22:35:07 +03:00
public enum node_location_kind { in_function_location , in_class_location , in_namespace_location , in_block_location , indefinite } ;
2015-12-28 14:25:15 +03:00
//Уровень доступа к элементам класса.
2015-05-14 22:35:07 +03:00
public enum field_access_level { fal_private , fal_internal , fal_protected , fal_public } ;
2015-12-28 14:25:15 +03:00
//Обычный, статический или виртуальный элемент класса.
2015-05-14 22:35:07 +03:00
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 }
2019-02-17 22:09:17 +03:00
//Тип передачи параметра - по ссылке или по значению.
public enum parameter_type { value , var , cnst } ;
2015-05-14 22:35:07 +03:00
2019-02-17 22:09:17 +03:00
//Тип базовой функции.
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)
2015-05-14 22:35:07 +03:00
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
2019-02-17 22:09:17 +03:00
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)
2015-05-14 22:35:07 +03:00
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)
2019-02-17 22:09:17 +03:00
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)
2015-05-14 22:35:07 +03:00
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)
2019-02-17 22:09:17 +03:00
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 ...
2026-02-02 12:01:18 +03:00
itol , itof , itod , itob , itosb , itos , itous , itoui , itoul , itochar , itobool , //integer to ...
2019-02-17 22:09:17 +03:00
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 (Нужны только на начальном этапе отладки. Потом обязательно удалить.)
2015-05-14 22:35:07 +03:00
objtoobj , boolinc , booldec , boolsinc , boolsdec , booltoi , enumgr , enumgreq , enumsm , enumsmeq ,
2018-12-16 19:52:42 +03:00
booltob , booltosb , booltos , booltous , booltoui , booltol , booltoul ,
2024-08-13 14:49:30 +03:00
ltop , ptol , enumsand , enumsor , enumsxor
2019-02-17 22:09:17 +03:00
} ;
2015-05-14 22:35:07 +03:00
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 } ;
2015-12-28 14:25:15 +03:00
//Документ в котором описан этот узел.
2015-05-14 22:35:07 +03:00
public interface IDocument
{
2015-12-28 14:25:15 +03:00
//Полный путь к файлу.
2015-05-14 22:35:07 +03:00
string file_name
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Документ и позиция в которой описан этот узел.
2015-05-14 22:35:07 +03:00
public interface ILocation
{
2015-12-28 14:25:15 +03:00
//Строка, в которой распологается начало данного элемента.
2015-05-14 22:35:07 +03:00
int begin_line_num
{
get ;
}
2015-12-28 14:25:15 +03:00
//Столбец, в которой распологается начало данного элемента.
2015-05-14 22:35:07 +03:00
int begin_column_num
{
get ;
}
2015-12-28 14:25:15 +03:00
//Строка, в которой распологается конец данного элемента.
2015-05-14 22:35:07 +03:00
int end_line_num
{
get ;
}
2015-12-28 14:25:15 +03:00
//Столбец, в которой распологается конец данного элемента.
2015-05-14 22:35:07 +03:00
int end_column_num
{
get ;
}
2015-12-28 14:25:15 +03:00
//Документ, в котором определен данный элемент дерева.
2026-01-17 23:26:40 +03:00
string file_name
2015-05-14 22:35:07 +03:00
{
get ;
}
}
public interface ILocated
{
ILocation Location
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Базовый интерфейс для всех интерфейсов узлов дерева.
2015-05-14 22:35:07 +03:00
public interface ISemanticNode
{
void visit ( ISemanticVisitor visitor ) ;
}
2015-12-28 14:25:15 +03:00
//Базовый класс, для пердставления определений в программе (определений типов, переменных и т.д.). Никогда не создается.
2015-05-14 22:35:07 +03:00
public interface IDefinitionNode : ISemanticNode
{
string Documentation
{
get ;
}
IAttributeNode [ ] Attributes
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Базовый интерфейс для классов, которые описывают типы. Никогда не создается.
2015-05-14 22:35:07 +03:00
public interface ITypeNode : IDefinitionNode
{
2015-12-28 14:25:15 +03:00
//Вид узла - базовый(basic), обычный (common) или экспортируемый (compiled).
2015-05-14 22:35:07 +03:00
node_kind node_kind
{
get ;
}
2015-12-28 14:25:15 +03:00
//Имя типа. Для языков не чувствительных к регистрам хранит имя в том виде, в каком тип объявлен.
2015-05-14 22:35:07 +03:00
string name
{
get ;
}
2015-12-28 14:25:15 +03:00
//Базовый тип для данного типа. Для object-а =null.
2015-05-14 22:35:07 +03:00
ITypeNode base_type
{
get ;
}
bool is_value_type
{
get ;
}
2017-05-25 20:44:06 +03:00
bool is_nullable_type
{
get ;
}
2015-05-14 22:35:07 +03:00
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
2022-10-06 11:06:27 +03:00
{
get ;
}
List < ITypeNode > ImplementingInterfacesOrEmpty
2015-05-14 22:35:07 +03:00
{
get ;
}
2015-12-28 14:25:15 +03:00
//Является ли generic-параметром
2015-05-14 22:35:07 +03:00
bool is_generic_parameter
{
get ;
}
bool is_generic_type_definition
{
get ;
}
bool is_generic_type_instance
{
get ;
}
2015-12-28 14:25:15 +03:00
//Зависит ли от некоторого неопределенного типа
2015-05-14 22:35:07 +03:00
bool depended_from_indefinite
{
get ;
}
2015-12-28 14:25:15 +03:00
//Описание generic-типа, содержащее данный параметр
2026-06-30 00:11:27 +03:00
ITypeNode generic_type_container
2015-05-14 22:35:07 +03:00
{
get ;
}
2026-06-30 00:11:27 +03:00
IFunctionNode generic_function_container
2015-05-14 22:35:07 +03:00
{
get ;
}
//\ssyy
}
2015-12-28 14:25:15 +03:00
//Интерфейс для описания базовых типов.
//При генерации .Net кода этот класс не нужен. Он может пригодится, например для генерации машинного кода.
//Там он может быть использован, например для представления целых чисел.
//Хотя возможно в этом случае удобнее использовать compiled_type_node.
//Для него могут быть не определены свойства name и base_type.
//В общем когда понадобится, тогда и будем думать. Пока этот интерфейс нигде не должен использоваться.
2015-05-14 22:35:07 +03:00
public interface IBasicTypeNode : ITypeNode
{
}
public interface IUnsizedArray : ITypeNode
{
ITypeNode element_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Синонимы типов, определяемые пользователем в программе.
2015-05-14 22:35:07 +03:00
public interface ITypeSynonym : IDefinitionNode , ILocated
{
2015-12-28 14:25:15 +03:00
//Имя типа. Для языков не чувствительных к регистрам хранит имя в том виде, в каком тип объявлен.
2015-05-14 22:35:07 +03:00
string name
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип, которому даётся синоним
2015-05-14 22:35:07 +03:00
ITypeNode original_type
{
get ;
}
}
public interface ITemplateClass : IDefinitionNode
{
byte [ ] serialized_tree
{
get ;
}
string name
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для generic-типов
2015-05-14 22:35:07 +03:00
public interface IGenericInstance
{
List < ITypeNode > generic_parameters
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для generic-инстанций
2015-05-14 22:35:07 +03:00
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
{
}
2015-12-28 14:25:15 +03:00
//Описывет обычные типы, определяемые пользователем в программе.
2015-05-14 22:35:07 +03:00
public interface ICommonTypeNode : ITypeNode , INamespaceMemberNode , ILocated
{
bool IsSealed
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип public или internal.
2015-05-14 22:35:07 +03:00
type_access_level type_access_level
{
get ;
}
2015-12-28 14:25:15 +03:00
//Методы типа.
2015-05-14 22:35:07 +03:00
ICommonMethodNode [ ] methods
{
get ;
}
2015-12-28 14:25:15 +03:00
//Поля типа.
2015-05-14 22:35:07 +03:00
ICommonClassFieldNode [ ] fields
{
get ;
}
2015-12-28 14:25:15 +03:00
//Свойства типа.
2015-05-14 22:35:07 +03:00
ICommonPropertyNode [ ] properties
{
get ;
}
2015-12-28 14:25:15 +03:00
//Константы, определенные в типе.
2015-05-14 22:35:07 +03:00
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 ;
}
2015-12-28 14:25:15 +03:00
//(ssyy) Является ли описанием generic-типа
2015-05-14 22:35:07 +03:00
bool is_generic_type_definition
{
get ;
}
List < ICommonTypeNode > generic_params
{
get ;
}
ICommonClassFieldNode runtime_initialization_marker
{
get ;
}
bool has_static_constructor
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для описания типов, экспортируемых из сборки.
//Для представления откомпилированных типов я обращаюсь непосредственно к System.Reflection.
//Это завязывает нашу систему на .Net. Можно избавится от этого с помощью введения дополнительного уровня абстракции.
//Для этого нужно определить, какие данные нам нужны от откомпилированных типов, и сделать еще одну прослойку
//между System.Reflection и нашими типами. Тогда при генерации кода под другую платформу (например машинного кода)
//нужно будет только привязать прослойку к другому источнику данных. Например, информация о типах будет
//браться не из сборок, а из dll-библиотек. Я не могу сейчас сделать эту прослойку, т.к. я пока не определил
//какие запросы нужны к откомпилированным модулям. Поэтому пока я использую System.Reflection в котором
//вроде все есть. Потом нужно будет обсудить вопрос создания этой прослойки.
2015-05-14 22:35:07 +03:00
public interface ICompiledTypeNode : ITypeNode
{
2015-12-28 14:25:15 +03:00
//Откомпилированный тип.
2015-05-14 22:35:07 +03:00
System . Type compiled_type
{
get ;
}
int rank
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий индексируемый с 0 массив.
2015-05-14 22:35:07 +03:00
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 ;
}
}
2015-12-28 14:25:15 +03:00
//Базовый интерфейс для statement-ов. Объекты, реализующие только этот интерфейс нигде не должны создаваться.
//Должны создаваться классы, реализующие интерфейсы производные от данного интерфейса.
//Звучит очень запутано, но вобщем то, что написано выше не очень важно :-).
2015-05-14 22:35:07 +03:00
public interface IStatementNode : ISemanticNode , ILocated
{
}
public interface IRuntimeManagedMethodBody : IStatementNode
{
runtime_statement_type runtime_statement_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Базовый интерфейс для выражений.
2015-05-14 22:35:07 +03:00
public interface IExpressionNode : IStatementNode
{
2015-12-28 14:25:15 +03:00
//Тип выражения.
2015-05-14 22:35:07 +03:00
ITypeNode type
{
get ;
}
2017-07-02 13:18:56 +03:00
ITypeNode conversion_type
{
get ;
}
2015-05-14 22:35:07 +03:00
}
2015-12-28 14:25:15 +03:00
//Базовый интерфейс для вызовов функций. Нигде не создается.
2015-05-14 22:35:07 +03:00
public interface IFunctionCallNode : IExpressionNode
{
2015-12-28 14:25:15 +03:00
//Список фактических параметров. Количество и типы формальных и фактических параметров сверяется
//на этапе построения семантического дерева. При необходимости при построении семантического дерева
//вставляются узлы преобрызования типов.
2015-05-14 22:35:07 +03:00
IExpressionNode [ ] real_parameters
{
get ;
}
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
IFunctionNode function
{
get ;
}
//ssyy
2015-12-28 14:25:15 +03:00
//Нужно для генерации унаследованных интерфейсных функций
2015-05-14 22:35:07 +03:00
bool last_result_function_call
{
get ;
set ;
}
//\ssyy
}
2015-12-28 14:25:15 +03:00
//Вызов базового метода.
2015-05-14 22:35:07 +03:00
public interface IBasicFunctionCallNode : IFunctionCallNode
{
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
IBasicFunctionNode basic_function
{
get ;
}
}
public interface INonStaticMethodCallNode : IFunctionCallNode
{
bool virtual_call
{
get ;
set ;
}
}
2015-12-28 14:25:15 +03:00
//Вызов функции, определенной в пространстве имен.
2015-05-14 22:35:07 +03:00
public interface ICommonNamespaceFunctionCallNode : IFunctionCallNode
{
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode namespace_function
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Вызов функции, определенной в другой функции.
2015-05-14 22:35:07 +03:00
public interface ICommonNestedInFunctionFunctionCallNode : IFunctionCallNode
{
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICommonNestedInFunctionFunctionNode common_function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Статическая глубина вложенной функции.
2015-05-14 22:35:07 +03:00
int static_depth
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Вызов метода класса.
2015-05-14 22:35:07 +03:00
public interface ICommonMethodCallNode : INonStaticMethodCallNode
{
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICommonMethodNode method
{
get ;
}
2015-12-28 14:25:15 +03:00
//Экземпляр класса, данный метод которого нужно вызвать.
2015-05-14 22:35:07 +03:00
IExpressionNode obj
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Узел, соответствующий указателю this в программе.
2015-05-14 22:35:07 +03:00
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 ;
}
}
2015-12-28 14:25:15 +03:00
//Вызов статичекого метода класса.
2015-05-14 22:35:07 +03:00
public interface ICommonStaticMethodCallNode : IFunctionCallNode
{
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICommonMethodNode static_method
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип, статический метод которого вызываем.
2015-05-14 22:35:07 +03:00
ICommonTypeNode common_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Вызов конструктора common-класса.
2015-05-14 22:35:07 +03:00
public interface ICommonConstructorCall : ICommonStaticMethodCallNode
{
//ssyy
bool new_obj_awaited ( ) ;
//\ssyy
}
2015-12-28 14:25:15 +03:00
//Вызов откомпилированного метода.
2015-05-14 22:35:07 +03:00
public interface ICompiledMethodCallNode : INonStaticMethodCallNode
{
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICompiledMethodNode compiled_method
{
get ;
}
2015-12-28 14:25:15 +03:00
//Экземпляр класса, данный метод которого нужно вызвать.
2015-05-14 22:35:07 +03:00
IExpressionNode obj
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Вызов статического метода, откомптлированного класса.
2015-05-14 22:35:07 +03:00
public interface ICompiledStaticMethodCallNode : IFunctionCallNode
{
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICompiledMethodNode static_method
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип, статический метод которого мы вызываем.
2015-05-14 22:35:07 +03:00
ICompiledTypeNode compiled_type
{
get ;
}
ITypeNode [ ] template_parametres
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Вызов конструктора откомпилированного метода.
2015-05-14 22:35:07 +03:00
public interface ICompiledConstructorCall : IFunctionCallNode
{
ICompiledConstructorNode constructor
{
get ;
}
ICompiledTypeNode compiled_type
{
get ;
}
//ssyy
bool new_obj_awaited ( ) ;
//\ssyy
}
2015-12-28 14:25:15 +03:00
//Базовый интерфейс для описания функций. Никогда не создается.
2015-05-14 22:35:07 +03:00
public interface IFunctionNode : IDefinitionNode
{
2015-12-28 14:25:15 +03:00
//Вид узла - базовый (basic), обычный (common) или экспортируемый (compiled).
2015-05-14 22:35:07 +03:00
node_kind node_kind
{
get ;
}
2015-12-28 14:25:15 +03:00
//Список формальных параметров функции.
2015-05-14 22:35:07 +03:00
IParameterNode [ ] parameters
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип возвращаемого значения функции.
2015-05-14 22:35:07 +03:00
ITypeNode return_value_type
{
get ;
}
2015-12-28 14:25:15 +03:00
//Имя функции. Для языков не чувствительных к регистру - в том виде, в котором функция определена.
2015-05-14 22:35:07 +03:00
string name
{
get ;
}
2015-12-28 14:25:15 +03:00
//Расположение функции - в функции, в классе, в пространстве имен.
2015-05-14 22:35:07 +03:00
node_location_kind node_location_kind
{
get ;
}
2015-12-28 14:25:15 +03:00
//Является ли generic-функцией
2015-05-14 22:35:07 +03:00
bool is_generic_function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Число типов-параметров generic-функции. 0 для не-generic.
2015-05-14 22:35:07 +03:00
int generic_parameters_count
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс члена класса.
2015-05-14 22:35:07 +03:00
public interface IClassMemberNode
{
2015-12-28 14:25:15 +03:00
//Тип, содержащий этот член класса.
2015-05-14 22:35:07 +03:00
ITypeNode comperehensive_type
{
get ;
}
2015-12-28 14:25:15 +03:00
//Статический, обычный или виртуальный метод.
2015-05-14 22:35:07 +03:00
polymorphic_state polymorphic_state
{
get ;
}
2015-12-28 14:25:15 +03:00
//Уровень доступа к члену класса.
2015-05-14 22:35:07 +03:00
field_access_level field_access_level
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс члена откомпилированного класса.
2015-05-14 22:35:07 +03:00
public interface ICompiledClassMemberNode : IClassMemberNode
{
2015-12-28 14:25:15 +03:00
//Тип, содержащий член класса.
2015-05-14 22:35:07 +03:00
ICompiledTypeNode comprehensive_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс члена обычного класса.
2015-05-14 22:35:07 +03:00
public interface ICommonClassMemberNode : IClassMemberNode
{
2015-12-28 14:25:15 +03:00
//Тип, содержащий член класса.
2015-05-14 22:35:07 +03:00
ICommonTypeNode common_comprehensive_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс переменной или функции, определенной внутри функции.
2015-05-14 22:35:07 +03:00
public interface IFunctionMemberNode
{
2015-12-28 14:25:15 +03:00
//Функция, содержащая этот обьъект.
2015-05-14 22:35:07 +03:00
ICommonFunctionNode function
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс переменной или функции, определенной в пространстве имен.
2015-05-14 22:35:07 +03:00
public interface INamespaceMemberNode
{
2015-12-28 14:25:15 +03:00
//Пространство имен, в котором определен элемент.
2015-05-14 22:35:07 +03:00
ICommonNamespaceNode comprehensive_namespace
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Класс для описания базовых, нигде не определенных функций (например, сложение двух целых чисел).
2015-05-14 22:35:07 +03:00
public interface IBasicFunctionNode : IFunctionNode
{
2015-12-28 14:25:15 +03:00
//Какая именно это базовая функция.
2015-05-14 22:35:07 +03:00
basic_function_type basic_function_type
{
get ;
}
}
public enum SpecialFunctionKind
{
None , New , Dispose , NewArray
}
2015-12-28 14:25:15 +03:00
//Интерфейс для описания функции, определяемой пользователем.
2015-05-14 22:35:07 +03:00
public interface ICommonFunctionNode : IFunctionNode , ILocated
{
SpecialFunctionKind SpecialFunctionKind
{
get ;
}
bool is_overload
{
get ;
}
2015-12-28 14:25:15 +03:00
//Список переменных, определяемых в функции.
2015-05-14 22:35:07 +03:00
ILocalVariableNode [ ] var_definition_nodes
{
get ;
}
2015-12-28 14:25:15 +03:00
//Список вложенных функций.
2015-05-14 22:35:07 +03:00
ICommonNestedInFunctionFunctionNode [ ] functions_nodes
{
get ;
}
2015-12-28 14:25:15 +03:00
//Код функции.
2015-05-14 22:35:07 +03:00
IStatementNode function_code
{
get ;
}
2015-12-28 14:25:15 +03:00
//Переменная, которая содержит возвращаемое значение функции. Для процедур - null.
2015-05-14 22:35:07 +03:00
ILocalVariableNode return_variable
{
get ;
}
2015-12-28 14:25:15 +03:00
//Константы, определенные в функции.
2015-05-14 22:35:07 +03:00
ICommonFunctionConstantDefinitionNode [ ] constants
{
get ;
}
2015-12-28 14:25:15 +03:00
//Generic-параметры функции
2015-05-14 22:35:07 +03:00
List < ICommonTypeNode > generic_params
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Функция, определенная непосредственно в пространстве имен.
2015-05-14 22:35:07 +03:00
public interface ICommonNamespaceFunctionNode : ICommonFunctionNode , INamespaceMemberNode
{
2015-12-28 14:25:15 +03:00
//Прстранство имен, в котором определена эта функция.
2015-05-14 22:35:07 +03:00
ICommonNamespaceNode namespace_node
{
get ;
}
ITypeNode ConnectedToType
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Функция, определенная в другой функции.
2015-05-14 22:35:07 +03:00
public interface ICommonNestedInFunctionFunctionNode : ICommonFunctionNode , IFunctionMemberNode
{
}
2015-12-28 14:25:15 +03:00
//Метод класса, определяемый пользователем.
2015-05-14 22:35:07 +03:00
public interface ICommonMethodNode : ICommonFunctionNode , ICommonClassMemberNode
{
bool is_constructor
{
get ;
}
IFunctionNode overrided_method
{
get ;
}
bool is_final
{
get ;
set ;
}
bool newslot_awaited
{
get ;
set ;
}
}
2015-12-28 14:25:15 +03:00
//Класс для описания экспортируемых (compiled) функций.
2015-05-14 22:35:07 +03:00
public interface ICompiledMethodNode : IFunctionNode , ICompiledClassMemberNode
{
2015-12-28 14:25:15 +03:00
//Откомпилированный метод.
2015-05-14 22:35:07 +03:00
System . Reflection . MethodInfo method_info
{
get ;
}
bool is_extension
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Вызов конструктора откомпилированного типа.
2015-05-14 22:35:07 +03:00
public interface ICompiledConstructorNode : IFunctionNode , ICompiledClassMemberNode
{
System . Reflection . ConstructorInfo constructor_info
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для описания конструкции if.
2015-05-14 22:35:07 +03:00
public interface IIfNode : IStatementNode
{
2015-12-28 14:25:15 +03:00
//Условие.
2015-05-14 22:35:07 +03:00
IExpressionNode condition
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тело then.
2015-05-14 22:35:07 +03:00
IStatementNode then_body
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тело else. Если if без then это свойство = null.
2015-05-14 22:35:07 +03:00
IStatementNode else_body
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для конструкции while.
2015-05-14 22:35:07 +03:00
public interface IWhileNode : IStatementNode
{
2015-12-28 14:25:15 +03:00
//Условие.
2015-05-14 22:35:07 +03:00
IExpressionNode condition
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тело while.
2015-05-14 22:35:07 +03:00
IStatementNode body
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для конструкции repeat.
2015-05-14 22:35:07 +03:00
public interface IRepeatNode : IStatementNode
{
2015-12-28 14:25:15 +03:00
//Тело do .. while (repeat .. until).
2015-05-14 22:35:07 +03:00
IStatementNode body
{
get ;
}
2015-12-28 14:25:15 +03:00
//Условие.
2015-05-14 22:35:07 +03:00
IExpressionNode condition
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Класс для описания конструкции for.
//For - C++/C# - овский. Для моделирования паскалевского for он преобразуется в эту конструкцию.
2015-05-14 22:35:07 +03:00
public interface IForNode : IStatementNode
{
2015-12-28 14:25:15 +03:00
//Инициализация переменных цикла.
2015-05-14 22:35:07 +03:00
IStatementNode initialization_statement
{
get ;
}
2015-12-28 14:25:15 +03:00
//Условие продолжения цикла.
2015-05-14 22:35:07 +03:00
IExpressionNode while_expr
{
get ;
}
IExpressionNode init_while_expr
{
get ;
}
2015-12-28 14:25:15 +03:00
//Изменение счетчиков цикла.
2015-05-14 22:35:07 +03:00
IStatementNode increment_statement
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тело цикла.
2015-05-14 22:35:07 +03:00
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
{
}
2015-12-28 14:25:15 +03:00
//Один из вариантов констракции swithc.
2015-05-14 22:35:07 +03:00
public interface ICaseVariantNode : IStatementNode
{
2015-12-28 14:25:15 +03:00
//Выражения, при которых нужно исполгить код, соответствующий этому узлу.
2015-05-14 22:35:07 +03:00
IExpressionNode [ ] expressions
{
get ;
}
2015-12-28 14:25:15 +03:00
//Диапазоны, при попадании в которые нужно исполнить код, соответствующий этому узлу.
2015-05-14 22:35:07 +03:00
IRangExpression [ ] ranges
{
get ;
}
2015-12-28 14:25:15 +03:00
//Код этого узла.
2015-05-14 22:35:07 +03:00
IStatementNode statement
{
get ;
}
}
public interface IRangeExpression : IExpressionNode
{
IExpressionNode lower_bound
{
get ;
}
IExpressionNode upper_bound
{
get ;
}
} * /
2015-12-28 14:25:15 +03:00
//Интерфейс для описания списка statement-ов.
2015-05-14 22:35:07 +03:00
public interface IStatementsListNode : IStatementNode
{
ILocalBlockVariableNode [ ] LocalVariables
{
get ;
}
2015-12-28 14:25:15 +03:00
//Список statement-ов.
2015-05-14 22:35:07 +03:00
IStatementNode [ ] statements
{
get ;
}
2015-12-28 14:25:15 +03:00
//Положение левой логической скобки
2015-05-14 22:35:07 +03:00
ILocation LeftLogicalBracketLocation
{
get ;
}
2015-12-28 14:25:15 +03:00
//Положение правой логической скобки
2015-05-14 22:35:07 +03:00
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 ;
}
}
* /
2015-12-28 14:25:15 +03:00
//Узел пространства имен.
2015-05-14 22:35:07 +03:00
public interface INamespaceNode : IDefinitionNode
{
string namespace_name
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Узел пространства имен, определенного пользователем.
2015-05-14 22:35:07 +03:00
public interface ICommonNamespaceNode : INamespaceNode , ILocated
{
2015-12-28 14:25:15 +03:00
//Пространства имен, вложенные в это пространство имен.
2015-05-14 22:35:07 +03:00
ICommonNamespaceNode [ ] nested_namespaces
{
get ;
}
2015-12-28 14:25:15 +03:00
//Пространство имен, в которое вложенно это пространство имен.
2015-05-14 22:35:07 +03:00
INamespaceNode comprehensive_namespace
{
get ;
}
2015-12-28 14:25:15 +03:00
//Типы, описанные в namespace.
2015-05-14 22:35:07 +03:00
ICommonTypeNode [ ] types
{
get ;
}
ITypeSynonym [ ] type_synonims
{
get ;
}
ITemplateClass [ ] templates
{
get ;
}
2015-12-28 14:25:15 +03:00
//Переменные, описанные в этом namespace.
2015-05-14 22:35:07 +03:00
ICommonNamespaceVariableNode [ ] variables
{
get ;
}
2015-12-28 14:25:15 +03:00
//Функции, описанные в namespace.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode [ ] functions
{
get ;
}
2015-12-28 14:25:15 +03:00
//Константы, описанные в namespace. Они должны экспортироваться как нибудь.
2015-05-14 22:35:07 +03:00
INamespaceConstantDefinitionNode [ ] constants
{
get ;
}
ICommonNamespaceEventNode [ ] events
{
get ;
}
bool IsMain
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Откомпилированное пространство имен.
2015-05-14 22:35:07 +03:00
public interface ICompiledNamespaceNode : INamespaceNode
{
}
2015-12-28 14:25:15 +03:00
/// Базовый интерфейс для программ и dll.
2015-05-14 22:35:07 +03:00
public interface IProgramBase : IDefinitionNode , ILocated
{
2015-12-28 14:25:15 +03:00
//Пространства имен, содержащиеся в программе или dll.
2015-05-14 22:35:07 +03:00
ICommonNamespaceNode [ ] namespaces
{
get ;
}
string [ ] UsedNamespaces
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Узел dll библиотеки.
2015-05-14 22:35:07 +03:00
public interface IDllNode : IProgramBase
{
2015-12-28 14:25:15 +03:00
//Метод инициализации dll.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode initialization_function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Метод финализации dll.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode finalization_function
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Корневой узел программы.
2015-05-14 22:35:07 +03:00
public interface IProgramNode : IProgramBase
{
2015-12-28 14:25:15 +03:00
//Главная функция. Е е выполнение равносильно выполнению программы.
//Она включает вызовы методов инициализации модулей (в начале), выполнение основной программы
//и вызовы методов финализации модулей.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode main_function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Инстанции generic-типов, использующиеся в программе.
2015-05-14 22:35:07 +03:00
List < IGenericTypeInstance > generic_type_instances
{
get ;
}
2015-12-28 14:25:15 +03:00
//Инстанции generic-типов, использующиеся в программе.
2015-05-14 22:35:07 +03:00
List < IGenericFunctionInstance > generic_function_instances
{
get ;
}
IStatementNode InitializationCode
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Тип выражений, которые могут возвращать адрес (например переменная).
2015-05-14 22:35:07 +03:00
public interface IAddressedExpressionNode : IExpressionNode
{
}
2015-12-28 14:25:15 +03:00
//Оператор return.
2015-05-14 22:35:07 +03:00
public interface IReturnNode : IStatementNode
{
IExpressionNode return_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//ssyy добавил
//Оператор return из .ctor.
2015-05-14 22:35:07 +03:00
/ * public interface ICtorReturnNode : IStatementNode
{
} * /
//\ssyy
public interface IReferenceNode : IAddressedExpressionNode
{
2015-12-28 14:25:15 +03:00
//Определение локальной переменной.
2015-05-14 22:35:07 +03:00
IVAriableDefinitionNode Variable
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий обращение к локальной переменной в теле программы.
2015-05-14 22:35:07 +03:00
public interface ILocalVariableReferenceNode : IReferenceNode
{
2015-12-28 14:25:15 +03:00
//Определение локальной переменной.
2015-05-14 22:35:07 +03:00
ILocalVariableNode variable
{
get ;
}
2015-12-28 14:25:15 +03:00
//Разность статических глубин, между определением и вхождением.
2015-05-14 22:35:07 +03:00
int static_depth
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий обращение к локальной переменной в блоке.
2015-05-14 22:35:07 +03:00
public interface ILocalBlockVariableReferenceNode : IReferenceNode
{
2015-12-28 14:25:15 +03:00
//Определение локальной переменной.
2015-05-14 22:35:07 +03:00
ILocalBlockVariableNode Variable
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий обращение к переменной, определенной непосредственно в namespace.
2015-05-14 22:35:07 +03:00
public interface INamespaceVariableReferenceNode : IReferenceNode
{
2015-12-28 14:25:15 +03:00
//Переменная.
2015-05-14 22:35:07 +03:00
ICommonNamespaceVariableNode variable
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий обращение к полю класса.
2015-05-14 22:35:07 +03:00
public interface ICommonClassFieldReferenceNode : IReferenceNode
{
2015-12-28 14:25:15 +03:00
//Поле класса.
2015-05-14 22:35:07 +03:00
ICommonClassFieldNode field
{
get ;
}
2015-12-28 14:25:15 +03:00
//Объект класса.
2015-05-14 22:35:07 +03:00
IExpressionNode obj
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий обращение к статическому полю класса.
2015-05-14 22:35:07 +03:00
public interface IStaticCommonClassFieldReferenceNode : IReferenceNode
{
2015-12-28 14:25:15 +03:00
//Статическое поле класса.
2015-05-14 22:35:07 +03:00
ICommonClassFieldNode static_field
{
get ;
}
2015-12-28 14:25:15 +03:00
//Класс, к статическому методу которого мы обращаемся.
2015-05-14 22:35:07 +03:00
ICommonTypeNode class_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Обращение к полю откомпилированного класса.
2015-05-14 22:35:07 +03:00
public interface ICompiledFieldReferenceNode : IReferenceNode
{
2015-12-28 14:25:15 +03:00
//Поле класса.
2015-05-14 22:35:07 +03:00
ICompiledClassFieldNode field
{
get ;
}
2015-12-28 14:25:15 +03:00
//Объект класса.
2015-05-14 22:35:07 +03:00
IExpressionNode obj
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий обращение к статическому полю откомпилированного класса.
2015-05-14 22:35:07 +03:00
public interface IStaticCompiledFieldReferenceNode : IReferenceNode
{
2015-12-28 14:25:15 +03:00
//Поле класса.
2015-05-14 22:35:07 +03:00
ICompiledClassFieldNode static_field
{
get ;
}
2015-12-28 14:25:15 +03:00
//Класс, к статическому полю которого мы обращаемся.
2015-05-14 22:35:07 +03:00
ICompiledTypeNode class_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Обращение к параметру метода.
2015-05-14 22:35:07 +03:00
public interface ICommonParameterReferenceNode : IReferenceNode
{
2015-12-28 14:25:15 +03:00
//Параметр метода, к которому мы обращаемся.
2015-05-14 22:35:07 +03:00
ICommonParameterNode parameter
{
get ;
}
2015-12-28 14:25:15 +03:00
//Разность статических глубин, между обращением к параметру и методом в котором он объявлен.
2015-05-14 22:35:07 +03:00
int static_depth
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Базовый узел для представления констант в теле программы (не именованных констант, а чисел, строк и т.д.).
2015-05-14 22:35:07 +03:00
public interface IConstantNode : IExpressionNode
{
object value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления булевских констант.
2015-05-14 22:35:07 +03:00
public interface IBoolConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
bool constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления byte констант.
2015-05-14 22:35:07 +03:00
public interface IByteConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
byte constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления signed byte констант.
2015-05-14 22:35:07 +03:00
public interface ISByteConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
sbyte constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления signed short констант.
2015-05-14 22:35:07 +03:00
public interface IShortConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
short constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления unsigned short констант.
2015-05-14 22:35:07 +03:00
public interface IUShortConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
ushort constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления int констант.
2015-05-14 22:35:07 +03:00
public interface IIntConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
int constant_value
{
get ;
}
}
2023-09-13 11:16:18 +03:00
//Интерфейс для представления BigInteger констант.
public interface IBigIntConstantNode : IConstantNode
{
//Значение константы.
System . Numerics . BigInteger constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления unsigned int констант.
2015-05-14 22:35:07 +03:00
public interface IUIntConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
uint constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления long констант.
2015-05-14 22:35:07 +03:00
public interface ILongConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
long constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления unsigned long констант.
2015-05-14 22:35:07 +03:00
public interface IULongConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
ulong constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления float констант.
2015-05-14 22:35:07 +03:00
public interface IFloatConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
float constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления double констант.
2015-05-14 22:35:07 +03:00
public interface IDoubleConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
double constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления char констант (этот класс для 2-байтных char - widechar в delphi).
2015-05-14 22:35:07 +03:00
public interface ICharConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
char constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления string-констант.
2015-05-14 22:35:07 +03:00
public interface IStringConstantNode : IConstantNode
{
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
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 ;
}
}
2023-05-17 22:06:17 +03:00
public interface ICommonStaticMethodCallNodeAsConstant : IConstantNode
{
ICommonStaticMethodCallNode MethodCall
{
get ;
}
}
public interface ICompiledStaticMethodCallNodeAsConstant : IConstantNode
2015-05-14 22:35:07 +03:00
{
ICompiledStaticMethodCallNode MethodCall
{
get ;
}
}
public interface ICompiledStaticFieldReferenceNodeAsConstant : IConstantNode
{
IStaticCompiledFieldReferenceNode FieldReference
{
get ;
}
}
public interface ICommonNamespaceFunctionCallNodeAsConstant : IConstantNode
{
ICommonNamespaceFunctionCallNode MethodCall
{
get ;
}
}
public interface IBasicFunctionCallNodeAsConstant : IConstantNode
{
IBasicFunctionCallNode MethodCall
{
get ;
}
}
2018-10-04 13:14:46 +03:00
public interface IDefaultOperatorNodeAsConstant : IConstantNode
{
IDefaultOperatorNode DefaultOperator
{
get ;
}
}
2021-02-21 13:40:39 +03:00
public interface ITypeOfOperatorAsConstant : IConstantNode
{
ITypeOfOperator TypeOfOperator
{
get ;
}
}
2023-11-01 13:48:45 +03:00
public interface ISizeOfOperatorAsConstant : IConstantNode
{
ISizeOfOperator SizeOfOperator
{
get ;
}
}
2021-02-21 13:40:39 +03:00
public interface ICompiledConstructorCallAsConstant : IConstantNode
2015-05-14 22:35:07 +03:00
{
ICompiledConstructorCall MethodCall
{
get ;
}
}
/ * public interface IClassConstantNode : IConstantNode
{
} * /
2015-12-28 14:25:15 +03:00
/ * //Узел для представления оператора присваивания.
2015-05-14 22:35:07 +03:00
public interface IAssignNode : IExpressionNode
{
2015-12-28 14:25:15 +03:00
//Чему присваиванием.
2015-05-14 22:35:07 +03:00
IAddressedExpressionNode to
{
get ;
}
2015-12-28 14:25:15 +03:00
//Что присваиваем.
2015-05-14 22:35:07 +03:00
IExpressionNode from
{
get ;
}
} * /
2015-12-28 14:25:15 +03:00
//Базовй интерфейс для формальных параметров функций, локальных переменных, глобальных переменных программы и модуля и полей класса. Нигде не создается.
2015-05-14 22:35:07 +03:00
public interface IVAriableDefinitionNode : IDefinitionNode
{
2015-12-28 14:25:15 +03:00
//Имя переменной.
2015-05-14 22:35:07 +03:00
string name
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип переменной.
2015-05-14 22:35:07 +03:00
ITypeNode type
{
get ;
}
IExpressionNode inital_value
{
get ;
}
2015-12-28 14:25:15 +03:00
//Раположение переменной.
2015-05-14 22:35:07 +03:00
node_location_kind node_location_kind
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для описания локальных переменных.
2015-05-14 22:35:07 +03:00
public interface ILocalVariableNode : IVAriableDefinitionNode , IFunctionMemberNode , ILocated
{
2015-12-28 14:25:15 +03:00
//Используется, ли переменная во вложенных функчиях. Исрользуется для оптимизации.
2015-05-14 22:35:07 +03:00
bool is_used_as_unlocal
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для описания локальных переменных.
2015-05-14 22:35:07 +03:00
public interface ILocalBlockVariableNode : IVAriableDefinitionNode , ILocated
{
IStatementsListNode Block
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий глобальную переменную, описанную в модуле или программе.
2015-05-14 22:35:07 +03:00
public interface ICommonNamespaceVariableNode : IVAriableDefinitionNode , INamespaceMemberNode , ILocated
{
}
2015-12-28 14:25:15 +03:00
//Интерфейс для описания полей класса.
2015-05-14 22:35:07 +03:00
public interface ICommonClassFieldNode : IVAriableDefinitionNode , ICommonClassMemberNode , ILocated
{
}
2015-12-28 14:25:15 +03:00
//Переменная, определенная в откомпилированном классе.
2015-05-14 22:35:07 +03:00
public interface ICompiledClassFieldNode : IVAriableDefinitionNode , ICompiledClassMemberNode
{
System . Reflection . FieldInfo compiled_field
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Базовый интерфейс для интерфейсов, представляющих параметры базовых, обычных и откомпилированных функций.
2015-05-14 22:35:07 +03:00
public interface IParameterNode : IVAriableDefinitionNode
{
2015-12-28 14:25:15 +03:00
//Тип параметра.
2015-05-14 22:35:07 +03:00
parameter_type parameter_type
{
get ;
}
2015-12-28 14:25:15 +03:00
//Функция, в которой описан этот праметр.
2015-05-14 22:35:07 +03:00
IFunctionNode function
{
get ;
}
bool is_params
{
get ;
}
bool is_const
{
get ;
}
IExpressionNode default_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс для представления параметров common функций.
2015-05-14 22:35:07 +03:00
public interface ICommonParameterNode : IParameterNode , ILocated
{
2015-12-28 14:25:15 +03:00
//Функция, в которой определен параметер.
2015-05-14 22:35:07 +03:00
ICommonFunctionNode common_function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Используется ли параметр во вложенных функциях.
2015-05-14 22:35:07 +03:00
bool is_used_as_unlocal
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий параметры базовых функций.
2015-05-14 22:35:07 +03:00
public interface IBasicParameterNode : IParameterNode
{
}
2015-12-28 14:25:15 +03:00
//Интерфейс, представляющий параметры откомпилироанных функций.
2015-05-14 22:35:07 +03:00
public interface ICompiledParameterNode : IParameterNode
{
2015-12-28 14:25:15 +03:00
//Функция, в которой определен параметер.
2015-05-14 22:35:07 +03:00
ICompiledMethodNode compiled_function
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Интерфейс, описывающий определение константы.
2015-05-14 22:35:07 +03:00
public interface IConstantDefinitionNode : IDefinitionNode
{
2015-12-28 14:25:15 +03:00
//Имя константы.
2015-05-14 22:35:07 +03:00
string name
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип константы.
2015-05-14 22:35:07 +03:00
ITypeNode type
{
get ;
}
2015-12-28 14:25:15 +03:00
//Значение константы.
2015-05-14 22:35:07 +03:00
IConstantNode constant_value
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Константа, определенная в классе.
2015-05-14 22:35:07 +03:00
public interface IClassConstantDefinitionNode : IConstantDefinitionNode , IClassMemberNode , ILocated
{
}
public interface ICompiledClassConstantDefinitionNode : IConstantDefinitionNode , IClassMemberNode
{
ICompiledTypeNode comprehensive_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Константа, определенная в пространстве имен.
2015-05-14 22:35:07 +03:00
public interface INamespaceConstantDefinitionNode : IConstantDefinitionNode , ILocated
{
ICommonNamespaceNode comprehensive_namespace
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Константа, определенная в функции.
2015-05-14 22:35:07 +03:00
public interface ICommonFunctionConstantDefinitionNode : IConstantDefinitionNode , ILocated
{
ICommonFunctionNode comprehensive_function
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Константа, определенная в откомпилированном типе.
2015-05-14 22:35:07 +03:00
public interface ICompiledConstantNode : IConstantDefinitionNode
{
ICompiledTypeNode comprehensive_type
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Узел, описывающий свойство класса. Никогда не создается.
2015-05-14 22:35:07 +03:00
public interface IPropertyNode : IDefinitionNode
{
2015-12-28 14:25:15 +03:00
//Вид объекта (basic, common, compiled).
2015-05-14 22:35:07 +03:00
node_kind node_kind
{
get ;
}
2015-12-28 14:25:15 +03:00
//Имя свойства.
2015-05-14 22:35:07 +03:00
string name
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип, который содержит это свойство.
2015-05-14 22:35:07 +03:00
ITypeNode comprehensive_type
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип свойства.
2015-05-14 22:35:07 +03:00
ITypeNode property_type
{
get ;
}
2015-12-28 14:25:15 +03:00
//Функция, которая возвращает значение свойства.
2015-05-14 22:35:07 +03:00
IFunctionNode get_function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Функция, которая устанавливает значение свойства.
2015-05-14 22:35:07 +03:00
IFunctionNode set_function
{
get ;
}
IParameterNode [ ] parameters
{
get ;
}
}
2015-12-28 14:25:15 +03:00
//Определяемое пользователем свойство.
2015-05-14 22:35:07 +03:00
public interface ICommonPropertyNode : IPropertyNode , ICommonClassMemberNode , ILocated
{
2015-12-28 14:25:15 +03:00
//Тип, который содержит это свойство.
2015-05-14 22:35:07 +03:00
/ * ICommonTypeNode common_comprehensive_type
{
get ;
} * /
2015-12-28 14:25:15 +03:00
//Функция, которая возвращает значение свойства.
2015-05-14 22:35:07 +03:00
/ * ICommonClassMemberNode get_common_function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Функция, которая устанавливает значение свойства.
2015-05-14 22:35:07 +03:00
ICommonClassMemberNode set_common_function
{
get ;
} * /
}
2015-12-28 14:25:15 +03:00
//Базовое свойство. Пока нигде не нужно, но для реализации машинного кода может очень пригодится.
2015-05-14 22:35:07 +03:00
public interface IBasicPropertyNode : IPropertyNode
{
}
2015-12-28 14:25:15 +03:00
//Свойство в откомпилированном типе.
2015-05-14 22:35:07 +03:00
public interface ICompiledPropertyNode : IPropertyNode , ICompiledClassMemberNode
{
2015-12-28 14:25:15 +03:00
//Свойство в сборке.
2015-05-14 22:35:07 +03:00
System . Reflection . PropertyInfo property_info
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип, который содержит это свойство.
2015-05-14 22:35:07 +03:00
ICompiledTypeNode compiled_comprehensive_type
{
get ;
}
2015-12-28 14:25:15 +03:00
//Функция, которая возвращает значение свойства.
2015-05-14 22:35:07 +03:00
ICompiledMethodNode compiled_get_method
{
get ;
}
2015-12-28 14:25:15 +03:00
//Функция, которая устанавливает значение свойства.
2015-05-14 22:35:07 +03:00
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 ;
}
}
2020-12-27 14:18:28 +03:00
public interface IDoubleQuestionColonExpressionNode : IExpressionNode
{
IExpressionNode condition
{
get ;
}
IExpressionNode ret_if_null
{
get ;
}
}
public interface ILabelNode : IDefinitionNode , ILocated
2015-05-14 22:35:07 +03:00
{
2015-12-28 14:25:15 +03:00
//Имя метки. Для языков не чувствительных к регистрам хранит имя в том виде, в каком тип объявлен.
2015-05-14 22:35:07 +03:00
string name
{
get ;
}
2015-12-28 14:25:15 +03:00
//встречена ли метка в коде
2015-05-14 22:35:07 +03:00
/ * bool is_defined
{
get ;
set ;
} * /
}
public interface ILabeledStatementNode : IStatementNode , ILocated
{
2015-12-28 14:25:15 +03:00
//Метка, которой помечен statement
2015-05-14 22:35:07 +03:00
ILabelNode label
{
get ;
}
2015-12-28 14:25:15 +03:00
//Сама инструкция
2015-05-14 22:35:07 +03:00
IStatementNode statement
{
get ;
}
}
public interface IGotoStatementNode : IStatementNode , ILocated
{
2015-12-28 14:25:15 +03:00
//Метка, на которую происходит переход
2015-05-14 22:35:07 +03:00
ILabelNode label
{
get ;
}
}
public interface IForeachNode : IStatementNode , ILocated
{
IVAriableDefinitionNode VarIdent
{
get ;
}
IExpressionNode InWhatExpr
{
get ;
}
IStatementNode Body
{
get ;
}
2024-06-28 17:25:39 +03:00
2024-07-01 00:16:43 +03:00
ITypeNode ElementType
{
get ;
}
2024-06-28 17:25:39 +03:00
2024-07-01 00:16:43 +03:00
bool IsGeneric
{
get ;
}
2015-05-14 22:35:07 +03:00
}
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
{
2015-12-28 14:25:15 +03:00
//Вид узла - базовый (basic), обычный (common) или экспортируемый (compiled).
2015-05-14 22:35:07 +03:00
node_kind node_kind
{
get ;
}
2015-12-28 14:25:15 +03:00
//Список формальных параметров функции.
2015-05-14 22:35:07 +03:00
IParameterNode [ ] parameters
{
get ;
}
2015-12-28 14:25:15 +03:00
//Тип возвращаемого значения функции.
2015-05-14 22:35:07 +03:00
ITypeNode return_value_type
{
get ;
}
IStatementNode body
{
get ;
}
IFunctionNode function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Расположение функции - в функции, в классе, в пространстве имен.
2015-05-14 22:35:07 +03:00
node_location_kind node_location_kind
{
get ;
}
2015-12-28 14:25:15 +03:00
//Является ли generic-функцией
2015-05-14 22:35:07 +03:00
bool is_generic_function
{
get ;
}
2015-12-28 14:25:15 +03:00
//Число типов-параметров generic-функции. 0 для не-generic.
2015-05-14 22:35:07 +03:00
int generic_parameters_count
{
get ;
}
}
public interface ILambdaFunctionCallNode : IExpressionNode
{
2015-12-28 14:25:15 +03:00
//Список фактических параметров. Количество и типы формальных и фактических параметров сверяется
//на этапе построения семантического дерева. При необходимости при построении семантического дерева
//вставляются узлы преобрызования типов.
2015-05-14 22:35:07 +03:00
IExpressionNode [ ] parameters
{
get ;
}
2015-12-28 14:25:15 +03:00
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ILambdaFunctionNode lambda
{
get ;
}
}
/ * public interface ICompiledFunctionNode : IFunctionNode
{
string test
{
get ;
}
} * /
}