pascalabcnet/SemanticTree/SemanticTree.cs

2632 lines
62 KiB
C#
Raw Permalink Normal View History

// 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
{
//Вид объекта.
//basic-базовый объект, не определяемый в программе, например метод сложения двух целых чисел.
//common-обычный тип, метод и т.д., определяемый пользователем.
//compiled-тип, метод или другой узел, определяемый пользователем.
2015-05-14 22:35:07 +03:00
public enum node_kind {basic,common,compiled,indefinite};
//Уровень доступа класса. Хотя зачем я это пишу? И так понятно из названия.
2015-05-14 22:35:07 +03:00
public enum type_access_level {tal_public,tal_internal};
//Как мы будем представлять ссылочные и размерные типы?
2015-05-14 22:35:07 +03:00
//public enum reference_or_value_type {reference_type,value_type};
//Расположение элемента - в функции, в классе, в пространстве имен.
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-05-14 22:35:07 +03:00
public enum field_access_level { fal_private, fal_internal, fal_protected, fal_public };
//Обычный, статический или виртуальный элемент класса.
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 ...
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-05-14 22:35:07 +03:00
public interface IDocument
{
//Полный путь к файлу.
2015-05-14 22:35:07 +03:00
string file_name
{
get;
}
}
//Документ и позиция в которой описан этот узел.
2015-05-14 22:35:07 +03:00
public interface ILocation
{
//Строка, в которой распологается начало данного элемента.
2015-05-14 22:35:07 +03:00
int begin_line_num
{
get;
}
//Столбец, в которой распологается начало данного элемента.
2015-05-14 22:35:07 +03:00
int begin_column_num
{
get;
}
//Строка, в которой распологается конец данного элемента.
2015-05-14 22:35:07 +03:00
int end_line_num
{
get;
}
//Столбец, в которой распологается конец данного элемента.
2015-05-14 22:35:07 +03:00
int end_column_num
{
get;
}
//Документ, в котором определен данный элемент дерева.
string file_name
2015-05-14 22:35:07 +03:00
{
get;
}
}
public interface ILocated
{
ILocation Location
{
get;
}
}
//Базовый интерфейс для всех интерфейсов узлов дерева.
2015-05-14 22:35:07 +03:00
public interface ISemanticNode
{
void visit(ISemanticVisitor visitor);
}
//Базовый класс, для пердставления определений в программе (определений типов, переменных и т.д.). Никогда не создается.
2015-05-14 22:35:07 +03:00
public interface IDefinitionNode : ISemanticNode
{
string Documentation
{
get;
}
IAttributeNode[] Attributes
{
get;
}
}
//Базовый интерфейс для классов, которые описывают типы. Никогда не создается.
2015-05-14 22:35:07 +03:00
public interface ITypeNode : IDefinitionNode
{
//Вид узла - базовый(basic), обычный (common) или экспортируемый (compiled).
2015-05-14 22:35:07 +03:00
node_kind node_kind
{
get;
}
//Имя типа. Для языков не чувствительных к регистрам хранит имя в том виде, в каком тип объявлен.
2015-05-14 22:35:07 +03:00
string name
{
get;
}
//Базовый тип для данного типа. Для object-а =null.
2015-05-14 22:35:07 +03:00
ITypeNode base_type
{
get;
}
bool is_value_type
{
get;
}
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
{
get;
}
List<ITypeNode> ImplementingInterfacesOrEmpty
2015-05-14 22:35:07 +03:00
{
get;
}
//Является ли 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-05-14 22:35:07 +03:00
bool depended_from_indefinite
{
get;
}
//Описание 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
}
//Интерфейс для описания базовых типов.
//При генерации .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-05-14 22:35:07 +03:00
public interface ITypeSynonym : IDefinitionNode, ILocated
{
//Имя типа. Для языков не чувствительных к регистрам хранит имя в том виде, в каком тип объявлен.
2015-05-14 22:35:07 +03:00
string name
{
get;
}
//Тип, которому даётся синоним
2015-05-14 22:35:07 +03:00
ITypeNode original_type
{
get;
}
}
public interface ITemplateClass : IDefinitionNode
{
byte[] serialized_tree
{
get;
}
string name
{
get;
}
}
//Интерфейс для generic-типов
2015-05-14 22:35:07 +03:00
public interface IGenericInstance
{
List<ITypeNode> generic_parameters
{
get;
}
}
//Интерфейс для 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-05-14 22:35:07 +03:00
public interface ICommonTypeNode : ITypeNode, INamespaceMemberNode, ILocated
{
bool IsSealed
{
get;
}
//Тип public или internal.
2015-05-14 22:35:07 +03:00
type_access_level type_access_level
{
get;
}
//Методы типа.
2015-05-14 22:35:07 +03:00
ICommonMethodNode[] methods
{
get;
}
//Поля типа.
2015-05-14 22:35:07 +03:00
ICommonClassFieldNode[] fields
{
get;
}
//Свойства типа.
2015-05-14 22:35:07 +03:00
ICommonPropertyNode[] properties
{
get;
}
//Константы, определенные в типе.
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;
}
//(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;
}
}
//Интерфейс для описания типов, экспортируемых из сборки.
//Для представления откомпилированных типов я обращаюсь непосредственно к System.Reflection.
//Это завязывает нашу систему на .Net. Можно избавится от этого с помощью введения дополнительного уровня абстракции.
//Для этого нужно определить, какие данные нам нужны от откомпилированных типов, и сделать еще одну прослойку
//между System.Reflection и нашими типами. Тогда при генерации кода под другую платформу (например машинного кода)
//нужно будет только привязать прослойку к другому источнику данных. Например, информация о типах будет
//браться не из сборок, а из dll-библиотек. Я не могу сейчас сделать эту прослойку, т.к. я пока не определил
//какие запросы нужны к откомпилированным модулям. Поэтому пока я использую System.Reflection в котором
//вроде все есть. Потом нужно будет обсудить вопрос создания этой прослойки.
2015-05-14 22:35:07 +03:00
public interface ICompiledTypeNode : ITypeNode
{
//Откомпилированный тип.
2015-05-14 22:35:07 +03:00
System.Type compiled_type
{
get;
}
int rank
{
get;
}
}
//Интерфейс, представляющий индексируемый с 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;
}
}
//Базовый интерфейс для 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-05-14 22:35:07 +03:00
public interface IExpressionNode : IStatementNode
{
//Тип выражения.
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-05-14 22:35:07 +03:00
public interface IFunctionCallNode : IExpressionNode
{
//Список фактических параметров. Количество и типы формальных и фактических параметров сверяется
//на этапе построения семантического дерева. При необходимости при построении семантического дерева
//вставляются узлы преобрызования типов.
2015-05-14 22:35:07 +03:00
IExpressionNode[] real_parameters
{
get;
}
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
IFunctionNode function
{
get;
}
//ssyy
//Нужно для генерации унаследованных интерфейсных функций
2015-05-14 22:35:07 +03:00
bool last_result_function_call
{
get;
set;
}
//\ssyy
}
//Вызов базового метода.
2015-05-14 22:35:07 +03:00
public interface IBasicFunctionCallNode : IFunctionCallNode
{
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
IBasicFunctionNode basic_function
{
get;
}
}
public interface INonStaticMethodCallNode : IFunctionCallNode
{
bool virtual_call
{
get;
set;
}
}
//Вызов функции, определенной в пространстве имен.
2015-05-14 22:35:07 +03:00
public interface ICommonNamespaceFunctionCallNode : IFunctionCallNode
{
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode namespace_function
{
get;
}
}
//Вызов функции, определенной в другой функции.
2015-05-14 22:35:07 +03:00
public interface ICommonNestedInFunctionFunctionCallNode : IFunctionCallNode
{
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICommonNestedInFunctionFunctionNode common_function
{
get;
}
//Статическая глубина вложенной функции.
2015-05-14 22:35:07 +03:00
int static_depth
{
get;
}
}
//Вызов метода класса.
2015-05-14 22:35:07 +03:00
public interface ICommonMethodCallNode : INonStaticMethodCallNode
{
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICommonMethodNode method
{
get;
}
//Экземпляр класса, данный метод которого нужно вызвать.
2015-05-14 22:35:07 +03:00
IExpressionNode obj
{
get;
}
}
//Узел, соответствующий указателю 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-05-14 22:35:07 +03:00
public interface ICommonStaticMethodCallNode : IFunctionCallNode
{
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICommonMethodNode static_method
{
get;
}
//Тип, статический метод которого вызываем.
2015-05-14 22:35:07 +03:00
ICommonTypeNode common_type
{
get;
}
}
//Вызов конструктора common-класса.
2015-05-14 22:35:07 +03:00
public interface ICommonConstructorCall : ICommonStaticMethodCallNode
{
//ssyy
bool new_obj_awaited();
//\ssyy
}
//Вызов откомпилированного метода.
2015-05-14 22:35:07 +03:00
public interface ICompiledMethodCallNode : INonStaticMethodCallNode
{
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICompiledMethodNode compiled_method
{
get;
}
//Экземпляр класса, данный метод которого нужно вызвать.
2015-05-14 22:35:07 +03:00
IExpressionNode obj
{
get;
}
}
//Вызов статического метода, откомптлированного класса.
2015-05-14 22:35:07 +03:00
public interface ICompiledStaticMethodCallNode : IFunctionCallNode
{
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ICompiledMethodNode static_method
{
get;
}
//Тип, статический метод которого мы вызываем.
2015-05-14 22:35:07 +03:00
ICompiledTypeNode compiled_type
{
get;
}
ITypeNode[] template_parametres
{
get;
}
}
//Вызов конструктора откомпилированного метода.
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-05-14 22:35:07 +03:00
public interface IFunctionNode : IDefinitionNode
{
//Вид узла - базовый (basic), обычный (common) или экспортируемый (compiled).
2015-05-14 22:35:07 +03:00
node_kind node_kind
{
get;
}
//Список формальных параметров функции.
2015-05-14 22:35:07 +03:00
IParameterNode[] parameters
{
get;
}
//Тип возвращаемого значения функции.
2015-05-14 22:35:07 +03:00
ITypeNode return_value_type
{
get;
}
//Имя функции. Для языков не чувствительных к регистру - в том виде, в котором функция определена.
2015-05-14 22:35:07 +03:00
string name
{
get;
}
//Расположение функции - в функции, в классе, в пространстве имен.
2015-05-14 22:35:07 +03:00
node_location_kind node_location_kind
{
get;
}
//Является ли generic-функцией
2015-05-14 22:35:07 +03:00
bool is_generic_function
{
get;
}
//Число типов-параметров generic-функции. 0 для не-generic.
2015-05-14 22:35:07 +03:00
int generic_parameters_count
{
get;
}
}
//Интерфейс члена класса.
2015-05-14 22:35:07 +03:00
public interface IClassMemberNode
{
//Тип, содержащий этот член класса.
2015-05-14 22:35:07 +03:00
ITypeNode comperehensive_type
{
get;
}
//Статический, обычный или виртуальный метод.
2015-05-14 22:35:07 +03:00
polymorphic_state polymorphic_state
{
get;
}
//Уровень доступа к члену класса.
2015-05-14 22:35:07 +03:00
field_access_level field_access_level
{
get;
}
}
//Интерфейс члена откомпилированного класса.
2015-05-14 22:35:07 +03:00
public interface ICompiledClassMemberNode : IClassMemberNode
{
//Тип, содержащий член класса.
2015-05-14 22:35:07 +03:00
ICompiledTypeNode comprehensive_type
{
get;
}
}
//Интерфейс члена обычного класса.
2015-05-14 22:35:07 +03:00
public interface ICommonClassMemberNode : IClassMemberNode
{
//Тип, содержащий член класса.
2015-05-14 22:35:07 +03:00
ICommonTypeNode common_comprehensive_type
{
get;
}
}
//Интерфейс переменной или функции, определенной внутри функции.
2015-05-14 22:35:07 +03:00
public interface IFunctionMemberNode
{
//Функция, содержащая этот обьъект.
2015-05-14 22:35:07 +03:00
ICommonFunctionNode function
{
get;
}
}
//Интерфейс переменной или функции, определенной в пространстве имен.
2015-05-14 22:35:07 +03:00
public interface INamespaceMemberNode
{
//Пространство имен, в котором определен элемент.
2015-05-14 22:35:07 +03:00
ICommonNamespaceNode comprehensive_namespace
{
get;
}
}
//Класс для описания базовых, нигде не определенных функций (например, сложение двух целых чисел).
2015-05-14 22:35:07 +03:00
public interface IBasicFunctionNode : IFunctionNode
{
//Какая именно это базовая функция.
2015-05-14 22:35:07 +03:00
basic_function_type basic_function_type
{
get;
}
}
public enum SpecialFunctionKind
{
None, New, Dispose, NewArray
}
//Интерфейс для описания функции, определяемой пользователем.
2015-05-14 22:35:07 +03:00
public interface ICommonFunctionNode : IFunctionNode, ILocated
{
SpecialFunctionKind SpecialFunctionKind
{
get;
}
bool is_overload
{
get;
}
//Список переменных, определяемых в функции.
2015-05-14 22:35:07 +03:00
ILocalVariableNode[] var_definition_nodes
{
get;
}
//Список вложенных функций.
2015-05-14 22:35:07 +03:00
ICommonNestedInFunctionFunctionNode[] functions_nodes
{
get;
}
//Код функции.
2015-05-14 22:35:07 +03:00
IStatementNode function_code
{
get;
}
//Переменная, которая содержит возвращаемое значение функции. Для процедур - null.
2015-05-14 22:35:07 +03:00
ILocalVariableNode return_variable
{
get;
}
//Константы, определенные в функции.
2015-05-14 22:35:07 +03:00
ICommonFunctionConstantDefinitionNode[] constants
{
get;
}
//Generic-параметры функции
2015-05-14 22:35:07 +03:00
List<ICommonTypeNode> generic_params
{
get;
}
}
//Функция, определенная непосредственно в пространстве имен.
2015-05-14 22:35:07 +03:00
public interface ICommonNamespaceFunctionNode : ICommonFunctionNode, INamespaceMemberNode
{
//Прстранство имен, в котором определена эта функция.
2015-05-14 22:35:07 +03:00
ICommonNamespaceNode namespace_node
{
get;
}
ITypeNode ConnectedToType
{
get;
}
}
//Функция, определенная в другой функции.
2015-05-14 22:35:07 +03:00
public interface ICommonNestedInFunctionFunctionNode : ICommonFunctionNode, IFunctionMemberNode
{
}
//Метод класса, определяемый пользователем.
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;
}
}
//Класс для описания экспортируемых (compiled) функций.
2015-05-14 22:35:07 +03:00
public interface ICompiledMethodNode : IFunctionNode, ICompiledClassMemberNode
{
//Откомпилированный метод.
2015-05-14 22:35:07 +03:00
System.Reflection.MethodInfo method_info
{
get;
}
bool is_extension
{
get;
}
}
//Вызов конструктора откомпилированного типа.
2015-05-14 22:35:07 +03:00
public interface ICompiledConstructorNode : IFunctionNode, ICompiledClassMemberNode
{
System.Reflection.ConstructorInfo constructor_info
{
get;
}
}
//Интерфейс для описания конструкции if.
2015-05-14 22:35:07 +03:00
public interface IIfNode : IStatementNode
{
//Условие.
2015-05-14 22:35:07 +03:00
IExpressionNode condition
{
get;
}
//Тело then.
2015-05-14 22:35:07 +03:00
IStatementNode then_body
{
get;
}
//Тело else. Если if без then это свойство = null.
2015-05-14 22:35:07 +03:00
IStatementNode else_body
{
get;
}
}
//Интерфейс для конструкции while.
2015-05-14 22:35:07 +03:00
public interface IWhileNode : IStatementNode
{
//Условие.
2015-05-14 22:35:07 +03:00
IExpressionNode condition
{
get;
}
//Тело while.
2015-05-14 22:35:07 +03:00
IStatementNode body
{
get;
}
}
//Интерфейс для конструкции repeat.
2015-05-14 22:35:07 +03:00
public interface IRepeatNode : IStatementNode
{
//Тело do .. while (repeat .. until).
2015-05-14 22:35:07 +03:00
IStatementNode body
{
get;
}
//Условие.
2015-05-14 22:35:07 +03:00
IExpressionNode condition
{
get;
}
}
//Класс для описания конструкции for.
//For - C++/C# - овский. Для моделирования паскалевского for он преобразуется в эту конструкцию.
2015-05-14 22:35:07 +03:00
public interface IForNode : IStatementNode
{
//Инициализация переменных цикла.
2015-05-14 22:35:07 +03:00
IStatementNode initialization_statement
{
get;
}
//Условие продолжения цикла.
2015-05-14 22:35:07 +03:00
IExpressionNode while_expr
{
get;
}
IExpressionNode init_while_expr
{
get;
}
//Изменение счетчиков цикла.
2015-05-14 22:35:07 +03:00
IStatementNode increment_statement
{
get;
}
//Тело цикла.
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
{
}
//Один из вариантов констракции swithc.
2015-05-14 22:35:07 +03:00
public interface ICaseVariantNode : IStatementNode
{
//Выражения, при которых нужно исполгить код, соответствующий этому узлу.
2015-05-14 22:35:07 +03:00
IExpressionNode[] expressions
{
get;
}
//Диапазоны, при попадании в которые нужно исполнить код, соответствующий этому узлу.
2015-05-14 22:35:07 +03:00
IRangExpression[] ranges
{
get;
}
//Код этого узла.
2015-05-14 22:35:07 +03:00
IStatementNode statement
{
get;
}
}
public interface IRangeExpression : IExpressionNode
{
IExpressionNode lower_bound
{
get;
}
IExpressionNode upper_bound
{
get;
}
}*/
//Интерфейс для описания списка statement-ов.
2015-05-14 22:35:07 +03:00
public interface IStatementsListNode : IStatementNode
{
ILocalBlockVariableNode[] LocalVariables
{
get;
}
//Список statement-ов.
2015-05-14 22:35:07 +03:00
IStatementNode[] statements
{
get;
}
//Положение левой логической скобки
2015-05-14 22:35:07 +03:00
ILocation LeftLogicalBracketLocation
{
get;
}
//Положение правой логической скобки
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-05-14 22:35:07 +03:00
public interface INamespaceNode : IDefinitionNode
{
string namespace_name
{
get;
}
}
//Узел пространства имен, определенного пользователем.
2015-05-14 22:35:07 +03:00
public interface ICommonNamespaceNode : INamespaceNode, ILocated
{
//Пространства имен, вложенные в это пространство имен.
2015-05-14 22:35:07 +03:00
ICommonNamespaceNode[] nested_namespaces
{
get;
}
//Пространство имен, в которое вложенно это пространство имен.
2015-05-14 22:35:07 +03:00
INamespaceNode comprehensive_namespace
{
get;
}
//Типы, описанные в namespace.
2015-05-14 22:35:07 +03:00
ICommonTypeNode[] types
{
get;
}
ITypeSynonym[] type_synonims
{
get;
}
ITemplateClass[] templates
{
get;
}
//Переменные, описанные в этом namespace.
2015-05-14 22:35:07 +03:00
ICommonNamespaceVariableNode[] variables
{
get;
}
//Функции, описанные в namespace.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode[] functions
{
get;
}
//Константы, описанные в namespace. Они должны экспортироваться как нибудь.
2015-05-14 22:35:07 +03:00
INamespaceConstantDefinitionNode[] constants
{
get;
}
ICommonNamespaceEventNode[] events
{
get;
}
bool IsMain
{
get;
}
}
//Откомпилированное пространство имен.
2015-05-14 22:35:07 +03:00
public interface ICompiledNamespaceNode : INamespaceNode
{
}
/// Базовый интерфейс для программ и dll.
2015-05-14 22:35:07 +03:00
public interface IProgramBase : IDefinitionNode, ILocated
{
//Пространства имен, содержащиеся в программе или dll.
2015-05-14 22:35:07 +03:00
ICommonNamespaceNode[] namespaces
{
get;
}
string[] UsedNamespaces
{
get;
}
}
//Узел dll библиотеки.
2015-05-14 22:35:07 +03:00
public interface IDllNode : IProgramBase
{
//Метод инициализации dll.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode initialization_function
{
get;
}
//Метод финализации dll.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode finalization_function
{
get;
}
}
//Корневой узел программы.
2015-05-14 22:35:07 +03:00
public interface IProgramNode : IProgramBase
{
//Главная функция. Ее выполнение равносильно выполнению программы.
//Она включает вызовы методов инициализации модулей (в начале), выполнение основной программы
//и вызовы методов финализации модулей.
2015-05-14 22:35:07 +03:00
ICommonNamespaceFunctionNode main_function
{
get;
}
//Инстанции generic-типов, использующиеся в программе.
2015-05-14 22:35:07 +03:00
List<IGenericTypeInstance> generic_type_instances
{
get;
}
//Инстанции generic-типов, использующиеся в программе.
2015-05-14 22:35:07 +03:00
List<IGenericFunctionInstance> generic_function_instances
{
get;
}
IStatementNode InitializationCode
{
get;
}
}
//Тип выражений, которые могут возвращать адрес (например переменная).
2015-05-14 22:35:07 +03:00
public interface IAddressedExpressionNode : IExpressionNode
{
}
//Оператор return.
2015-05-14 22:35:07 +03:00
public interface IReturnNode : IStatementNode
{
IExpressionNode return_value
{
get;
}
}
//ssyy добавил
//Оператор return из .ctor.
2015-05-14 22:35:07 +03:00
/*public interface ICtorReturnNode : IStatementNode
{
}*/
//\ssyy
public interface IReferenceNode : IAddressedExpressionNode
{
//Определение локальной переменной.
2015-05-14 22:35:07 +03:00
IVAriableDefinitionNode Variable
{
get;
}
}
//Интерфейс, представляющий обращение к локальной переменной в теле программы.
2015-05-14 22:35:07 +03:00
public interface ILocalVariableReferenceNode : IReferenceNode
{
//Определение локальной переменной.
2015-05-14 22:35:07 +03:00
ILocalVariableNode variable
{
get;
}
//Разность статических глубин, между определением и вхождением.
2015-05-14 22:35:07 +03:00
int static_depth
{
get;
}
}
//Интерфейс, представляющий обращение к локальной переменной в блоке.
2015-05-14 22:35:07 +03:00
public interface ILocalBlockVariableReferenceNode : IReferenceNode
{
//Определение локальной переменной.
2015-05-14 22:35:07 +03:00
ILocalBlockVariableNode Variable
{
get;
}
}
//Интерфейс, представляющий обращение к переменной, определенной непосредственно в namespace.
2015-05-14 22:35:07 +03:00
public interface INamespaceVariableReferenceNode : IReferenceNode
{
//Переменная.
2015-05-14 22:35:07 +03:00
ICommonNamespaceVariableNode variable
{
get;
}
}
//Интерфейс, представляющий обращение к полю класса.
2015-05-14 22:35:07 +03:00
public interface ICommonClassFieldReferenceNode : IReferenceNode
{
//Поле класса.
2015-05-14 22:35:07 +03:00
ICommonClassFieldNode field
{
get;
}
//Объект класса.
2015-05-14 22:35:07 +03:00
IExpressionNode obj
{
get;
}
}
//Интерфейс, представляющий обращение к статическому полю класса.
2015-05-14 22:35:07 +03:00
public interface IStaticCommonClassFieldReferenceNode : IReferenceNode
{
//Статическое поле класса.
2015-05-14 22:35:07 +03:00
ICommonClassFieldNode static_field
{
get;
}
//Класс, к статическому методу которого мы обращаемся.
2015-05-14 22:35:07 +03:00
ICommonTypeNode class_type
{
get;
}
}
//Обращение к полю откомпилированного класса.
2015-05-14 22:35:07 +03:00
public interface ICompiledFieldReferenceNode : IReferenceNode
{
//Поле класса.
2015-05-14 22:35:07 +03:00
ICompiledClassFieldNode field
{
get;
}
//Объект класса.
2015-05-14 22:35:07 +03:00
IExpressionNode obj
{
get;
}
}
//Интерфейс, представляющий обращение к статическому полю откомпилированного класса.
2015-05-14 22:35:07 +03:00
public interface IStaticCompiledFieldReferenceNode : IReferenceNode
{
//Поле класса.
2015-05-14 22:35:07 +03:00
ICompiledClassFieldNode static_field
{
get;
}
//Класс, к статическому полю которого мы обращаемся.
2015-05-14 22:35:07 +03:00
ICompiledTypeNode class_type
{
get;
}
}
//Обращение к параметру метода.
2015-05-14 22:35:07 +03:00
public interface ICommonParameterReferenceNode : IReferenceNode
{
//Параметр метода, к которому мы обращаемся.
2015-05-14 22:35:07 +03:00
ICommonParameterNode parameter
{
get;
}
//Разность статических глубин, между обращением к параметру и методом в котором он объявлен.
2015-05-14 22:35:07 +03:00
int static_depth
{
get;
}
}
//Базовый узел для представления констант в теле программы (не именованных констант, а чисел, строк и т.д.).
2015-05-14 22:35:07 +03:00
public interface IConstantNode : IExpressionNode
{
object value
{
get;
}
}
//Интерфейс для представления булевских констант.
2015-05-14 22:35:07 +03:00
public interface IBoolConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
bool constant_value
{
get;
}
}
//Интерфейс для представления byte констант.
2015-05-14 22:35:07 +03:00
public interface IByteConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
byte constant_value
{
get;
}
}
//Интерфейс для представления signed byte констант.
2015-05-14 22:35:07 +03:00
public interface ISByteConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
sbyte constant_value
{
get;
}
}
//Интерфейс для представления signed short констант.
2015-05-14 22:35:07 +03:00
public interface IShortConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
short constant_value
{
get;
}
}
//Интерфейс для представления unsigned short констант.
2015-05-14 22:35:07 +03:00
public interface IUShortConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
ushort constant_value
{
get;
}
}
//Интерфейс для представления int констант.
2015-05-14 22:35:07 +03:00
public interface IIntConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
int constant_value
{
get;
}
}
//Интерфейс для представления BigInteger констант.
public interface IBigIntConstantNode : IConstantNode
{
//Значение константы.
System.Numerics.BigInteger constant_value
{
get;
}
}
//Интерфейс для представления unsigned int констант.
2015-05-14 22:35:07 +03:00
public interface IUIntConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
uint constant_value
{
get;
}
}
//Интерфейс для представления long констант.
2015-05-14 22:35:07 +03:00
public interface ILongConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
long constant_value
{
get;
}
}
//Интерфейс для представления unsigned long констант.
2015-05-14 22:35:07 +03:00
public interface IULongConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
ulong constant_value
{
get;
}
}
//Интерфейс для представления float констант.
2015-05-14 22:35:07 +03:00
public interface IFloatConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
float constant_value
{
get;
}
}
//Интерфейс для представления double констант.
2015-05-14 22:35:07 +03:00
public interface IDoubleConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
double constant_value
{
get;
}
}
//Интерфейс для представления char констант (этот класс для 2-байтных char - widechar в delphi).
2015-05-14 22:35:07 +03:00
public interface ICharConstantNode : IConstantNode
{
//Значение константы.
2015-05-14 22:35:07 +03:00
char constant_value
{
get;
}
}
//Интерфейс для представления string-констант.
2015-05-14 22:35:07 +03:00
public interface IStringConstantNode : IConstantNode
{
//Значение константы.
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;
}
}
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-05-14 22:35:07 +03:00
public interface IAssignNode : IExpressionNode
{
//Чему присваиванием.
2015-05-14 22:35:07 +03:00
IAddressedExpressionNode to
{
get;
}
//Что присваиваем.
2015-05-14 22:35:07 +03:00
IExpressionNode from
{
get;
}
}*/
//Базовй интерфейс для формальных параметров функций, локальных переменных, глобальных переменных программы и модуля и полей класса. Нигде не создается.
2015-05-14 22:35:07 +03:00
public interface IVAriableDefinitionNode : IDefinitionNode
{
//Имя переменной.
2015-05-14 22:35:07 +03:00
string name
{
get;
}
//Тип переменной.
2015-05-14 22:35:07 +03:00
ITypeNode type
{
get;
}
IExpressionNode inital_value
{
get;
}
//Раположение переменной.
2015-05-14 22:35:07 +03:00
node_location_kind node_location_kind
{
get;
}
}
//Интерфейс для описания локальных переменных.
2015-05-14 22:35:07 +03:00
public interface ILocalVariableNode : IVAriableDefinitionNode, IFunctionMemberNode, ILocated
{
//Используется, ли переменная во вложенных функчиях. Исрользуется для оптимизации.
2015-05-14 22:35:07 +03:00
bool is_used_as_unlocal
{
get;
}
}
//Интерфейс для описания локальных переменных.
2015-05-14 22:35:07 +03:00
public interface ILocalBlockVariableNode : IVAriableDefinitionNode, ILocated
{
IStatementsListNode Block
{
get;
}
}
//Интерфейс, представляющий глобальную переменную, описанную в модуле или программе.
2015-05-14 22:35:07 +03:00
public interface ICommonNamespaceVariableNode : IVAriableDefinitionNode, INamespaceMemberNode, ILocated
{
}
//Интерфейс для описания полей класса.
2015-05-14 22:35:07 +03:00
public interface ICommonClassFieldNode: IVAriableDefinitionNode, ICommonClassMemberNode, ILocated
{
}
//Переменная, определенная в откомпилированном классе.
2015-05-14 22:35:07 +03:00
public interface ICompiledClassFieldNode : IVAriableDefinitionNode, ICompiledClassMemberNode
{
System.Reflection.FieldInfo compiled_field
{
get;
}
}
//Базовый интерфейс для интерфейсов, представляющих параметры базовых, обычных и откомпилированных функций.
2015-05-14 22:35:07 +03:00
public interface IParameterNode : IVAriableDefinitionNode
{
//Тип параметра.
2015-05-14 22:35:07 +03:00
parameter_type parameter_type
{
get;
}
//Функция, в которой описан этот праметр.
2015-05-14 22:35:07 +03:00
IFunctionNode function
{
get;
}
bool is_params
{
get;
}
bool is_const
{
get;
}
IExpressionNode default_value
{
get;
}
}
//Интерфейс для представления параметров common функций.
2015-05-14 22:35:07 +03:00
public interface ICommonParameterNode : IParameterNode, ILocated
{
//Функция, в которой определен параметер.
2015-05-14 22:35:07 +03:00
ICommonFunctionNode common_function
{
get;
}
//Используется ли параметр во вложенных функциях.
2015-05-14 22:35:07 +03:00
bool is_used_as_unlocal
{
get;
}
}
//Интерфейс, представляющий параметры базовых функций.
2015-05-14 22:35:07 +03:00
public interface IBasicParameterNode : IParameterNode
{
}
//Интерфейс, представляющий параметры откомпилироанных функций.
2015-05-14 22:35:07 +03:00
public interface ICompiledParameterNode : IParameterNode
{
//Функция, в которой определен параметер.
2015-05-14 22:35:07 +03:00
ICompiledMethodNode compiled_function
{
get;
}
}
//Интерфейс, описывающий определение константы.
2015-05-14 22:35:07 +03:00
public interface IConstantDefinitionNode : IDefinitionNode
{
//Имя константы.
2015-05-14 22:35:07 +03:00
string name
{
get;
}
//Тип константы.
2015-05-14 22:35:07 +03:00
ITypeNode type
{
get;
}
//Значение константы.
2015-05-14 22:35:07 +03:00
IConstantNode constant_value
{
get;
}
}
//Константа, определенная в классе.
2015-05-14 22:35:07 +03:00
public interface IClassConstantDefinitionNode : IConstantDefinitionNode, IClassMemberNode, ILocated
{
}
public interface ICompiledClassConstantDefinitionNode : IConstantDefinitionNode, IClassMemberNode
{
ICompiledTypeNode comprehensive_type
{
get;
}
}
//Константа, определенная в пространстве имен.
2015-05-14 22:35:07 +03:00
public interface INamespaceConstantDefinitionNode : IConstantDefinitionNode, ILocated
{
ICommonNamespaceNode comprehensive_namespace
{
get;
}
}
//Константа, определенная в функции.
2015-05-14 22:35:07 +03:00
public interface ICommonFunctionConstantDefinitionNode : IConstantDefinitionNode, ILocated
{
ICommonFunctionNode comprehensive_function
{
get;
}
}
//Константа, определенная в откомпилированном типе.
2015-05-14 22:35:07 +03:00
public interface ICompiledConstantNode : IConstantDefinitionNode
{
ICompiledTypeNode comprehensive_type
{
get;
}
}
//Узел, описывающий свойство класса. Никогда не создается.
2015-05-14 22:35:07 +03:00
public interface IPropertyNode : IDefinitionNode
{
//Вид объекта (basic, common, compiled).
2015-05-14 22:35:07 +03:00
node_kind node_kind
{
get;
}
//Имя свойства.
2015-05-14 22:35:07 +03:00
string name
{
get;
}
//Тип, который содержит это свойство.
2015-05-14 22:35:07 +03:00
ITypeNode comprehensive_type
{
get;
}
//Тип свойства.
2015-05-14 22:35:07 +03:00
ITypeNode property_type
{
get;
}
//Функция, которая возвращает значение свойства.
2015-05-14 22:35:07 +03:00
IFunctionNode get_function
{
get;
}
//Функция, которая устанавливает значение свойства.
2015-05-14 22:35:07 +03:00
IFunctionNode set_function
{
get;
}
IParameterNode[] parameters
{
get;
}
}
//Определяемое пользователем свойство.
2015-05-14 22:35:07 +03:00
public interface ICommonPropertyNode : IPropertyNode, ICommonClassMemberNode, ILocated
{
//Тип, который содержит это свойство.
2015-05-14 22:35:07 +03:00
/*ICommonTypeNode common_comprehensive_type
{
get;
}*/
//Функция, которая возвращает значение свойства.
2015-05-14 22:35:07 +03:00
/*ICommonClassMemberNode get_common_function
{
get;
}
//Функция, которая устанавливает значение свойства.
2015-05-14 22:35:07 +03:00
ICommonClassMemberNode set_common_function
{
get;
}*/
}
//Базовое свойство. Пока нигде не нужно, но для реализации машинного кода может очень пригодится.
2015-05-14 22:35:07 +03:00
public interface IBasicPropertyNode : IPropertyNode
{
}
//Свойство в откомпилированном типе.
2015-05-14 22:35:07 +03:00
public interface ICompiledPropertyNode : IPropertyNode, ICompiledClassMemberNode
{
//Свойство в сборке.
2015-05-14 22:35:07 +03:00
System.Reflection.PropertyInfo property_info
{
get;
}
//Тип, который содержит это свойство.
2015-05-14 22:35:07 +03:00
ICompiledTypeNode compiled_comprehensive_type
{
get;
}
//Функция, которая возвращает значение свойства.
2015-05-14 22:35:07 +03:00
ICompiledMethodNode compiled_get_method
{
get;
}
//Функция, которая устанавливает значение свойства.
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-05-14 22:35:07 +03:00
string name
{
get;
}
//встречена ли метка в коде
2015-05-14 22:35:07 +03:00
/*bool is_defined
{
get;
set;
}*/
}
public interface ILabeledStatementNode : IStatementNode, ILocated
{
//Метка, которой помечен statement
2015-05-14 22:35:07 +03:00
ILabelNode label
{
get;
}
//Сама инструкция
2015-05-14 22:35:07 +03:00
IStatementNode statement
{
get;
}
}
public interface IGotoStatementNode : IStatementNode, ILocated
{
//Метка, на которую происходит переход
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-07-01 00:16:43 +03:00
ITypeNode ElementType
{
get;
}
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
{
//Вид узла - базовый (basic), обычный (common) или экспортируемый (compiled).
2015-05-14 22:35:07 +03:00
node_kind node_kind
{
get;
}
//Список формальных параметров функции.
2015-05-14 22:35:07 +03:00
IParameterNode[] parameters
{
get;
}
//Тип возвращаемого значения функции.
2015-05-14 22:35:07 +03:00
ITypeNode return_value_type
{
get;
}
IStatementNode body
{
get;
}
IFunctionNode function
{
get;
}
//Расположение функции - в функции, в классе, в пространстве имен.
2015-05-14 22:35:07 +03:00
node_location_kind node_location_kind
{
get;
}
//Является ли generic-функцией
2015-05-14 22:35:07 +03:00
bool is_generic_function
{
get;
}
//Число типов-параметров generic-функции. 0 для не-generic.
2015-05-14 22:35:07 +03:00
int generic_parameters_count
{
get;
}
}
public interface ILambdaFunctionCallNode : IExpressionNode
{
//Список фактических параметров. Количество и типы формальных и фактических параметров сверяется
//на этапе построения семантического дерева. При необходимости при построении семантического дерева
//вставляются узлы преобрызования типов.
2015-05-14 22:35:07 +03:00
IExpressionNode[] parameters
{
get;
}
//Вызываемый метод.
2015-05-14 22:35:07 +03:00
ILambdaFunctionNode lambda
{
get;
}
}
/*public interface ICompiledFunctionNode : IFunctionNode
{
string test
{
get;
}
}*/
}