665 lines
13 KiB
C#
665 lines
13 KiB
C#
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (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
|
|
{
|
|
|
|
[Serializable]
|
|
public class local_variable_reference : variable_reference, SemanticTree.ILocalVariableReferenceNode
|
|
{
|
|
private local_variable _var;
|
|
private int _static_depth;
|
|
|
|
public local_variable_reference(local_variable var,int static_depth,location loc) : base(var.type,loc)
|
|
{
|
|
_var=var;
|
|
this.static_depth=static_depth;
|
|
}
|
|
|
|
SemanticTree.IVAriableDefinitionNode SemanticTree.IReferenceNode.Variable
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
//Определение локальной переменной.
|
|
public local_variable var
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
//Разность статических глубин, между определением и вхождением.
|
|
public int static_depth
|
|
{
|
|
get
|
|
{
|
|
return _static_depth;
|
|
}
|
|
private set
|
|
{
|
|
_static_depth=value;
|
|
if (value > 0)
|
|
{
|
|
_var.set_used_as_unlocal();
|
|
}
|
|
}
|
|
}
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
{
|
|
get
|
|
{
|
|
return semantic_node_type.local_variable_reference;
|
|
}
|
|
}
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
{
|
|
visitor.visit(this);
|
|
}
|
|
|
|
public SemanticTree.ILocalVariableNode variable
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
public override var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
[Serializable]
|
|
public class local_block_variable_reference : variable_reference, SemanticTree.ILocalBlockVariableReferenceNode
|
|
{
|
|
private local_block_variable _var;
|
|
|
|
public local_block_variable_reference(local_block_variable var, location loc)
|
|
: base(var.type, loc)
|
|
{
|
|
_var = var;
|
|
}
|
|
|
|
SemanticTree.IVAriableDefinitionNode SemanticTree.IReferenceNode.Variable
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
|
|
//Определение локальной переменной.
|
|
public local_block_variable var
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
{
|
|
get
|
|
{
|
|
return semantic_node_type.local_block_variable_reference;
|
|
}
|
|
}
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
{
|
|
visitor.visit(this);
|
|
}
|
|
|
|
public SemanticTree.ILocalBlockVariableNode Variable
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
public override var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
public abstract class variable_reference : addressed_expression
|
|
{
|
|
public variable_reference(type_node tn, location loc)
|
|
: base(tn, loc)
|
|
{
|
|
}
|
|
|
|
public virtual var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class namespace_variable_reference : variable_reference, SemanticTree.INamespaceVariableReferenceNode
|
|
{
|
|
private namespace_variable _var;
|
|
|
|
public namespace_variable_reference(namespace_variable var,location loc) :
|
|
base(var.type,loc)
|
|
{
|
|
_var=var;
|
|
}
|
|
|
|
|
|
SemanticTree.IVAriableDefinitionNode SemanticTree.IReferenceNode.Variable
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
//Переменная.
|
|
public namespace_variable var
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
{
|
|
get
|
|
{
|
|
return semantic_node_type.namespace_variable_reference;
|
|
}
|
|
}
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
{
|
|
visitor.visit(this);
|
|
}
|
|
|
|
public SemanticTree.ICommonNamespaceVariableNode variable
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
public override var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class class_field_reference : variable_reference, SemanticTree.ICommonClassFieldReferenceNode
|
|
{
|
|
private class_field _field;
|
|
private expression_node _obj;
|
|
|
|
public class_field_reference(class_field field,expression_node obj,location loc) :
|
|
base(field.type,loc)
|
|
{
|
|
_field=field;
|
|
_obj=obj;
|
|
}
|
|
|
|
public override var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
return _field;
|
|
}
|
|
}
|
|
|
|
SemanticTree.IVAriableDefinitionNode SemanticTree.IReferenceNode.Variable
|
|
{
|
|
get
|
|
{
|
|
return _field;
|
|
}
|
|
}
|
|
|
|
//Поле класса.
|
|
public class_field field
|
|
{
|
|
get
|
|
{
|
|
return _field;
|
|
}
|
|
}
|
|
|
|
//Объект класса.
|
|
public expression_node obj
|
|
{
|
|
get
|
|
{
|
|
return _obj;
|
|
}
|
|
set
|
|
{
|
|
_obj = value;
|
|
}
|
|
}
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
{
|
|
get
|
|
{
|
|
return semantic_node_type.class_field_reference;
|
|
}
|
|
}
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
{
|
|
visitor.visit(this);
|
|
}
|
|
|
|
SemanticTree.ICommonClassFieldNode SemanticTree.ICommonClassFieldReferenceNode.field
|
|
{
|
|
get
|
|
{
|
|
return _field;
|
|
}
|
|
}
|
|
|
|
SemanticTree.IExpressionNode SemanticTree.ICommonClassFieldReferenceNode.obj
|
|
{
|
|
get
|
|
{
|
|
return _obj;
|
|
}
|
|
}
|
|
|
|
public override bool is_addressed
|
|
{
|
|
get
|
|
{
|
|
bool flag;
|
|
general_node_type gnd;
|
|
return !TreeConverter.convertion_data_and_alghoritms.check_for_constant_or_readonly(this,out flag, out gnd);
|
|
}
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class static_class_field_reference : variable_reference, SemanticTree.IStaticCommonClassFieldReferenceNode
|
|
{
|
|
private class_field _field;
|
|
private common_type_node _type;
|
|
|
|
/*
|
|
public static_class_field_reference(class_field static_field,common_type_node type,location loc) :
|
|
base(static_field.type,loc)
|
|
{
|
|
_field=static_field;
|
|
_type=type;
|
|
}
|
|
*/
|
|
|
|
public static_class_field_reference(class_field static_field,location loc) :
|
|
base(static_field.type,loc)
|
|
{
|
|
_field=static_field;
|
|
_type=static_field.cont_type;
|
|
}
|
|
|
|
SemanticTree.IVAriableDefinitionNode SemanticTree.IReferenceNode.Variable
|
|
{
|
|
get
|
|
{
|
|
return _field;
|
|
}
|
|
}
|
|
|
|
//Статическое поле класса.
|
|
public class_field static_field
|
|
{
|
|
get
|
|
{
|
|
return _field;
|
|
}
|
|
}
|
|
|
|
//Класс, к статическому методу которого мы обращаемся.
|
|
public common_type_node class_type
|
|
{
|
|
get
|
|
{
|
|
return _type;
|
|
}
|
|
}
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
{
|
|
get
|
|
{
|
|
return semantic_node_type.static_class_field_reference;
|
|
}
|
|
}
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
{
|
|
visitor.visit(this);
|
|
}
|
|
|
|
SemanticTree.ICommonClassFieldNode SemanticTree.IStaticCommonClassFieldReferenceNode.static_field
|
|
{
|
|
get
|
|
{
|
|
return _field;
|
|
}
|
|
}
|
|
|
|
SemanticTree.ICommonTypeNode SemanticTree.IStaticCommonClassFieldReferenceNode.class_type
|
|
{
|
|
get
|
|
{
|
|
return _type;
|
|
}
|
|
}
|
|
|
|
public override var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
return _field;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
[Serializable]
|
|
public class compiled_variable_reference : variable_reference, SemanticTree.ICompiledFieldReferenceNode
|
|
{
|
|
private compiled_variable_definition _var;
|
|
private expression_node _obj;
|
|
|
|
public compiled_variable_reference(compiled_variable_definition var,expression_node obj,location loc) :
|
|
base(var.type,loc)
|
|
{
|
|
_var=var;
|
|
_obj=obj;
|
|
}
|
|
|
|
public override var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
//Поле класса.
|
|
public compiled_variable_definition var
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
SemanticTree.IVAriableDefinitionNode SemanticTree.IReferenceNode.Variable
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
|
|
//Объект класса.
|
|
public expression_node obj
|
|
{
|
|
get
|
|
{
|
|
return _obj;
|
|
}
|
|
set
|
|
{
|
|
_obj = value;
|
|
}
|
|
}
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
{
|
|
get
|
|
{
|
|
return semantic_node_type.compiled_variable_reference;
|
|
}
|
|
}
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
{
|
|
visitor.visit(this);
|
|
}
|
|
|
|
public SemanticTree.ICompiledClassFieldNode field
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
SemanticTree.IExpressionNode SemanticTree.ICompiledFieldReferenceNode.obj
|
|
{
|
|
get
|
|
{
|
|
return _obj;
|
|
}
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class static_compiled_variable_reference : variable_reference, SemanticTree.IStaticCompiledFieldReferenceNode
|
|
{
|
|
private compiled_variable_definition _var;
|
|
private compiled_type_node _type;
|
|
|
|
public static_compiled_variable_reference(compiled_variable_definition var,compiled_type_node type,location loc) :
|
|
base(var.type,loc)
|
|
{
|
|
_var=var;
|
|
_type=type;
|
|
}
|
|
|
|
public static_compiled_variable_reference(compiled_variable_definition var,location loc) :
|
|
base(var.type,loc)
|
|
{
|
|
_var=var;
|
|
_type=_var.cont_type;
|
|
}
|
|
|
|
//Поле класса.
|
|
public compiled_variable_definition var
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
SemanticTree.IVAriableDefinitionNode SemanticTree.IReferenceNode.Variable
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
|
|
//Класс, к статическому полю которого мы обращаемся.
|
|
public compiled_type_node class_type
|
|
{
|
|
get
|
|
{
|
|
return _type;
|
|
}
|
|
}
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
{
|
|
get
|
|
{
|
|
return semantic_node_type.static_compiled_variable_reference;
|
|
}
|
|
}
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
{
|
|
visitor.visit(this);
|
|
}
|
|
|
|
public SemanticTree.ICompiledClassFieldNode static_field
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
SemanticTree.ICompiledTypeNode SemanticTree.IStaticCompiledFieldReferenceNode.class_type
|
|
{
|
|
get
|
|
{
|
|
return _type;
|
|
}
|
|
}
|
|
|
|
public override var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
return _var;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
[Serializable]
|
|
public class common_parameter_reference : variable_reference, SemanticTree.ICommonParameterReferenceNode
|
|
{
|
|
private common_parameter _par;
|
|
private int _static_depth;
|
|
|
|
public common_parameter_reference(common_parameter par,int static_depth,location loc) :
|
|
base(par.type,loc)
|
|
{
|
|
_par=par;
|
|
this.static_depth=static_depth;
|
|
}
|
|
|
|
public override var_definition_node VariableDefinition
|
|
{
|
|
get
|
|
{
|
|
return _par;
|
|
}
|
|
}
|
|
|
|
//Параметр метода, к которому мы обращаемся.
|
|
public common_parameter par
|
|
{
|
|
get
|
|
{
|
|
return _par;
|
|
}
|
|
}
|
|
|
|
SemanticTree.IVAriableDefinitionNode SemanticTree.IReferenceNode.Variable
|
|
{
|
|
get
|
|
{
|
|
return _par;
|
|
}
|
|
}
|
|
|
|
//Разность статических глубин, между обращением к параметру и методом в котором он объявлен.
|
|
public int static_depth
|
|
{
|
|
get
|
|
{
|
|
return _static_depth;
|
|
}
|
|
set
|
|
{
|
|
_static_depth=value;
|
|
if (_static_depth>0)
|
|
{
|
|
_par.set_used_as_unlocal();
|
|
}
|
|
}
|
|
}
|
|
|
|
public override bool is_addressed
|
|
{
|
|
get
|
|
{
|
|
if (_par.concrete_parameter_type==concrete_parameter_type.cpt_const)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public override semantic_node_type semantic_node_type
|
|
{
|
|
get
|
|
{
|
|
return semantic_node_type.common_parameter_reference;
|
|
}
|
|
}
|
|
|
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
|
{
|
|
visitor.visit(this);
|
|
}
|
|
|
|
int SemanticTree.ICommonParameterReferenceNode.static_depth
|
|
{
|
|
get
|
|
{
|
|
return _static_depth;
|
|
}
|
|
}
|
|
|
|
public SemanticTree.ICommonParameterNode parameter
|
|
{
|
|
get
|
|
{
|
|
return _par;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|