2019-07-28 23:53:15 +03:00
|
|
|
|
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
|
2015-06-01 22:15:17 +03:00
|
|
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
2015-05-14 22:35:07 +03:00
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
|
|
namespace PascalABCCompiler.TreeRealization
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Каждый узел семантического дерева должен уметь возвращать свой тип.
|
|
|
|
|
|
/// Это список всех возможных типов узлов семантического дерева.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public enum semantic_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
none, namespace_constant_definition, class_constant_definition, function_constant_definition, compiled_class_constant_definition,
|
|
|
|
|
|
bool_const_node, long_const_node, byte_const_node, int_const_node, double_const_node, char_const_node,
|
|
|
|
|
|
sbyte_const_node, short_const_node, ushort_const_node, uint_const_node, ulong_const_node, float_const_node,
|
|
|
|
|
|
basic_function_call, common_namespace_function_call, common_in_function_function_call, common_method_call,
|
|
|
|
|
|
common_static_method_call, compiled_function_call, compiled_static_method_call,
|
|
|
|
|
|
basic_function_node, common_namespace_function_node, common_in_function_function_node, common_method_node,
|
|
|
|
|
|
compiled_function_node, common_namespace_node, compiled_namespace_node, program_node, dll_node,
|
|
|
|
|
|
common_property_node, basic_property_node, compiled_property_node, if_node, while_node, repeat_node, for_node,
|
|
|
|
|
|
statements_list, basic_type_node, common_type_node, compiled_type_node, common_unit_node, compiled_unit_node, local_variable_reference,
|
|
|
|
|
|
namespace_variable_reference, class_field_reference, static_class_field_reference, compiled_variable_reference,
|
|
|
|
|
|
static_compiled_variable_reference, common_parameter_reference, local_variable, namespace_variable, class_field,
|
|
|
|
|
|
compiled_variable_definition, basic_parameter, compiled_parameter, common_parameter, basic_interface_node,
|
|
|
|
|
|
empty_statement, this_node, return_node, string_const_node, empty_function_node, common_constructor_call,
|
|
|
|
|
|
compiled_constructor_call, pseudo_function, while_break_node, repeat_break_node, for_break_node,
|
|
|
|
|
|
while_continue_node, repeat_continue_node, for_continue_node, compiled_constructor_node, simple_array,
|
|
|
|
|
|
static_property_reference, non_static_property_reference, simple_array_indexing,
|
|
|
|
|
|
external_statement_node, ref_type_node, get_addr_node, deref_node, wrap_def, throw_statement,
|
|
|
|
|
|
switch_node, case_variant_node, case_range_node, null_const_node, null_type_node, unsized_array, delegated_method,
|
|
|
|
|
|
convert_types_function_node, runtime_statement, typed_expression, is_node, as_node, sizeof_operator, typeof_operator,
|
|
|
|
|
|
exit_procedure, exception_filter, try_block, template_type, common_event, compiled_event, static_event_reference,
|
|
|
|
|
|
nonstatic_event_reference, array_const, statement_expression_node, question_colon_expression, record_const,
|
|
|
|
|
|
type_synonym, label, labeled_statement, goto_statement, compiled_static_method_call_node_as_constant, enum_const,
|
|
|
|
|
|
common_namespace_function_call_node_as_constant, foreach_node, lock_statement, local_block_variable,
|
|
|
|
|
|
local_block_variable_reference,compiled_constructor_call_as_constant, rethrow_statement, short_string,
|
|
|
|
|
|
foreach_break_node, foreach_continue_node, generic_indicator, namespace_constant_reference, function_constant_reference,
|
|
|
|
|
|
common_constructor_call_as_constant, array_initializer, record_initializer, default_operator, attribute_node,
|
|
|
|
|
|
pinvoke_node, basic_function_call_node_as_constant, compiled_static_field_reference_as_constant,
|
|
|
|
|
|
common_namespace_event, indefinite_definition_node, indefinite_type, indefinite_function_call, indefinite_reference,
|
2021-02-21 13:40:39 +03:00
|
|
|
|
wrapped_statement, wrapped_expression, default_operator_node_as_constant, double_question_colon_expression,
|
2023-11-01 13:48:45 +03:00
|
|
|
|
typeof_operator_as_constant, common_static_method_call_node_as_constant, sizeof_operator_as_constant
|
2015-05-14 22:35:07 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Для работы часто необходимо знать лищь обобщенный тип узла.
|
|
|
|
|
|
/// Например, часто достаточно знать что конкретный узел является выражением и не важно каким.
|
|
|
|
|
|
/// Каждый узел семантического дерева должен уметь возвращать свой обобщенный тип.
|
|
|
|
|
|
/// Это список всех возможных обобщенных типов узлов.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public enum general_node_type {type_node, function_node, namespace_node, unit_node, variable_node,
|
|
|
|
|
|
property_node, constant_definition, statement, expression, program_node, interface_node,
|
|
|
|
|
|
template_type, event_node, type_synonym, label, generic_indicator, attribute_node};
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Базовый абстрактный класс для всех выражений.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public abstract class semantic_node : SemanticTree.ISemanticNode
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Обобщенный тип узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public abstract general_node_type general_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Тип узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public abstract semantic_node_type semantic_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Метод для обхода дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
|
|
|
|
|
public virtual void visit(SemanticTree.ISemanticVisitor visitor)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitor.visit(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Базовый класс для всех определений в программе.
|
|
|
|
|
|
/// К определениям относятся переменные, константы, свойства, методы и обычные функции, поля, пространства имен,
|
|
|
|
|
|
/// сама программа или dll, типы и модули.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public abstract class definition_node : semantic_node, SemanticTree.IDefinitionNode
|
|
|
|
|
|
{
|
2017-10-07 14:01:51 +03:00
|
|
|
|
protected string doc;
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
protected attributes_list _attributes;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Метод для обхода дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
|
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitor.visit(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public attributes_list attributes
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_attributes == null)
|
|
|
|
|
|
_attributes = new attributes_list();
|
|
|
|
|
|
return _attributes;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public SemanticTree.IAttributeNode[] Attributes
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return attributes.ToArray();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public virtual string documentation
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return doc;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
doc = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string SemanticTree.IDefinitionNode.Documentation
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return doc;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-06-03 13:46:06 +03:00
|
|
|
|
public virtual location location
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-05-14 22:35:07 +03:00
|
|
|
|
public virtual semantic_node find_by_location(int line, int col)
|
|
|
|
|
|
{
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Базовый класс для всех statement-ов.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public abstract class statement_node : semantic_node, SemanticTree.IStatementNode
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Расположение statement-а в программе.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private location _loc;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Конструктор узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="loc">Расположение statement-а в программе.</param>
|
|
|
|
|
|
public statement_node()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public statement_node(location loc)
|
|
|
|
|
|
{
|
|
|
|
|
|
_loc = loc;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Расположение statement-а в программе.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public location location
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _loc;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_loc=value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Расположение statement-а в программе.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SemanticTree.ILocation SemanticTree.ILocated.Location
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _loc;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Обобщенный тип узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public override general_node_type general_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return general_node_type.statement;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Метод для обхода дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
|
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitor.visit(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Базовый класс для всех выражений.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public abstract class expression_node : statement_node, SemanticTree.IExpressionNode
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Тип выражения.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private type_node _tn;
|
2017-07-02 13:18:56 +03:00
|
|
|
|
|
|
|
|
|
|
private type_node _conversion_tn;
|
|
|
|
|
|
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Конструктор выражения.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="tn">Тип выражения.</param>
|
|
|
|
|
|
/// <param name="loc">Расположение выражения.</param>
|
|
|
|
|
|
|
|
|
|
|
|
public expression_node()//30_01_2010_Tasha
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public expression_node(type_node tn, location loc) : base(loc)
|
|
|
|
|
|
{
|
|
|
|
|
|
_tn=tn;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Тип выражения. Используется при построении дерева.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public virtual type_node type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _tn;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_tn = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-07-02 13:18:56 +03:00
|
|
|
|
|
|
|
|
|
|
public virtual type_node conversion_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _conversion_tn;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_conversion_tn = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Обобщенный тип узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public override general_node_type general_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return general_node_type.expression;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Является ли это выражение lvalue.
|
|
|
|
|
|
/// Т.е. может ли это выражение стоять в левой части оператора присваивания и передаваться по ссылке.
|
|
|
|
|
|
/// По умолчанию false.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public virtual bool is_addressed
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Метод для обхода дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
|
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitor.visit(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Тип выражения. Используется посетителем при обходе дерева.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SemanticTree.ITypeNode SemanticTree.IExpressionNode.type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return this.type;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-07-02 13:18:56 +03:00
|
|
|
|
|
|
|
|
|
|
SemanticTree.ITypeNode SemanticTree.IExpressionNode.conversion_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return this.conversion_type;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-04-09 09:46:58 +03:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Возвращает поверхностную копию объекта
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public expression_node ShallowCopy()
|
|
|
|
|
|
{
|
|
|
|
|
|
return (expression_node)this.MemberwiseClone();
|
|
|
|
|
|
}
|
2015-05-14 22:35:07 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class typed_expression : expression_node
|
|
|
|
|
|
{
|
|
|
|
|
|
public typed_expression(type_node type, location loc)
|
|
|
|
|
|
: base(type, loc)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return semantic_node_type.typed_expression;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-06-13 15:35:47 +03:00
|
|
|
|
public override string ToString() => type.ToString();
|
2015-05-14 22:35:07 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Базовый класс для адресных выражений.
|
|
|
|
|
|
/// Т.е. тех, которые могут стоять в левой части оператора присваивания и передаваться по ссылке.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public abstract class addressed_expression : expression_node, SemanticTree.IAddressedExpressionNode
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Конструктор адресного выражения.
|
|
|
|
|
|
/// </summary>
|
2017-11-16 23:10:30 +03:00
|
|
|
|
/// <param name="tn">Тип выражения.</param>
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// <param name="loc">Расположение выражения.</param>
|
|
|
|
|
|
public addressed_expression(type_node tn, location loc) : base(tn,loc)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Является ли это выражение lvalue.
|
|
|
|
|
|
/// Т.е. может ли это выражение стоять в левой части оператора присваивания и передаваться по ссылке.
|
|
|
|
|
|
/// По умолчанию true.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public override bool is_addressed
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Метод для обхода дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
|
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitor.visit(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Класс, представляющий ссылку на объект внутри его метода.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class this_node : expression_node, SemanticTree.IThisNode
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Конструктор this_node.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="type">Тип объекта.</param>
|
|
|
|
|
|
/// <param name="loc">Расположение выражения.</param>
|
|
|
|
|
|
public this_node(type_node type, location loc) : base(type,loc)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Тип узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return semantic_node_type.this_node;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override bool is_addressed
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (type.is_value_type)
|
|
|
|
|
|
return true;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Метод для обхода дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
|
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitor.visit(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Класс, представляющий операцию получения адреса объекта.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class get_addr_node : expression_node, SemanticTree.IGetAddrNode
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Выражение, адрес которого мы получаем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private readonly expression_node _addr_of;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Конструктор узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="addr_of">Выражение, адрес которого мы получаем.</param>
|
|
|
|
|
|
/// <param name="loc">Расположение узла.</param>
|
|
|
|
|
|
public get_addr_node(expression_node addr_of, location loc) :
|
|
|
|
|
|
base(addr_of.type.ref_type, loc)
|
|
|
|
|
|
{
|
|
|
|
|
|
_addr_of = addr_of;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Тип узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return semantic_node_type.get_addr_node;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Выражение, адрес которого мы получаем.
|
|
|
|
|
|
/// Это свойство используется при генерации дерева.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public expression_node addr_of
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _addr_of;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Выражение, адрес которого мы получаем.
|
|
|
|
|
|
/// Испоьзуется при обходе дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SemanticTree.IExpressionNode SemanticTree.IGetAddrNode.addr_of_expr
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _addr_of;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Метод для обхода дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
|
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitor.visit(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Класс, представляющий операцию разыменования объекта.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class dereference_node : addressed_expression, SemanticTree.IDereferenceNode
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Выражение-указатель.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private expression_node _deref_expr;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Конструктор узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="deref_expr">Выражение-указатель.</param>
|
|
|
|
|
|
/// <param name="loc">Расположение выражения.</param>
|
|
|
|
|
|
public dereference_node(expression_node deref_expr, location loc) :
|
|
|
|
|
|
//base(PascalABCCompiler.SystemLibrary.SystemLibrary.get_pointed_type_by_type(deref_expr.type),loc)
|
|
|
|
|
|
base( (deref_expr.type as ref_type_node).pointed_type, loc)
|
|
|
|
|
|
{
|
|
|
|
|
|
_deref_expr = deref_expr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Тип узла.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return semantic_node_type.deref_node;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Выражение-указатель, которое мы разыменовываем.
|
|
|
|
|
|
/// Это свойство используется при генерации дерева.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public expression_node deref_expr
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _deref_expr;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_deref_expr = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Выражение-указатель, которое мы разыменовываем.
|
|
|
|
|
|
/// Это свойство используется при обходе дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SemanticTree.IExpressionNode SemanticTree.IDereferenceNode.derefered_expr
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _deref_expr;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Метод для обхода дерева посетителем.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
|
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitor.visit(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-06-29 12:02:42 +03:00
|
|
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class expression_with_let_semantic : expression_node
|
|
|
|
|
|
{
|
|
|
|
|
|
public expression_with_let_semantic(type_node type, location loc)
|
|
|
|
|
|
: base(type, loc)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return semantic_node_type.typed_expression;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public override string ToString() => type.ToString();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-05-14 22:35:07 +03:00
|
|
|
|
}
|