refactoring (#3427)

This commit is contained in:
samuraiGH 2026-05-21 19:14:24 +03:00 committed by GitHub
parent 349a3dc568
commit 4efb48894c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 124 additions and 258 deletions

View file

@ -1,33 +0,0 @@
// 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.Collections
{
/*
public class associated_collection<KeyType,ElementType>
{
private System.Collections.Generic.Dictionary<KeyType, ElementType> int_collection =
new System.Collections.Generic.Dictionary<KeyType, ElementType>();
public void AssociateElement(KeyType key, ElementType element)
{
#if DEBUG
if (int_collection[key]!=null)
{
throw new PascalABCCompiler.TreeConverter.CompilerInternalError("Duplicate key in associated collection.");
}
#endif
int_collection[key] = element;
}
public ElementType this[KeyType key]
{
get
{
return int_collection[key];
}
}
}
*/
}

View file

@ -1,64 +0,0 @@
// 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;
using System.Linq;
namespace PascalABCCompiler.Collections
{
[Serializable]
public class stack<T>
{
protected System.Collections.Generic.Stack<T> internal_stack = new System.Collections.Generic.Stack<T>();
public void push(T element)
{
internal_stack.Push(element);
}
public T pop()
{
return internal_stack.Pop();
}
public T top()
{
if (internal_stack.Count == 0)
return default(T);
//T t = internal_stack.Pop();
//internal_stack.Push(t);
return internal_stack.Peek();
}
public T first()
{
if (internal_stack.Count == 0)
return default(T);
return internal_stack.ToArray()[internal_stack.Count-1];
}
public int size
{
get
{
return internal_stack.Count;
}
}
public bool Empty
{
get
{
return internal_stack.Count == 0;
}
}
public void clear()
{
internal_stack.Clear();
}
public System.Collections.Generic.Stack<T> CloneInternalStack()
{
return new System.Collections.Generic.Stack<T>(internal_stack.Reverse());
}
}
}

View file

@ -976,7 +976,7 @@ namespace TreeConverter.LambdaExpressions.Closure
{ {
var funcStackAsList = _visitor.context.func_stack == null var funcStackAsList = _visitor.context.func_stack == null
? null ? null
: _visitor.context.func_stack.CloneInternalStack().ToList(); : _visitor.context.func_stack.ToList();
var funcIsGeneric = false; var funcIsGeneric = false;
if (funcStackAsList != null) if (funcStackAsList != null)
@ -1015,7 +1015,7 @@ namespace TreeConverter.LambdaExpressions.Closure
var funcStackAsList = _visitor.context.func_stack == null var funcStackAsList = _visitor.context.func_stack == null
? null ? null
: _visitor.context.func_stack.CloneInternalStack().ToList(); : _visitor.context.func_stack.ToList();
if (funcStackAsList != null) if (funcStackAsList != null)
{ {

View file

@ -150,7 +150,7 @@ namespace TreeConverter.LambdaExpressions.Closure
} }
} }
_visitor.convertion_data_and_alghoritms.statement_list_stack.pop(); _visitor.convertion_data_and_alghoritms.statement_list_stack.Pop();
_currentTreeNode = _currentTreeNode.ParentNode; _currentTreeNode = _currentTreeNode.ParentNode;
} }
@ -697,7 +697,7 @@ namespace TreeConverter.LambdaExpressions.Closure
ProcessNode(_foreach_stmt.stmt); ProcessNode(_foreach_stmt.stmt);
_visitor.context.loop_var_stack.Pop(); _visitor.context.loop_var_stack.Pop();
_visitor.convertion_data_and_alghoritms.statement_list_stack.pop(); _visitor.convertion_data_and_alghoritms.statement_list_stack.Pop();
_visitor.context.leave_cycle(); _visitor.context.leave_cycle();
_currentTreeNode = _currentTreeNode.ParentNode; _currentTreeNode = _currentTreeNode.ParentNode;
@ -782,7 +782,7 @@ namespace TreeConverter.LambdaExpressions.Closure
_visitor.context.leave_cycle(); _visitor.context.leave_cycle();
_visitor.context.loop_var_stack.Pop(); _visitor.context.loop_var_stack.Pop();
_visitor.convertion_data_and_alghoritms.statement_list_stack.pop(); _visitor.convertion_data_and_alghoritms.statement_list_stack.Pop();
_currentTreeNode = _currentTreeNode.ParentNode; _currentTreeNode = _currentTreeNode.ParentNode;
} }
@ -836,7 +836,7 @@ namespace TreeConverter.LambdaExpressions.Closure
var newTreeNode = new CapturedVariablesTreeNodeLambdaScope(_currentTreeNode, var newTreeNode = new CapturedVariablesTreeNodeLambdaScope(_currentTreeNode,
lambdaDefinition, lambdaDefinition,
_visitor.context.func_stack.top().scope.ScopeNum, lambdaDefinition); _visitor.context.func_stack.Peek().scope.ScopeNum, lambdaDefinition);
_currentTreeNode.LambdasDefinedInScope.Add(newTreeNode); _currentTreeNode.LambdasDefinedInScope.Add(newTreeNode);
_currentLambdaScopeNodeStack.Push(newTreeNode); _currentLambdaScopeNodeStack.Push(newTreeNode);
@ -911,9 +911,9 @@ namespace TreeConverter.LambdaExpressions.Closure
_classScope = (CapturedVariablesTreeNodeClassScope) _rootNode; _classScope = (CapturedVariablesTreeNodeClassScope) _rootNode;
} }
if (_visitor.context.func_stack.top() != null) if (_visitor.context.func_stack.FirstOrDefault() != null)
{ {
var newTreeNode = new CapturedVariablesTreeNodeProcedureScope(_currentTreeNode, _visitor.context.func_stack.top(), _visitor.context.func_stack.top().scope.ScopeNum, null); var newTreeNode = new CapturedVariablesTreeNodeProcedureScope(_currentTreeNode, _visitor.context.func_stack.Peek(), _visitor.context.func_stack.Peek().scope.ScopeNum, null);
if (_rootNode == null) if (_rootNode == null)
{ {
@ -925,7 +925,7 @@ namespace TreeConverter.LambdaExpressions.Closure
} }
_currentTreeNode = newTreeNode; _currentTreeNode = newTreeNode;
_scopesCapturedVarsNodesDictionary.Add(_visitor.context.func_stack.top().scope.ScopeNum, _currentTreeNode); _scopesCapturedVarsNodesDictionary.Add(_visitor.context.func_stack.Peek().scope.ScopeNum, _currentTreeNode);
_procedureScope = (CapturedVariablesTreeNodeProcedureScope) _currentTreeNode; _procedureScope = (CapturedVariablesTreeNodeProcedureScope) _currentTreeNode;
} }

View file

@ -67,7 +67,7 @@ namespace TreeConverter.LambdaExpressions
if (stmtList.subnodes != null) if (stmtList.subnodes != null)
foreach (var stmt in stmtList.subnodes) foreach (var stmt in stmtList.subnodes)
ProcessNode(stmt); ProcessNode(stmt);
syntaxTreeVisitor.convertion_data_and_alghoritms.statement_list_stack.pop(); syntaxTreeVisitor.convertion_data_and_alghoritms.statement_list_stack.Pop();
} }
public override void visit(var_def_statement varStmt) public override void visit(var_def_statement varStmt)

View file

@ -1,46 +0,0 @@
// 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;
using PascalABCCompiler.Collections;
namespace PascalABCCompiler.TreeRealization
{
[Serializable]
public class common_function_node_stack : stack<common_function_node>
{
public common_function_node_stack Clone()
{
var s = new common_function_node_stack();
s.internal_stack = this.CloneInternalStack();
return s;
}
}
[Serializable]
public class var_definition_node_list : extendable_collection<var_definition_node>
{
}
[Serializable]
public class statement_list_stack : stack<statements_list>
{
public statement_list_stack Clone()
{
var s = new statement_list_stack();
s.internal_stack = this.CloneInternalStack();
return s;
}
}
[Serializable]
public class lambda_stack : stack<lambda_node> //lroman//
{
public lambda_stack Clone()
{
var s = new lambda_stack();
s.internal_stack = this.CloneInternalStack();
return s;
}
}
}

View file

@ -165,7 +165,7 @@ namespace PascalABCCompiler.TreeConverter
forNode.body = convert_strong(_for_node.statements); forNode.body = convert_strong(_for_node.statements);
context.leave_code_block(); context.leave_code_block();
slst = convertion_data_and_alghoritms.statement_list_stack.pop(); slst = convertion_data_and_alghoritms.statement_list_stack.Pop();
if (slst.statements.Count > 0 || slst.local_variables.Count > 0) if (slst.statements.Count > 0 || slst.local_variables.Count > 0)
{ {
slst.statements.AddElement(forNode.body); slst.statements.AddElement(forNode.body);
@ -174,7 +174,7 @@ namespace PascalABCCompiler.TreeConverter
context.leave_cycle(); context.leave_cycle();
context.loop_var_stack.Pop(); context.loop_var_stack.Pop();
head_stmts = convertion_data_and_alghoritms.statement_list_stack.pop(); head_stmts = convertion_data_and_alghoritms.statement_list_stack.Pop();
head_stmts.statements.AddElement(forNode); head_stmts.statements.AddElement(forNode);
#region MikhailoMMX, обработка omp parallel for #region MikhailoMMX, обработка omp parallel for

View file

@ -78,7 +78,7 @@ namespace PascalABCCompiler.TreeConverter
context.loop_var_stack.Pop(); context.loop_var_stack.Pop();
context.leave_cycle(); context.leave_cycle();
sl = convertion_data_and_alghoritms.statement_list_stack.pop(); sl = convertion_data_and_alghoritms.statement_list_stack.Pop();
if (sl.statements.Count > 0 || sl.local_variables.Count > 0) if (sl.statements.Count > 0 || sl.local_variables.Count > 0)
{ {
@ -88,7 +88,7 @@ namespace PascalABCCompiler.TreeConverter
foreachNode.what_do = body; foreachNode.what_do = body;
convertion_data_and_alghoritms.statement_list_stack.pop(); convertion_data_and_alghoritms.statement_list_stack.Pop();
sl2.statements.AddElement(foreachNode); sl2.statements.AddElement(foreachNode);
return_value(sl2); return_value(sl2);

View file

@ -20,7 +20,6 @@ namespace PascalABCCompiler.TreeConverter
public common_namespace_node cmn; // текущий namespace public common_namespace_node cmn; // текущий namespace
public common_type_node ctn; // текущий разбираемый тип public common_type_node ctn; // текущий разбираемый тип
public common_function_node_stack func_stack; public common_function_node_stack func_stack;
public lambda_stack lambda_stack;
public Stack<code_block> block_stack; public Stack<code_block> block_stack;
public Dictionary<int, short_string_type_node> ShortStringTypes; public Dictionary<int, short_string_type_node> ShortStringTypes;
public List<var_definition_node> var_defs; public List<var_definition_node> var_defs;
@ -60,7 +59,7 @@ namespace PascalABCCompiler.TreeConverter
// Из любого блока на глобальный уровень. Обнуляется _ctn. // Из любого блока на глобальный уровень. Обнуляется _ctn.
public void SaveContextAndUpToGlobalLevel() public void SaveContextAndUpToGlobalLevel()
{ {
if (!func_stack.Empty || SavedContext == null) if (func_stack.Count > 0 || SavedContext == null)
SaveContextAndUpFromAllFunctionDefs(); SaveContextAndUpFromAllFunctionDefs();
SavedContext.ctn = _ctn; SavedContext.ctn = _ctn;
_ctn = null; _ctn = null;
@ -68,7 +67,7 @@ namespace PascalABCCompiler.TreeConverter
public void SaveContextAndUpFromAllFunctionDefs() public void SaveContextAndUpFromAllFunctionDefs()
{ {
if (!convertion_data_and_alghoritms.statement_list_stack.Empty || SavedContext == null) if (convertion_data_and_alghoritms.statement_list_stack.Count > 0 || SavedContext == null)
SaveContextAndUpToNearestDefSect(); SaveContextAndUpToNearestDefSect();
SavedContext.func_stack = func_stack; SavedContext.func_stack = func_stack;
func_stack = new common_function_node_stack(); func_stack = new common_function_node_stack();
@ -173,7 +172,7 @@ namespace PascalABCCompiler.TreeConverter
public common_namespace_node _cmn; public common_namespace_node _cmn;
//TODO: Можно сделать возможность объявления вложенных типов. //TODO: Можно сделать возможность объявления вложенных типов.
public common_type_node _ctn; // SSM - пытаюсь выходить из класса и входить заново public common_type_node _ctn; // SSM - пытаюсь выходить из класса и входить заново
private common_function_node_stack _func_stack=new common_function_node_stack(); private common_function_node_stack _func_stack = new common_function_node_stack();
private type_node _explicit_interface_type; private type_node _explicit_interface_type;
internal bool WithSection = false; internal bool WithSection = false;
internal Dictionary<SymbolTable.Scope, expression_node> WithVariables = new Dictionary<SymbolTable.Scope, expression_node>(); internal Dictionary<SymbolTable.Scope, expression_node> WithVariables = new Dictionary<SymbolTable.Scope, expression_node>();
@ -311,11 +310,11 @@ namespace PascalABCCompiler.TreeConverter
//CurrentHandlerListStack = new Stack<List<string>>(); // SSM 29/03/22 - не сработало //CurrentHandlerListStack = new Stack<List<string>>(); // SSM 29/03/22 - не сработало
_cmn = null; _cmn = null;
_ctn = null; _ctn = null;
_func_stack.clear(); _func_stack.Clear();
var_defs.Clear(); var_defs.Clear();
_main_procedure = null; _main_procedure = null;
_last_created_function = null; _last_created_function = null;
_cycles_stack.clear(); _cycles_stack.Clear();
_num_of_for_cycles = 0; _num_of_for_cycles = 0;
_fal = SemanticTree.field_access_level.fal_private; _fal = SemanticTree.field_access_level.fal_private;
var_defs_stack.Clear(); var_defs_stack.Clear();
@ -377,9 +376,9 @@ namespace PascalABCCompiler.TreeConverter
{ {
get get
{ {
if (!syntax_tree_visitor.convertion_data_and_alghoritms.statement_list_stack.Empty) if (syntax_tree_visitor.convertion_data_and_alghoritms.statement_list_stack.Count > 0)
{ {
SymbolTable.Scope sc = syntax_tree_visitor.convertion_data_and_alghoritms.statement_list_stack.top().Scope; SymbolTable.Scope sc = syntax_tree_visitor.convertion_data_and_alghoritms.statement_list_stack.Peek().Scope;
if (sc != null) if (sc != null)
{ {
if (top_function != null && LambdaHelper.IsLambdaName(top_function.name)) //lroman if (top_function != null && LambdaHelper.IsLambdaName(top_function.name)) //lroman
@ -426,7 +425,7 @@ namespace PascalABCCompiler.TreeConverter
public void push_function(common_function_node fn) public void push_function(common_function_node fn)
{ {
_func_stack.push(fn); _func_stack.Push(fn);
} }
public common_function_node get_method_to_realize(SyntaxTree.declaration dc) public common_function_node get_method_to_realize(SyntaxTree.declaration dc)
@ -510,7 +509,7 @@ namespace PascalABCCompiler.TreeConverter
public void pop_top_function() public void pop_top_function()
{ {
_func_stack.pop(); _func_stack.Pop();
} }
private List<common_type_node> _types_predefined = new List<common_type_node>(); private List<common_type_node> _types_predefined = new List<common_type_node>();
@ -641,11 +640,11 @@ namespace PascalABCCompiler.TreeConverter
{ {
get get
{ {
if (_func_stack.size==0) if (_func_stack.Count==0)
{ {
return null; return null;
} }
return (_func_stack.top()); return _func_stack.Peek();
} }
} }
@ -765,7 +764,7 @@ namespace PascalABCCompiler.TreeConverter
public bool func_stack_size_is_one() public bool func_stack_size_is_one()
{ {
return (_func_stack.size == 1); return (_func_stack.Count == 1);
} }
public block_type converting_block() public block_type converting_block()
@ -775,7 +774,7 @@ namespace PascalABCCompiler.TreeConverter
if (_ctn != null && top_function!=null && _ctn.defined_in_scope == top_function.scope) if (_ctn != null && top_function!=null && _ctn.defined_in_scope == top_function.scope)
return block_type.type_block; return block_type.type_block;
if (_func_stack.size!=0) if (_func_stack.Count!=0)
{ {
return block_type.function_block; return block_type.function_block;
} }
@ -1201,10 +1200,10 @@ namespace PascalABCCompiler.TreeConverter
{ {
if (converting_block() == block_type.function_block) if (converting_block() == block_type.function_block)
{ {
var top_func = func_stack.top(); var top_func = func_stack.Peek();
if (top_func.name == lambda_name) if (top_func.name == lambda_name)
{ {
_func_stack.pop(); _func_stack.Pop();
} }
} }
} }
@ -1233,7 +1232,7 @@ namespace PascalABCCompiler.TreeConverter
//lroman// //lroman//
public common_function_node create_lambda_function(string name, location def_loc, bool add_symbol_info, SymbolTable.Scope topScope) public common_function_node create_lambda_function(string name, location def_loc, bool add_symbol_info, SymbolTable.Scope topScope)
{ {
var func_stack_as_array = _func_stack.CloneInternalStack().ToList(); var func_stack_as_array = _func_stack.ToList();
var nestedFunc = func_stack_as_array.FirstOrDefault(func => func is common_in_function_function_node); var nestedFunc = func_stack_as_array.FirstOrDefault(func => func is common_in_function_function_node);
if (nestedFunc != null) if (nestedFunc != null)
@ -1279,7 +1278,7 @@ namespace PascalABCCompiler.TreeConverter
cfn = cnfnn; cfn = cnfnn;
} }
_func_stack.push(cfn); _func_stack.Push(cfn);
return cfn; return cfn;
} }
//\lroman// //\lroman//
@ -1300,7 +1299,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
common_function_node top_func = _func_stack.top(); common_function_node top_func = _func_stack.Peek();
SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateScope(top_func.scope, "function " + name); SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateScope(top_func.scope, "function " + name);
common_in_function_function_node ciffn =new common_in_function_function_node(name,def_loc,top_func,scope); common_in_function_function_node ciffn =new common_in_function_function_node(name,def_loc,top_func,scope);
top_func.functions_nodes_list.AddElement(ciffn); top_func.functions_nodes_list.AddElement(ciffn);
@ -1374,7 +1373,7 @@ namespace PascalABCCompiler.TreeConverter
break; break;
} }
} }
_func_stack.push(cfn); _func_stack.Push(cfn);
return cfn; return cfn;
} }
@ -1668,8 +1667,8 @@ namespace PascalABCCompiler.TreeConverter
{ {
get get
{ {
if (!syntax_tree_visitor.convertion_data_and_alghoritms.statement_list_stack.Empty) if (syntax_tree_visitor.convertion_data_and_alghoritms.statement_list_stack.Count > 0)
return syntax_tree_visitor.convertion_data_and_alghoritms.statement_list_stack.top(); return syntax_tree_visitor.convertion_data_and_alghoritms.statement_list_stack.Peek();
return null; return null;
} }
} }
@ -1837,7 +1836,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
common_function_node top_func = _func_stack.top(); common_function_node top_func = _func_stack.Peek();
local_variable lv=new local_variable(name,tn,top_func,loc); local_variable lv=new local_variable(name,tn,top_func,loc);
vdn=lv; vdn=lv;
top_func.var_definition_nodes_list.AddElement(lv); top_func.var_definition_nodes_list.AddElement(lv);
@ -1881,7 +1880,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
common_function_node top_func = _func_stack.top(); common_function_node top_func = _func_stack.Peek();
top_func.label_nodes_list.Add(lab); top_func.label_nodes_list.Add(lab);
top_func.scope.AddSymbol(name, new SymbolInfo(lab)); top_func.scope.AddSymbol(name, new SymbolInfo(lab));
break; break;
@ -1974,7 +1973,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
common_function_node top_func = _func_stack.top(); common_function_node top_func = _func_stack.Peek();
local_variable lv=new local_variable(name,type,top_func,loc); local_variable lv=new local_variable(name,type,top_func,loc);
vdn=lv; vdn=lv;
top_func.var_definition_nodes_list.AddElement(lv); top_func.var_definition_nodes_list.AddElement(lv);
@ -2009,7 +2008,7 @@ namespace PascalABCCompiler.TreeConverter
throw new CompilerInternalError("Parameters can be defined with functions only"); throw new CompilerInternalError("Parameters can be defined with functions only");
} }
#endif #endif
common_function_node top_func = _func_stack.top(); common_function_node top_func = _func_stack.Peek();
common_parameter cp=new common_parameter(name,pt,top_func,cpt,loc); common_parameter cp=new common_parameter(name,pt,top_func,cpt,loc);
top_func.parameters.AddElement(cp); top_func.parameters.AddElement(cp);
top_func.scope.AddSymbol(name,new SymbolInfo(cp)); top_func.scope.AddSymbol(name,new SymbolInfo(cp));
@ -2026,7 +2025,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
common_function_node top_func = _func_stack.top(); common_function_node top_func = _func_stack.Peek();
function_constant_definition fcd = new function_constant_definition(name, loc, top_func); function_constant_definition fcd = new function_constant_definition(name, loc, top_func);
top_func.scope.AddSymbol(name,new SymbolInfo(fcd)); top_func.scope.AddSymbol(name,new SymbolInfo(fcd));
top_func.constants.AddElement(fcd); top_func.constants.AddElement(fcd);
@ -2340,7 +2339,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
common_function_node top_func = _func_stack.top(); common_function_node top_func = _func_stack.Peek();
location loc; location loc;
if (top_func.function_code == null) if (top_func.function_code == null)
{ {
@ -2381,7 +2380,7 @@ namespace PascalABCCompiler.TreeConverter
} }
} }
check_predefinition_defined(); check_predefinition_defined();
_func_stack.pop(); _func_stack.Pop();
break; break;
} }
case block_type.type_block: case block_type.type_block:
@ -2545,7 +2544,7 @@ namespace PascalABCCompiler.TreeConverter
} }
} }
int num_of_defaults = default_params.Count-1; int num_of_defaults = default_params.Count-1;
if (default_params.Count > 0 && converted_func_stack.size == 1) if (default_params.Count > 0 && converted_func_stack.Count == 1)
while (num_of_defaults >= 0) while (num_of_defaults >= 0)
{ {
@ -2607,7 +2606,7 @@ namespace PascalABCCompiler.TreeConverter
private void close_function_params_without_body() private void close_function_params_without_body()
{ {
check_function_not_exists(_func_stack.top()); check_function_not_exists(_func_stack.Peek());
} }
/// <summary> /// <summary>
@ -2616,7 +2615,7 @@ namespace PascalABCCompiler.TreeConverter
/// <returns></returns> /// <returns></returns>
private bool close_function_params_with_body() private bool close_function_params_with_body()
{ {
return check_unique_or_predefined(_func_stack.top()); return check_unique_or_predefined(_func_stack.Peek());
} }
private List<string> CurrentHandlerList=null; private List<string> CurrentHandlerList=null;
@ -3093,7 +3092,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
foreach(common_function_node cfn in _func_stack.top().functions_nodes_list) foreach(common_function_node cfn in _func_stack.Peek().functions_nodes_list)
{ {
if (cfn.function_code==null) if (cfn.function_code==null)
{ {
@ -3101,7 +3100,7 @@ namespace PascalABCCompiler.TreeConverter
AddError(new FunctionPredefinitionWithoutDefinition(cfn, cfn.loc)); AddError(new FunctionPredefinitionWithoutDefinition(cfn, cfn.loc));
} }
} }
check_labels(_func_stack.top().label_nodes_list); check_labels(_func_stack.Peek().label_nodes_list);
break; break;
} }
case block_type.namespace_block: case block_type.namespace_block:
@ -3205,7 +3204,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
List<SymbolInfo> si_list = null; List<SymbolInfo> si_list = null;
bool in_unit = false; bool in_unit = false;
if (_func_stack.size <= 1) if (_func_stack.Count <= 1)
{ {
if (_explicit_interface_type != null) if (_explicit_interface_type != null)
{ {
@ -3264,9 +3263,9 @@ namespace PascalABCCompiler.TreeConverter
} }
else else
{ {
common_function_node temp = _func_stack.pop(); common_function_node temp = _func_stack.Pop();
si_list = _func_stack.top().scope.FindOnlyInScope(fn.name); si_list = _func_stack.Peek().scope.FindOnlyInScope(fn.name);
_func_stack.push(temp); _func_stack.Push(temp);
} }
bool predef_find = false; bool predef_find = false;
int overloads = 0; int overloads = 0;
@ -3413,7 +3412,7 @@ namespace PascalABCCompiler.TreeConverter
last_created_function.symbol_kind = symbol_kind.sk_overload_function; last_created_function.symbol_kind = symbol_kind.sk_overload_function;
} }
common_function_node cfn11 = _func_stack.pop(); common_function_node cfn11 = _func_stack.Pop();
compar.scope = cfn11.scope; compar.scope = cfn11.scope;
common_method_node cmnode = compar as common_method_node; common_method_node cmnode = compar as common_method_node;
@ -3432,8 +3431,8 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
_func_stack.top().functions_nodes_list.remove((common_in_function_function_node)fn); _func_stack.Peek().functions_nodes_list.remove((common_in_function_function_node)fn);
siint = _func_stack.top().scope.FindOnlyInScope(fn.name); siint = _func_stack.Peek().scope.FindOnlyInScope(fn.name);
break; break;
} }
case block_type.namespace_block: case block_type.namespace_block:
@ -3547,7 +3546,7 @@ namespace PascalABCCompiler.TreeConverter
} }
} }
_func_stack.push(compar); _func_stack.Push(compar);
compar.attributes.AddRange(fn.attributes); compar.attributes.AddRange(fn.attributes);
//si_list.sym_info=fn; //si_list.sym_info=fn;
break; break;
@ -3563,7 +3562,7 @@ namespace PascalABCCompiler.TreeConverter
private void check_function_not_exists(common_function_node fn) private void check_function_not_exists(common_function_node fn)
{ {
List<SymbolInfo> sil=null; List<SymbolInfo> sil=null;
if (_func_stack.size<=1) if (_func_stack.Count<=1)
{ {
if (_ctn!=null) if (_ctn!=null)
{ {
@ -3576,9 +3575,9 @@ namespace PascalABCCompiler.TreeConverter
} }
else else
{ {
common_function_node temp=_func_stack.pop(); common_function_node temp=_func_stack.Pop();
sil=_func_stack.top().scope.FindOnlyInScope(fn.name); sil=_func_stack.Peek().scope.FindOnlyInScope(fn.name);
_func_stack.push(temp); _func_stack.Push(temp);
} }
if(sil != null) if(sil != null)
foreach(SymbolInfo si in sil) foreach(SymbolInfo si in sil)
@ -3673,7 +3672,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
return _func_stack.top().function_code; return _func_stack.Peek().function_code;
} }
case block_type.type_block: case block_type.type_block:
{ {
@ -3692,7 +3691,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
_func_stack.top().function_code=value; _func_stack.Peek().function_code=value;
break; break;
} }
case block_type.type_block: case block_type.type_block:
@ -3716,7 +3715,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
case block_type.function_block: case block_type.function_block:
{ {
return _func_stack.top().cycles_stack; return _func_stack.Peek().cycles_stack;
} }
case block_type.type_block: case block_type.type_block:
{ {
@ -4043,13 +4042,13 @@ namespace PascalABCCompiler.TreeConverter
public void enter_in_cycle(statement_node stmt) public void enter_in_cycle(statement_node stmt)
{ {
cycle_stack.push(stmt); cycle_stack.Push(stmt);
disable_finally_control_break_check = true; disable_finally_control_break_check = true;
} }
public void leave_cycle() public void leave_cycle()
{ {
cycle_stack.pop(); cycle_stack.Pop();
disable_finally_control_break_check = false; disable_finally_control_break_check = false;
} }

View file

@ -62,7 +62,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
symtab.Clear(); symtab.Clear();
_type_constructor.reset(); _type_constructor.reset();
statement_list_stack.clear(); statement_list_stack.Clear();
//_current_operation_kind = special_operation_kind.none; //_current_operation_kind = special_operation_kind.none;
} }
@ -83,7 +83,7 @@ namespace PascalABCCompiler.TreeConverter
internal void statement_list_stack_push(statements_list sl) internal void statement_list_stack_push(statements_list sl)
{ {
sl.Scope = new SymbolTable.BlockScope(symbol_table, syntax_tree_visitor.context.CurrentScope); sl.Scope = new SymbolTable.BlockScope(symbol_table, syntax_tree_visitor.context.CurrentScope);
statement_list_stack.push(sl); statement_list_stack.Push(sl);
} }
internal SymbolTable.Scope create_block_scope() internal SymbolTable.Scope create_block_scope()
@ -94,17 +94,17 @@ namespace PascalABCCompiler.TreeConverter
internal void statement_list_stack_push(statements_list sl, SymbolTable.Scope Scope) internal void statement_list_stack_push(statements_list sl, SymbolTable.Scope Scope)
{ {
sl.Scope = Scope; sl.Scope = Scope;
statement_list_stack.push(sl); statement_list_stack.Push(sl);
} }
internal statements_list statement_list_stack_pop() internal statements_list statement_list_stack_pop()
{ {
return statement_list_stack.pop(); return statement_list_stack.Pop();
} }
internal statements_list statement_list_stack_first() internal statements_list statement_list_stack_first()
{ {
return statement_list_stack.first(); return statement_list_stack.Last();
} }
public type_constructor type_constructor public type_constructor type_constructor
@ -975,10 +975,10 @@ namespace PascalABCCompiler.TreeConverter
if (factparams.Count > 0) loc = factparams[factparams.Count-1].location; if (factparams.Count > 0) loc = factparams[factparams.Count-1].location;
//var_definition_node vdn=syntax_tree_visitor.context.add_var_definition_in_entry_scope(get_temp_arr_name(),loc); //var_definition_node vdn=syntax_tree_visitor.context.add_var_definition_in_entry_scope(get_temp_arr_name(),loc);
var_definition_node vdn = null; var_definition_node vdn = null;
if (syntax_tree_visitor.context.converted_func_stack.size > 0) if (syntax_tree_visitor.context.converted_func_stack.Count > 0)
{ {
common_function_node cfn = syntax_tree_visitor.context.converted_func_stack.first(); common_function_node cfn = syntax_tree_visitor.context.converted_func_stack.Last();
if (cfn.is_generic_function || !syntax_tree_visitor.context.has_nested_functions && syntax_tree_visitor.context.converted_func_stack.size == 1) if (cfn.is_generic_function || !syntax_tree_visitor.context.has_nested_functions && syntax_tree_visitor.context.converted_func_stack.Count == 1)
{ {
vdn = syntax_tree_visitor.context.add_var_definition(get_temp_arr_name(), loc); vdn = syntax_tree_visitor.context.add_var_definition(get_temp_arr_name(), loc);

View file

@ -1881,7 +1881,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
return null; return null;
} }
if (context.cycle_stack.Empty) if (context.cycle_stack.Count == 0)
{ {
AddError(new BreakStatementWithoutComprehensiveCycle(call_location)); AddError(new BreakStatementWithoutComprehensiveCycle(call_location));
} }
@ -1889,7 +1889,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
AddError(call_location, "EXIT_BREAK_CONTINUE_IN_FINALLY_BLOCK"); AddError(call_location, "EXIT_BREAK_CONTINUE_IN_FINALLY_BLOCK");
} }
statement_node sn = context.cycle_stack.top(); statement_node sn = context.cycle_stack.Peek();
switch (sn.semantic_node_type) switch (sn.semantic_node_type)
{ {
case semantic_node_type.while_node: case semantic_node_type.while_node:
@ -1922,7 +1922,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
return null; return null;
} }
if (context.cycle_stack.Empty) if (context.cycle_stack.Count == 0)
{ {
AddError(new ContinueStatementWithoutComprehensiveCycle(call_location)); AddError(new ContinueStatementWithoutComprehensiveCycle(call_location));
} }
@ -1930,7 +1930,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
AddError(call_location, "EXIT_BREAK_CONTINUE_IN_FINALLY_BLOCK"); AddError(call_location, "EXIT_BREAK_CONTINUE_IN_FINALLY_BLOCK");
} }
statement_node sn = context.cycle_stack.top(); statement_node sn = context.cycle_stack.Peek();
switch (sn.semantic_node_type) switch (sn.semantic_node_type)
{ {
case semantic_node_type.while_node: case semantic_node_type.while_node:
@ -2025,7 +2025,7 @@ namespace PascalABCCompiler.TreeConverter
} }
statement_node stm = convert_strong(eh.statements); statement_node stm = convert_strong(eh.statements);
context.leave_code_block(); context.leave_code_block();
sl = convertion_data_and_alghoritms.statement_list_stack.pop(); sl = convertion_data_and_alghoritms.statement_list_stack.Pop();
if (sl.statements.Count > 0 || sl.local_variables.Count > 0) if (sl.statements.Count > 0 || sl.local_variables.Count > 0)
{ {
sl.statements.AddElement(stm); sl.statements.AddElement(stm);
@ -2808,7 +2808,7 @@ namespace PascalABCCompiler.TreeConverter
} }
} }
} }
if (context.converting_block() == block_type.function_block && context.converted_func_stack.size == 1) if (context.converting_block() == block_type.function_block && context.converted_func_stack.Count == 1)
{ {
if (_block.defs != null) if (_block.defs != null)
foreach (declaration decl in _block.defs.defs) foreach (declaration decl in _block.defs.defs)
@ -2821,7 +2821,7 @@ namespace PascalABCCompiler.TreeConverter
} }
} }
weak_node_test_and_visit(_block.defs); weak_node_test_and_visit(_block.defs);
if (context.converting_block() == block_type.function_block && context.converted_func_stack.size == 1) if (context.converting_block() == block_type.function_block && context.converted_func_stack.Count == 1)
context.has_nested_functions = false; context.has_nested_functions = false;
//ssyy добавил генерацию вызова конструктора предка без параметров //ssyy добавил генерацию вызова конструктора предка без параметров
if (context.converting_block() == block_type.function_block) if (context.converting_block() == block_type.function_block)
@ -2941,7 +2941,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
if (context.converting_block() == block_type.function_block) if (context.converting_block() == block_type.function_block)
{ {
if (context.func_stack.top().functions_nodes_list.Count > 0) if (context.func_stack.Peek().functions_nodes_list.Count > 0)
{ {
AddError(new LambdasNotAllowedWhenNestedSubprogrammesAreUsed(get_location(lambdaSearcher.FoundLambda))); AddError(new LambdasNotAllowedWhenNestedSubprogrammesAreUsed(get_location(lambdaSearcher.FoundLambda)));
} }
@ -2956,9 +2956,9 @@ namespace PascalABCCompiler.TreeConverter
l.goto_statements.Clear(); l.goto_statements.Clear();
l.comprehensive_code_block = null; l.comprehensive_code_block = null;
} }
if (context.func_stack.size > 0) if (context.func_stack.Count > 0)
{ {
var fun = context.func_stack.top(); var fun = context.func_stack.Peek();
foreach (var l in fun.label_nodes_list) foreach (var l in fun.label_nodes_list)
{ {
l.goto_statements.Clear(); l.goto_statements.Clear();
@ -9142,8 +9142,8 @@ namespace PascalABCCompiler.TreeConverter
first_iteration = false; first_iteration = false;
continue; continue;
} }
if (last_call != null && convertion_data_and_alghoritms.statement_list_stack.size > 0) if (last_call != null && convertion_data_and_alghoritms.statement_list_stack.Count > 0)
convertion_data_and_alghoritms.statement_list_stack.top().statements.AddElement(last_call); convertion_data_and_alghoritms.statement_list_stack.Peek().statements.AddElement(last_call);
expression_node en = convert_strong(ex); expression_node en = convert_strong(ex);
check_on_loop_variable(en); check_on_loop_variable(en);
//if (en.type == null) //if (en.type == null)
@ -9260,8 +9260,8 @@ namespace PascalABCCompiler.TreeConverter
{ {
if (!readln_string_file) if (!readln_string_file)
{ {
if (last_call != null && convertion_data_and_alghoritms.statement_list_stack.size > 0) if (last_call != null && convertion_data_and_alghoritms.statement_list_stack.Count > 0)
convertion_data_and_alghoritms.statement_list_stack.top().statements.AddElement(last_call); convertion_data_and_alghoritms.statement_list_stack.Peek().statements.AddElement(last_call);
exl.Clear(); exl.Clear();
if (read_from_file) if (read_from_file)
@ -11990,7 +11990,7 @@ namespace PascalABCCompiler.TreeConverter
assign_doc_info(cdn,_typed_const_definition); assign_doc_info(cdn,_typed_const_definition);
check_for_type_allowed(tn,get_location(_typed_const_definition.const_type)); check_for_type_allowed(tn,get_location(_typed_const_definition.const_type));
check_using_static_class(tn, get_location(_typed_const_definition.const_type)); check_using_static_class(tn, get_location(_typed_const_definition.const_type));
if (context.converted_type != null && context.converted_func_stack.Empty) if (context.converted_type != null && context.converted_func_stack.Count == 0)
if (!constant_in_class_valid(tn))//proverka na primitivnost konstanty v klasse if (!constant_in_class_valid(tn))//proverka na primitivnost konstanty v klasse
AddError(get_location(_typed_const_definition), "CLASS_CONSTANT_CAN_HAVE_ONLY_PRIMITIVE_VALUE"); AddError(get_location(_typed_const_definition), "CLASS_CONSTANT_CAN_HAVE_ONLY_PRIMITIVE_VALUE");
if (tn is common_type_node) if (tn is common_type_node)
@ -12055,7 +12055,7 @@ namespace PascalABCCompiler.TreeConverter
cdn.const_value = convert_strong_to_constant_node(_simple_const_definition.const_value); cdn.const_value = convert_strong_to_constant_node(_simple_const_definition.const_value);
cdn.const_value.SetType(DeduceType(cdn.const_value.type, cdn.const_value.location)); cdn.const_value.SetType(DeduceType(cdn.const_value.type, cdn.const_value.location));
assign_doc_info(cdn,_simple_const_definition); assign_doc_info(cdn,_simple_const_definition);
if (context.converted_type != null && context.converted_func_stack.Empty) if (context.converted_type != null && context.converted_func_stack.Count == 0)
if (!constant_in_class_valid(cdn.const_value.type)) if (!constant_in_class_valid(cdn.const_value.type))
AddError(get_location(_simple_const_definition), "CLASS_CONSTANT_CAN_HAVE_ONLY_PRIMITIVE_VALUE"); AddError(get_location(_simple_const_definition), "CLASS_CONSTANT_CAN_HAVE_ONLY_PRIMITIVE_VALUE");
@ -12436,7 +12436,7 @@ namespace PascalABCCompiler.TreeConverter
tn.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.array_kind)// || tn.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.array_kind)// ||
/*tn.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.set_type*/ /*tn.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.set_type*/
{ {
if (context.converted_func_stack.Empty) if (context.converted_func_stack.Count == 0)
{ {
type_synonym ts = new type_synonym(name, tn, loc); type_synonym ts = new type_synonym(name, tn, loc);
assign_doc_info(ts,_type_declaration); assign_doc_info(ts,_type_declaration);
@ -13585,7 +13585,7 @@ namespace PascalABCCompiler.TreeConverter
var proc_name = _procedure_definition.proc_header != null && _procedure_definition.proc_header.name != null var proc_name = _procedure_definition.proc_header != null && _procedure_definition.proc_header.name != null
? _procedure_definition.proc_header.name.meth_name ? _procedure_definition.proc_header.name.meth_name
: null; : null;
if (_procedure_definition.proc_header.attributes != null && context.converted_func_stack.size >= 1) if (_procedure_definition.proc_header.attributes != null && context.converted_func_stack.Count >= 1)
AddError(get_location(_procedure_definition.proc_header), "ATTRIBUTES_FOR_NESTED_FUNCTIONS_NOT_ALLOWED"); AddError(get_location(_procedure_definition.proc_header), "ATTRIBUTES_FOR_NESTED_FUNCTIONS_NOT_ALLOWED");
if (context.top_function != null && context.top_function.generic_params != null && !LambdaHelper.IsLambdaName(proc_name) && !(_procedure_definition.proc_header is SyntaxTree.constructor)) if (context.top_function != null && context.top_function.generic_params != null && !LambdaHelper.IsLambdaName(proc_name) && !(_procedure_definition.proc_header is SyntaxTree.constructor))
AddError(get_location(_procedure_definition.proc_header), "NESTED_FUNCTIONS_IN_GENERIC_FUNCTIONS_NOT_ALLOWED"); AddError(get_location(_procedure_definition.proc_header), "NESTED_FUNCTIONS_IN_GENERIC_FUNCTIONS_NOT_ALLOWED");
@ -13651,7 +13651,7 @@ namespace PascalABCCompiler.TreeConverter
} }
} }
//\ssyy //\ssyy
if (context.converted_type != null && context.converted_type.IsStatic && !_procedure_definition.proc_header.class_keyword && context.func_stack.Empty) if (context.converted_type != null && context.converted_type.IsStatic && !_procedure_definition.proc_header.class_keyword && context.func_stack.Count == 0)
AddError(get_location(_procedure_definition), "STATIC_CLASSES_CANNOT_NON_STATIC_MEMBERS"); AddError(get_location(_procedure_definition), "STATIC_CLASSES_CANNOT_NON_STATIC_MEMBERS");
if (_procedure_definition.proc_body == null) if (_procedure_definition.proc_body == null)
{ {
@ -16410,7 +16410,7 @@ namespace PascalABCCompiler.TreeConverter
statement_node then_st = convert_strong(_if_node.then_body); statement_node then_st = convert_strong(_if_node.then_body);
context.leave_code_block(); context.leave_code_block();
sl = convertion_data_and_alghoritms.statement_list_stack.pop(); sl = convertion_data_and_alghoritms.statement_list_stack.Pop();
if (sl.statements.Count > 0 || sl.local_variables.Count > 0) if (sl.statements.Count > 0 || sl.local_variables.Count > 0)
{ {
sl.statements.AddElement(then_st); sl.statements.AddElement(then_st);
@ -16429,7 +16429,7 @@ namespace PascalABCCompiler.TreeConverter
if (_if_node.else_body != null) if (_if_node.else_body != null)
{ {
sl = convertion_data_and_alghoritms.statement_list_stack.pop(); sl = convertion_data_and_alghoritms.statement_list_stack.Pop();
if (sl.statements.Count > 0 || sl.local_variables.Count > 0) if (sl.statements.Count > 0 || sl.local_variables.Count > 0)
{ {
sl.statements.AddElement(else_st); sl.statements.AddElement(else_st);
@ -16462,7 +16462,7 @@ namespace PascalABCCompiler.TreeConverter
statement_node st = convert_strong(_while_node.statements); statement_node st = convert_strong(_while_node.statements);
context.leave_code_block(); context.leave_code_block();
sl = convertion_data_and_alghoritms.statement_list_stack.pop(); sl = convertion_data_and_alghoritms.statement_list_stack.Pop();
if (sl.statements.Count > 0 || sl.local_variables.Count > 0) if (sl.statements.Count > 0 || sl.local_variables.Count > 0)
{ {
sl.statements.AddElement(st); sl.statements.AddElement(st);
@ -16486,7 +16486,7 @@ namespace PascalABCCompiler.TreeConverter
statement_node st = convert_strong(_repeat_node.statements); statement_node st = convert_strong(_repeat_node.statements);
sl = convertion_data_and_alghoritms.statement_list_stack.pop(); sl = convertion_data_and_alghoritms.statement_list_stack.Pop();
//if (!(st is statements_list)) //if (!(st is statements_list))
if (sl.statements.Count > 0 || sl.local_variables.Count > 0) if (sl.statements.Count > 0 || sl.local_variables.Count > 0)
{ {
@ -17888,7 +17888,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
AddError(get_location(ident), "NO_BASE_CLASS_DEFINED_BUT_INHERITED_MEET"); AddError(get_location(ident), "NO_BASE_CLASS_DEFINED_BUT_INHERITED_MEET");
} }
common_method_node cmn = context.converted_func_stack.first() as common_method_node; common_method_node cmn = context.converted_func_stack.Last() as common_method_node;
if (cmn == null) if (cmn == null)
{ {
AddError(get_location(ident), "NAME_IN_BASE_CLASS_MUST_BE_METHOD"); AddError(get_location(ident), "NAME_IN_BASE_CLASS_MUST_BE_METHOD");
@ -17945,7 +17945,7 @@ namespace PascalABCCompiler.TreeConverter
} }
string name = ident.name; string name = ident.name;
if (string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(name))
name = context.converted_func_stack.first().name; name = context.converted_func_stack.Last().name;
List<SymbolInfo> sil = context.converted_type.base_type.find_in_type(name, context.CurrentScope); List<SymbolInfo> sil = context.converted_type.base_type.find_in_type(name, context.CurrentScope);
if (sil == null) if (sil == null)
{ {
@ -18081,8 +18081,8 @@ namespace PascalABCCompiler.TreeConverter
location loc = get_location(_ident); location loc = get_location(_ident);
function_node fn = sil.FirstOrDefault().sym_info as function_node; function_node fn = sil.FirstOrDefault().sym_info as function_node;
base_function_call bfc = null; base_function_call bfc = null;
common_function_node cfn = context.converted_func_stack.first(); common_function_node cfn = context.converted_func_stack.Last();
int depth = context.converted_func_stack.size-1; int depth = context.converted_func_stack.Count-1;
if (!constr) if (!constr)
{ {
if (fn.polymorphic_state != SemanticTree.polymorphic_state.ps_static) if (fn.polymorphic_state != SemanticTree.polymorphic_state.ps_static)
@ -18547,7 +18547,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
base_function_call bfc = stl.statements[0] as basic_function_call; base_function_call bfc = stl.statements[0] as basic_function_call;
if (bfc.type != null && bfc.type.name.Contains("<>local_variables_class") && (semantic_statement is compiled_constructor_call || semantic_statement is common_constructor_call) if (bfc.type != null && bfc.type.name.Contains("<>local_variables_class") && (semantic_statement is compiled_constructor_call || semantic_statement is common_constructor_call)
&& !context.converted_func_stack.Empty && context.converted_func_stack.top() is common_method_node && (context.converted_func_stack.top() as common_method_node).is_constructor) && context.converted_func_stack.Count > 0 && context.converted_func_stack.Peek() is common_method_node && (context.converted_func_stack.Peek() as common_method_node).is_constructor)
stl.statements.AddElementFirst(semantic_statement); stl.statements.AddElementFirst(semantic_statement);
else else
stl.statements.AddElement(semantic_statement); stl.statements.AddElement(semantic_statement);
@ -18616,7 +18616,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
if (for_intellisense) if (for_intellisense)
{ {
if (syntax_statement is assign && !(context.converted_func_stack.top() != null && context.converted_func_stack.top().return_value_type is undefined_type) if (syntax_statement is assign && !(context.converted_func_stack.FirstOrDefault() != null && context.converted_func_stack.Peek().return_value_type is undefined_type)
|| syntax_statement is procedure_call || syntax_statement is raise_statement) || syntax_statement is procedure_call || syntax_statement is raise_statement)
{ {
@ -18632,7 +18632,7 @@ namespace PascalABCCompiler.TreeConverter
base_function_call bfc = stl.statements[0] as basic_function_call; base_function_call bfc = stl.statements[0] as basic_function_call;
if (bfc.type != null && bfc.type.name.Contains("<>local_variables_class") && if (bfc.type != null && bfc.type.name.Contains("<>local_variables_class") &&
(semantic_statement is compiled_constructor_call && !(semantic_statement as compiled_constructor_call).new_obj_awaited() || semantic_statement is common_constructor_call && !(semantic_statement as common_constructor_call).new_obj_awaited()) (semantic_statement is compiled_constructor_call && !(semantic_statement as compiled_constructor_call).new_obj_awaited() || semantic_statement is common_constructor_call && !(semantic_statement as common_constructor_call).new_obj_awaited())
&& !context.converted_func_stack.Empty && context.converted_func_stack.top() is common_method_node && (context.converted_func_stack.top() as common_method_node).is_constructor) && context.converted_func_stack.Count > 0 && context.converted_func_stack.Peek() is common_method_node && (context.converted_func_stack.Peek() as common_method_node).is_constructor)
stl.statements.AddElementFirst(semantic_statement); stl.statements.AddElementFirst(semantic_statement);
else else
stl.statements.AddElement(semantic_statement); stl.statements.AddElement(semantic_statement);
@ -18657,7 +18657,7 @@ namespace PascalABCCompiler.TreeConverter
throw ex; throw ex;
} }
} }
convertion_data_and_alghoritms.statement_list_stack.pop(); convertion_data_and_alghoritms.statement_list_stack.Pop();
#region MikhailoMMX, обработка omp parallel sections #region MikhailoMMX, обработка omp parallel sections
//флаг был установлен только если это самый внешний parallel sections и нужно сгенерировать обе ветки //флаг был установлен только если это самый внешний parallel sections и нужно сгенерировать обе ветки
@ -18717,13 +18717,13 @@ namespace PascalABCCompiler.TreeConverter
{ {
string module_name = ""; string module_name = "";
string name = ""; string name = "";
if (context.converted_func_stack.size > 1) if (context.converted_func_stack.Count > 1)
AddError(context.top_function.loc, "EXTERNAL_METHOD_CANNOT_BE_NESTED"); AddError(context.top_function.loc, "EXTERNAL_METHOD_CANNOT_BE_NESTED");
if (context.converted_func_stack.top() is common_method_node && (context.converted_func_stack.top() as common_method_node).polymorphic_state != SemanticTree.polymorphic_state.ps_static) if (context.converted_func_stack.Peek() is common_method_node && (context.converted_func_stack.Peek() as common_method_node).polymorphic_state != SemanticTree.polymorphic_state.ps_static)
AddError(context.top_function.loc, "EXTERNAL_METHOD_SHOULD_BE_STATIC"); AddError(context.top_function.loc, "EXTERNAL_METHOD_SHOULD_BE_STATIC");
if (context.converted_func_stack.top().is_generic_function) if (context.converted_func_stack.Peek().is_generic_function)
AddError(context.top_function.loc, "EXTERNAL_METHOD_CANNOT_BE_GENERIC"); AddError(context.top_function.loc, "EXTERNAL_METHOD_CANNOT_BE_GENERIC");
if (context.converted_func_stack.top() is common_method_node && (context.converted_func_stack.top() as common_method_node).common_comprehensive_type.is_generic_type_definition) if (context.converted_func_stack.Peek() is common_method_node && (context.converted_func_stack.Peek() as common_method_node).common_comprehensive_type.is_generic_type_definition)
AddError(context.top_function.loc, "EXTERNAL_METHOD_CANNOT_BE_DECLARED_IN_GENERIC_TYPE"); AddError(context.top_function.loc, "EXTERNAL_METHOD_CANNOT_BE_DECLARED_IN_GENERIC_TYPE");
if (_external_directive.modulename == null) if (_external_directive.modulename == null)
@ -18769,7 +18769,7 @@ namespace PascalABCCompiler.TreeConverter
AddError(get_location(_external_directive.modulename), "DLLNAME_CANNOT_BE_EMPTY"); AddError(get_location(_external_directive.modulename), "DLLNAME_CANNOT_BE_EMPTY");
if (_external_directive.name == null) if (_external_directive.name == null)
{ {
name = context.converted_func_stack.top().name; name = context.converted_func_stack.Peek().name;
} }
else else
if (_external_directive.name is SyntaxTree.string_const) if (_external_directive.name is SyntaxTree.string_const)
@ -20909,7 +20909,7 @@ namespace PascalABCCompiler.TreeConverter
fn.body = convert_strong(node.stmt); fn.body = convert_strong(node.stmt);
context.leave_code_block(); context.leave_code_block();
slst = convertion_data_and_alghoritms.statement_list_stack.pop(); slst = convertion_data_and_alghoritms.statement_list_stack.Pop();
if (slst.statements.Count > 0 || slst.local_variables.Count > 0) if (slst.statements.Count > 0 || slst.local_variables.Count > 0)
{ {
slst.statements.AddElement(fn.body); slst.statements.AddElement(fn.body);
@ -20918,7 +20918,7 @@ namespace PascalABCCompiler.TreeConverter
context.leave_cycle(); context.leave_cycle();
head_stmts = convertion_data_and_alghoritms.statement_list_stack.pop(); head_stmts = convertion_data_and_alghoritms.statement_list_stack.Pop();
head_stmts.statements.AddElement(fn); head_stmts.statements.AddElement(fn);
return_value(head_stmts); return_value(head_stmts);
@ -21334,7 +21334,7 @@ namespace PascalABCCompiler.TreeConverter
procDecl.proc_header.where_defs = whereSection; procDecl.proc_header.where_defs = whereSection;
} }
if (!context.func_stack.Empty && context.func_stack.top().polymorphic_state == SemanticTree.polymorphic_state.ps_static if (context.func_stack.Count > 0 && context.func_stack.Peek().polymorphic_state == SemanticTree.polymorphic_state.ps_static
|| context.converted_type != null && context.converted_type.IsStatic) || context.converted_type != null && context.converted_type.IsStatic)
{ {
procDecl.proc_header.class_keyword = true; procDecl.proc_header.class_keyword = true;

View file

@ -2,7 +2,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net40</TargetFramework> <TargetFramework>net40</TargetFramework>
<OutputPath>..\bin\</OutputPath> <OutputPath>..\bin\</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>

View file

@ -21,7 +21,7 @@ namespace PascalABCCompiler.TreeRealization
return exprl; return exprl;
} }
} }
[Serializable] [Serializable]
public class attributes_list : extended_collection<attribute_node> public class attributes_list : extended_collection<attribute_node>
{ {
@ -210,7 +210,17 @@ namespace PascalABCCompiler.TreeRealization
} }
[Serializable] [Serializable]
public class statement_node_stack : stack<statement_node> public class statement_node_stack : Stack<statement_node>
{
}
[Serializable]
public class statement_list_stack: Stack<statements_list>
{
}
[Serializable]
public class common_function_node_stack: Stack<common_function_node>
{ {
} }