pascalabcnet/TreeConverter/TreeRealization/base_nodes.cs
Mikhalkovich Stanislav ac3cb68835 fix #2067
2020-06-13 15:35:47 +03:00

580 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

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

// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
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,
wrapped_statement, wrapped_expression, default_operator_node_as_constant
};
/// <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
{
protected string doc;
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;
}
}
public virtual location location
{
get
{
return null;
}
}
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;
private type_node _conversion_tn;
/// <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;
}
}
public virtual type_node conversion_type
{
get
{
return _conversion_tn;
}
set
{
_conversion_tn = value;
}
}
/// <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;
}
}
SemanticTree.ITypeNode SemanticTree.IExpressionNode.conversion_type
{
get
{
return this.conversion_type;
}
}
}
[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;
}
}
public override string ToString() => type.ToString();
}
/// <summary>
/// Базовый класс для адресных выражений.
/// Т.е. тех, которые могут стоять в левой части оператора присваивания и передаваться по ссылке.
/// </summary>
[Serializable]
public abstract class addressed_expression : expression_node, SemanticTree.IAddressedExpressionNode
{
/// <summary>
/// Конструктор адресного выражения.
/// </summary>
/// <param name="tn">Тип выражения.</param>
/// <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);
}
}
}