Мелкие исправления yield

This commit is contained in:
miks1965 2016-07-10 14:49:12 +03:00
parent ac66a64784
commit 40ad330bf7
23 changed files with 34 additions and 303 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "1";
public const string Build = "0";
public const string Revision = "1266";
public const string Revision = "1269";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=1
%REVISION%=1266
%COREVERSION%=0
%REVISION%=1269
%MINOR%=1
%MAJOR%=3

Binary file not shown.

View file

@ -958,8 +958,8 @@
<FileName>\yield\syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs</FileName>
<Text>public ConstructFiniteAutomata1(block bl)</Text>
<OCtx>
<i Type="Method">public ConstructFiniteAutomata1 ( block bl )</i>
<i Type="ClassOrNamespace">class ConstructFiniteAutomata1</i>
<i Type="Method">public ConstructFiniteAutomata ( block bl )</i>
<i Type="ClassOrNamespace">class ConstructFiniteAutomata</i>
<i Type="ClassOrNamespace">namespace SyntaxVisitors</i>
<i Type="CS_TreeNode">
</i>

View file

@ -1 +1 @@
!define VERSION '3.1.0.1266'
!define VERSION '3.1.0.1269'

View file

@ -1092,11 +1092,6 @@ namespace PascalABCCompiler.SyntaxTree
{
DefaultVisit(_yield_unknown_foreach_type);
}
public virtual void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
{
DefaultVisit(_yield_unknown_foreach_type_ident);
}
}

View file

@ -1741,14 +1741,6 @@ namespace PascalABCCompiler.SyntaxTree
{
}
public virtual void pre_do_visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
{
}
public virtual void post_do_visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
{
}
public override void visit(syntax_tree_node _syntax_tree_node)
{
DefaultVisit(_syntax_tree_node);
@ -3608,13 +3600,6 @@ namespace PascalABCCompiler.SyntaxTree
pre_do_visit(_yield_unknown_foreach_type);
post_do_visit(_yield_unknown_foreach_type);
}
public override void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
{
DefaultVisit(_yield_unknown_foreach_type_ident);
pre_do_visit(_yield_unknown_foreach_type_ident);
post_do_visit(_yield_unknown_foreach_type_ident);
}
}

View file

@ -454,8 +454,6 @@ namespace PascalABCCompiler.SyntaxTree
return new yield_variable_definitions_with_unknown_type();
case 216:
return new yield_unknown_foreach_type();
case 217:
return new yield_unknown_foreach_type_ident();
}
return null;
}
@ -3834,17 +3832,6 @@ namespace PascalABCCompiler.SyntaxTree
read_type_definition(_yield_unknown_foreach_type);
}
public void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
{
read_yield_unknown_foreach_type_ident(_yield_unknown_foreach_type_ident);
}
public void read_yield_unknown_foreach_type_ident(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
{
read_ident(_yield_unknown_foreach_type_ident);
}
}

View file

@ -6000,18 +6000,6 @@ namespace PascalABCCompiler.SyntaxTree
write_type_definition(_yield_unknown_foreach_type);
}
public void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
{
bw.Write((Int16)217);
write_yield_unknown_foreach_type_ident(_yield_unknown_foreach_type_ident);
}
public void write_yield_unknown_foreach_type_ident(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
{
write_ident(_yield_unknown_foreach_type_ident);
}
}

View file

@ -32020,89 +32020,6 @@ namespace PascalABCCompiler.SyntaxTree
}
///<summary>
///Узел для приведения типа enumerator.Current к типу переменной цикла foreach
///</summary>
[Serializable]
public partial class yield_unknown_foreach_type_ident : ident
{
///<summary>
///Конструктор без параметров.
///</summary>
public yield_unknown_foreach_type_ident()
{
}
///<summary>
///Конструктор с параметрами.
///</summary>
public yield_unknown_foreach_type_ident(string _name)
{
this._name=_name;
}
///<summary>
///Конструктор с параметрами.
///</summary>
public yield_unknown_foreach_type_ident(string _name,SourceContext sc)
{
this._name=_name;
source_context = sc;
}
///<summary>
///Свойство для получения количества всех подузлов без элементов поля типа List
///</summary>
public override Int32 subnodes_without_list_elements_count
{
get
{
return 0;
}
}
///<summary>
///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List
///</summary>
public override Int32 subnodes_count
{
get
{
return 0;
}
}
///<summary>
///Индексатор для получения всех подузлов
///</summary>
public override syntax_tree_node this[Int32 ind]
{
get
{
if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1)
throw new IndexOutOfRangeException();
return null;
}
set
{
if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1)
throw new IndexOutOfRangeException();
}
}
///<summary>
///Метод для обхода дерева посетителем
///</summary>
///<param name="visitor">Объект-посетитель.</param>
///<returns>Return value is void</returns>
public override void visit(IVisitor visitor)
{
visitor.visit(this);
}
}
}

View file

@ -1404,19 +1404,6 @@ namespace PascalABCCompiler.SyntaxTree
}
// frninja 12/05/16 - хелпер для yield. Хранит типы локальных переменных метода-итератора
[Serializable]
public class yield_locals_type_map_helper
{
public Dictionary<var_def_statement, semantic_type_node> vars_type_map { get; private set; }
public yield_locals_type_map_helper()
{
vars_type_map = new Dictionary<var_def_statement, semantic_type_node>();
}
}
// end frninja
// frninja 12/05/16 - хелперы для yield
public partial class yield_unknown_expression_type : type_definition
{
@ -1428,56 +1415,24 @@ namespace PascalABCCompiler.SyntaxTree
set { _Vds = value; }
}
public yield_locals_type_map_helper MapHelper { get; private set; }
public yield_unknown_expression_type(var_def_statement vds, yield_locals_type_map_helper map_helper)
public yield_unknown_expression_type(var_def_statement vds)
{
this.Vds = vds;
this.MapHelper = map_helper;
}
}
public partial class yield_var_def_statement_with_unknown_type : statement
{
public yield_locals_type_map_helper map_helper { get; private set; }
public yield_var_def_statement_with_unknown_type(var_def_statement vds, yield_locals_type_map_helper map_helper)
{
this.vars = vds;
this.map_helper = map_helper;
}
public override string ToString()
{
var sb = new System.Text.StringBuilder();
sb.Append(vars.ToString());
/*if (vars_type != null)
{
sb.Append(": ");
sb.Append(vars_type.ToString());
}
if (inital_value != null)
{
sb.Append(" := ");
sb.Append(inital_value.ToString());
}*/
return sb.ToString();
}
}
public partial class yield_variable_definitions_with_unknown_type : declaration
{
public yield_locals_type_map_helper map_helper { get; private set; }
public yield_variable_definitions_with_unknown_type(variable_definitions vd, yield_locals_type_map_helper map_helper)
{
this.vars = vd;
this.map_helper = map_helper;
}
}
public partial class yield_unknown_ident : ident
{
protected ident _UnknownID;

View file

@ -1306,12 +1306,6 @@ namespace PascalABCCompiler.SyntaxTree
///<param name="_yield_unknown_foreach_type">Node to visit</param>
///<returns> Return value is void </returns>
void visit(yield_unknown_foreach_type _yield_unknown_foreach_type);
///<summary>
///Method to visit yield_unknown_foreach_type_ident.
///</summary>
///<param name="_yield_unknown_foreach_type_ident">Node to visit</param>
///<returns> Return value is void </returns>
void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident);
}

Binary file not shown.

View file

@ -1698,6 +1698,8 @@ var
ExitCode := 0; // TODO Сделать возврат в Main
///--
DefaultEncoding: Encoding;
///--
PrintDelimDefault: string := ' ';
///--
var
@ -7939,7 +7941,7 @@ end;
/// Выводит последовательность на экран, используя пробел в качестве разделителя
function Print<T>(Self: sequence of T): sequence of T; extensionmethod;
begin
Result := Self.Print(' ');
Result := Self.Print(PrintDelimDefault);
end;
/// Выводит последовательность на экран, используя delim в качестве разделителя, и переходит на новую строку
@ -7953,7 +7955,7 @@ end;
/// Выводит последовательность на экран, используя пробел качестве разделителя, и переходит на новую строку
function Println<T>(Self: sequence of T): sequence of T; extensionmethod;
begin
Result := Self.Println(' ');
Result := Self.Println(PrintDelimDefault);
end;
/// Выводит последовательность строк в файл

View file

@ -1,4 +1,4 @@
/// Модуль электронного задачника Programming Taskbook 4
/// Модуль электронного задачника Programming Taskbook 4
unit PT4;
//------------------------------------------------------------------------------
@ -1255,6 +1255,7 @@ var __initialized := false;
procedure __InitModule;
begin
CurrentIOSystem := new IOPT4System;
PrintDelimDefault := '';
loadNodes := new ArrayList;
ExecuteBeforeProcessTerminateIn__Mode += PT4_ExecuteBeforeProcessTerminateIn__Mode;
StartPT(512);

View file

@ -4669,15 +4669,6 @@ namespace PascalABCCompiler.TreeConverter
}
// end frninja
// frninja 29/05/16 - для приведения типов в lowered foreach
if (_method_call.dereferencing_value is yield_unknown_foreach_type_ident)
{
var nodeToVisit = new method_call(GetForeachVariableTypeName((_method_call.dereferencing_value as yield_unknown_foreach_type_ident).unknown_foreach), _method_call.parameters);
visit(nodeToVisit);
return;
}
// end frninja
//lroman
if (_method_call.dereferencing_value is closure_substituting_node)
{
@ -15770,8 +15761,6 @@ namespace PascalABCCompiler.TreeConverter
else AddError(to.location, "Не могу вывести тип при наличии yield: "+ to.type.full_name);
//to.type = from.type; // и без всякого real_type!
}
//else if (to.type is compiled_type_node)
//else if (to.type.name.StartsWith("IEnumerable<IEnumerableAutoType>")) // Сделать не сравнением строк!!!
else if (to.type is compiled_generic_instance_type_node && (to.type as compiled_generic_instance_type_node).instance_params[0] is ienumerable_auto_type)
{
var tt = to.type;
@ -19127,7 +19116,6 @@ namespace PascalABCCompiler.TreeConverter
{
// Отвечает за типизацию всех переменных с автовыведением типа
// Пробую сделать по-другому: перевести в auto_type и потом на присваивании перехватить
// _unk_expr.MapHelper.vars_type_map[_unk_expr.Vds].visit(this);
var t = new semantic_type_node(new auto_type(get_location(_unk_expr)));
t.visit(this);
}
@ -19135,90 +19123,22 @@ namespace PascalABCCompiler.TreeConverter
// frninja - заполнение хелпера типов локальных переменных для yield
public override void visit(SyntaxTree.yield_var_def_statement_with_unknown_type _vars)
{
/*if ((object)_vars.vars.vars_type != null)
{
// Visit stored vars
_vars.vars.visit(this);
return;
}
var t = convert_strong(_vars.vars.inital_value);
_vars.map_helper.vars_type_map[_vars.vars] = new SyntaxTree.semantic_type_node(t.type);
*/
// Visit stored vars
_vars.vars.visit(this);
}
// frninja - заполнение хелпера типов локальных переменных для yield// frninja - заполнение хелпера типов локальных переменных для yield
// frninja - заполнение хелпера типов локальных переменных для yield
public override void visit(SyntaxTree.yield_variable_definitions_with_unknown_type _vars)
{
/*foreach (var vd in _vars.vars.list)
{
if ((object)vd.vars_type != null)
{
continue;
}
var t = convert_strong(vd.inital_value);
_vars.map_helper.vars_type_map[vd] = new SyntaxTree.semantic_type_node(t.type);
}*/
// Visit stored vars
_vars.vars.visit(this);
}
private Dictionary<Guid, semantic_type_node> _yieldForeachTypeMap = new Dictionary<Guid, semantic_type_node>();
// frninja 29/05/16 - выявляем тип перемнной в foreach
public override void visit(SyntaxTree.yield_unknown_foreach_type _unk)
{
/*var _foreach_stmt = _unk.unknown_foreach;
semantic_type_node t;
if (_yieldForeachTypeMap.ContainsKey(_foreach_stmt.Guid))
{
t = _yieldForeachTypeMap[_foreach_stmt.Guid];
}
else
{
expression_node in_what = convert_strong(_foreach_stmt.in_what);
type_node elem_type = null;
if (!FindIEnumerableElementType(_foreach_stmt, in_what.type, ref elem_type))
{
AddError(in_what.location, "CAN_NOT_EXECUTE_FOREACH_BY_EXPR_OF_TYPE_{0}", in_what.type.name);
}
t = new SyntaxTree.semantic_type_node(elem_type);
// Add to map
_yieldForeachTypeMap.Add(_foreach_stmt.Guid, t);
}*/
// Visit type
var t = new semantic_type_node(new ienumerable_auto_type(get_location(_unk)));
t.visit(this);
}
private ident GetForeachVariableTypeName(foreach_stmt _foreach_stmt)
{
type_node tn = null;
if (_yieldForeachTypeMap.ContainsKey(_foreach_stmt.Guid))
{
tn = _yieldForeachTypeMap[_foreach_stmt.Guid].type as type_node;
}
return new SyntaxTree.ident(tn.name);
}
// frninja 29/05/16 - получаем имя типа переменной в foreach
public override void visit(SyntaxTree.yield_unknown_foreach_type_ident _unk)
{
var t = this.GetForeachVariableTypeName(_unk.unknown_foreach);
// Visit type
t.visit(this);
}
// end frninja
/*public SyntaxTree.question_colon_expression ConvertToQCE(dot_question_node dqn)
{
// Неверно работает. Пока не используется. Доделать

View file

@ -345,7 +345,7 @@ namespace PascalABCCompiler.TreeRealization
if (shouldAddToAllTypeInstances) //lroman// Если зашли сюда при выведении типов параметров лямбды, то тип инстанцироваться может с типом lambda_any_type_node. Поэтому, если выводим типы. То данную инстанцию не добавляем
{
if (instance.instance_params[0] is ienumerable_auto_type)
if (instance.instance_params[0] is ienumerable_auto_type) // SSM 10.07.16 (yields) в эту таблицу не включаются типы IEnumerable<ienumerable_auto_type>, т.к. потом они всё равно автовыводятся
{
//instance = instance;
}

View file

@ -16,11 +16,8 @@ namespace SyntaxVisitors
public List<var_def_statement> LocalDeletedVS = new List<var_def_statement>(); // var_statement's, потом объединим с LocalDeletedVD для верного порядка
public yield_locals_type_map_helper VarTypeMap { get; private set; }
public LocalVariablesTypeDetectorHelperVisior(yield_locals_type_map_helper varTypeMap)
public LocalVariablesTypeDetectorHelperVisior()
{
this.VarTypeMap = varTypeMap;
}
public override void visit(yield_variable_definitions_with_unknown_type yvds)
@ -33,7 +30,7 @@ namespace SyntaxVisitors
LocalDeletedVS.Insert(0, vs.var_def);
ReplaceStatement(vs, new yield_var_def_statement_with_unknown_type(vs.var_def, this.VarTypeMap));
ReplaceStatement(vs, new yield_var_def_statement_with_unknown_type(vs.var_def));
}
public override void visit(variable_definitions vd)
@ -43,7 +40,7 @@ namespace SyntaxVisitors
LocalDeletedDefs.Insert(0, v);
}
Replace(vd, new yield_variable_definitions_with_unknown_type(vd, VarTypeMap));
Replace(vd, new yield_variable_definitions_with_unknown_type(vd));
// еще - не заходить в лямбды
}

View file

@ -80,11 +80,6 @@ namespace SyntaxVisitors
// DO NOTHING
}
public override void visit(yield_unknown_foreach_type_ident _unk)
{
// DO NOTHING
}
// frninja 21/05/16
public override void visit(foreach_stmt frch)
{
@ -101,7 +96,8 @@ namespace SyntaxVisitors
// var a: System.Collections.Generic.IEnumerable<yield_unknown_foreach_type> := l;
var foreachCollIdent = this.NewForeachCollectionName();
var foreachCollType = new template_type_reference(new named_type_reference("System.Collections.Generic.IEnumerable"), new template_param_list(new yield_unknown_foreach_type(frch)));
var foreachCollType = new template_type_reference(new named_type_reference("System.Collections.Generic.IEnumerable"),
new template_param_list(new yield_unknown_foreach_type(frch)));
var foreachCollVarDef = new var_statement(foreachCollIdent, foreachCollType);
var ass = new assign(foreachCollIdent, frch.in_what);
@ -164,20 +160,13 @@ namespace SyntaxVisitors
// Добавляем тело цикла в stl
var stl = new statement_list(st);
ProcessNode(frch.stmt); //?? - видимо, для обработки вложенных конструкций
ProcessNode(frch.stmt); // для обработки вложенных конструкций
stl.Add(frch.stmt);
var whileNode = new while_node(new method_call(new dot_node(enumeratorIdent, "MoveNext"), new expression_list()),
stl,
WhileCycleType.While);
/*ReplaceStatement(frch,
SeqStatements(new var_statement(enumeratorIdent,
new named_type_reference("System.Collections.IEnumerator"),
// НЕБЕЗОПАСНО!
new method_call(new dot_node(frch.in_what as addressed_value, new ident("GetEnumerator")), new expression_list())),
whileNode));
*/
ReplaceStatement(frch,
SeqStatements(foreachCollVarDef, ass, enumeratorVarDef, whileNode)
);

View file

@ -82,8 +82,8 @@ namespace SyntaxVisitors
IEnumerable<var_def_statement> fields, // локальные переменные
IDictionary<string, string> localsMap, // отображение для захваченных имен локальных переменных
IDictionary<string, string> formalParamsMap, // отображение для захваченных имен формальных параметров
IDictionary<var_def_statement, var_def_statement> localsCloneMap, // отображение для оберток локальных переменных
yield_locals_type_map_helper localTypeMapHelper) // вспомогательный узел для типов локальных переменных
IDictionary<var_def_statement, var_def_statement> localsCloneMap // отображение для оберток локальных переменных
)
{
var fh = (pd.proc_header as function_header);
if (fh == null)
@ -104,7 +104,7 @@ namespace SyntaxVisitors
if (vds.inital_value != null)
{
//return new var_def_statement(ids, new yield_unknown_expression_type(localsCloneMap[vds], varsTypeDetectorHelper), null);
return new var_def_statement(ids, new yield_unknown_expression_type(localsCloneMap[vds], localTypeMapHelper), null);
return new var_def_statement(ids, new yield_unknown_expression_type(localsCloneMap[vds]), null);
}
else
{
@ -606,7 +606,7 @@ namespace SyntaxVisitors
/// </summary>
/// <param className="pd">Объявление метода</param>
/// <returns>Коллекция посещенных локальных переменных</returns>
private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable<var_def_statement> localsClonesCollection, out yield_locals_type_map_helper localsTypeMapHelper)
private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable<var_def_statement> localsClonesCollection)
{
// Выполняем определение типов локальных переменных с автовыводом типов
@ -616,8 +616,7 @@ namespace SyntaxVisitors
pdCloned.has_yield = false;
// Заменяем локальные переменные с неизвестным типом на обертки-хелперы (откладываем до семантики)
localsTypeMapHelper = new yield_locals_type_map_helper();
LocalVariablesTypeDetectorHelperVisior localsTypeDetectorHelperVisitor = new LocalVariablesTypeDetectorHelperVisior(localsTypeMapHelper);
LocalVariablesTypeDetectorHelperVisior localsTypeDetectorHelperVisitor = new LocalVariablesTypeDetectorHelperVisior();
pdCloned.visit(localsTypeDetectorHelperVisitor);
// frninja 16/03/16 - строим список локальных переменных в правильном порядке
@ -927,9 +926,8 @@ namespace SyntaxVisitors
pd.visit(deleteBeginEndVisitor);
// Обработка метода для корректного захвата локальных переменных и их типов
yield_locals_type_map_helper localsTypeMapHelper;
IEnumerable<var_def_statement> localsClonesCollection;
CreateLocalVariablesTypeProxies(pd, out localsClonesCollection, out localsTypeMapHelper);
CreateLocalVariablesTypeProxies(pd, out localsClonesCollection);
// frninja 16/11/15: перенес ниже чтобы работал захват для lowered for
@ -960,7 +958,7 @@ namespace SyntaxVisitors
(pd.proc_body as block).program_code = cfa.res;
// Конструируем определение класса
var cct = GenClassesForYield(pd, dld.LocalDeletedDefs, CapturedLocalsNamesMap, CapturedFormalParamsNamesMap, localsCloneMap, localsTypeMapHelper); // все удаленные описания переменных делаем описанием класса
var cct = GenClassesForYield(pd, dld.LocalDeletedDefs, CapturedLocalsNamesMap, CapturedFormalParamsNamesMap, localsCloneMap); // все удаленные описания переменных делаем описанием класса
// Вставляем классы-хелперы
InsertYieldHelpers(pd, cct);

Binary file not shown.

View file

@ -1698,6 +1698,8 @@ var
ExitCode := 0; // TODO Сделать возврат в Main
///--
DefaultEncoding: Encoding;
///--
PrintDelimDefault: string := ' ';
///--
var
@ -7939,7 +7941,7 @@ end;
/// Выводит последовательность на экран, используя пробел в качестве разделителя
function Print<T>(Self: sequence of T): sequence of T; extensionmethod;
begin
Result := Self.Print(' ');
Result := Self.Print(PrintDelimDefault);
end;
/// Выводит последовательность на экран, используя delim в качестве разделителя, и переходит на новую строку
@ -7953,7 +7955,7 @@ end;
/// Выводит последовательность на экран, используя пробел качестве разделителя, и переходит на новую строку
function Println<T>(Self: sequence of T): sequence of T; extensionmethod;
begin
Result := Self.Println(' ');
Result := Self.Println(PrintDelimDefault);
end;
/// Выводит последовательность строк в файл

View file

@ -1,4 +1,4 @@
/// Модуль электронного задачника Programming Taskbook 4
/// Модуль электронного задачника Programming Taskbook 4
unit PT4;
//------------------------------------------------------------------------------
@ -1255,6 +1255,7 @@ var __initialized := false;
procedure __InitModule;
begin
CurrentIOSystem := new IOPT4System;
PrintDelimDefault := '';
loadNodes := new ArrayList;
ExecuteBeforeProcessTerminateIn__Mode += PT4_ExecuteBeforeProcessTerminateIn__Mode;
StartPT(512);