This commit is contained in:
miks1965 2016-08-20 11:55:59 +03:00
parent 89c9e3ee58
commit 5272e1db91
8 changed files with 81 additions and 4 deletions

View file

@ -1181,6 +1181,32 @@
<i Type="Method">public override void visit ( formal_parameters fp )</i>
</ICtx>
</Node>
<Node Name="ForwardDefInUnitError">
<Items>
<Node Name="InsertGlobalIteratorMethodPredefinition">
<FileName>\syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs</FileName>
<Text>private bool InsertGlobalIteratorMethodPredefinition(procedure_definition pd)</Text>
<OCtx>
<i Type="Method">private bool InsertGlobalIteratorMethodPredefinition ( procedure_definition pd )</i>
<i Type="ClassOrNamespace">public class ProcessYieldCapturedVarsVisitor : BaseChangeVisitor</i>
<i Type="ClassOrNamespace">namespace SyntaxVisitors</i>
<i Type="CS_TreeNode">
</i>
</OCtx>
</Node>
<Node Name="check_unique_or_predefined(common_function_node fn)">
<FileName>\TreeConverter\TreeConversion\compilation_context.cs</FileName>
<Text>private bool check_unique_or_predefined(common_function_node fn)</Text>
<OCtx>
<i Type="Method">private bool check_unique_or_predefined ( common_function_node fn )</i>
<i Type="ClassOrNamespace">public class compilation_context</i>
<i Type="ClassOrNamespace">namespace PascalABCCompiler . TreeConverter</i>
<i Type="CS_TreeNode">
</i>
</OCtx>
</Node>
</Items>
</Node>
</Items>
</Node>
<Node Name="a.Sort((row1, row2) -&gt; 1)">

Binary file not shown.

View file

@ -832,6 +832,20 @@ namespace SyntaxVisitors
return false;
}
// SSM и еще нельзя генерировать если это функция, описанная в interface и implementation модуля
var un = UpperNode(2) as implementation_node;
if (un != null)
{
var cu = UpperNode(3) as unit_module;
if (cu != null) // а это всегда так
{
var fhh = cu.interface_part.interface_definitions.defs.OfType<function_header>().Where(fh => fh.name.meth_name.name.ToLower()==pd.proc_header.name.meth_name.name.ToLower());
if (fhh.Any()) // если еть в разделе интерфейса такие же имена, то не генерировать предописание
return false;
// вообще-то надо сравнивать заголовки - не только имена - но даже так устраняется основная масса ошибок
}
}
var pdPredefs = UpperTo<declarations>().defs
.OfType<procedure_definition>()
.Where(lpd => lpd.proc_body == null
@ -877,6 +891,8 @@ namespace SyntaxVisitors
return;
// frninja 05/06/16 - вставляем предописание если метод-итератор описан не в классе (обычная функция) чтоб работали рекурсивные вызовы
// Нужен также для верной работы <yield_error> функции, проверяющей разные ошибки на этапе семантики
// Как только уберу <yield_error>-функцию, от этого тоже можно избавиться
bool methodPredefCreated = InsertGlobalIteratorMethodPredefinition(pd);
// frninja 24/05/16 - оборачиваем одиночные операторы в begin..end
@ -966,10 +982,10 @@ namespace SyntaxVisitors
pd.has_yield = false;
// frninja 05/06/16 - убираем where-секцию у описания метода. Они уже скопированы куда надо
if (methodPredefCreated)
/*if (methodPredefCreated)
{
pd.proc_header.where_defs = null;
}
}*/
//mids = null; // вдруг мы выйдем из процедуры, не зайдем в другую, а там - оператор! Такого конечно не может быть
}

View file

@ -1562,6 +1562,8 @@ function ReadSeqReal(const prompt: string; n: integer): sequence of real;
/// Выводит приглашение к вводу и возвращает последовательность из n строк, введенных с клавиатуры
function ReadSeqString(const prompt: string; n: integer): sequence of string;
/// Возвращает последовательность целых, вводимых с клавиатуры пока выполняется определенное условие
//function ReadSeqIntegerWhile(cond: integer -> boolean): sequence of integer;
// -----------------------------------------------------
//>> Подпрограммы для генерации динамических массивов # Subroutines for array of T generation
@ -4094,6 +4096,17 @@ begin
Result := Range(1,n).Select(i->ReadInteger());
end;
function ReadSeqIntegerWhile(cond: integer -> boolean): sequence of integer;
begin
while True do
begin
var x := ReadInteger();
if cond(x) then
break;
yield 1;
end;
end;
function ReadSeqInteger(const prompt: string; n: integer): sequence of integer;
begin
Print(prompt);
@ -8765,6 +8778,8 @@ begin
yield c.TakeGroup();
end;
//ToDo Сделать AdjacentGroup с функцией сравнения
/// Возвращает минимальный элемент
function Min<T>(Self: array of T): T; extensionmethod; where T: System.IComparable<T>;
begin

View file

@ -3001,7 +3001,9 @@ namespace PascalABCCompiler.TreeConverter
AddError(new FunctionDuplicateDefinition(compar, fn));
}
else
{
AddError(new FunctionDuplicateDefinition(compar, fn));
}
}
}
si = si.Next;
@ -3279,7 +3281,9 @@ namespace PascalABCCompiler.TreeConverter
AddError(new FunctionDuplicateDefinition(compar, fn));
}
else
{
AddError(new FunctionDuplicateDefinition(compar,fn));
}
}
si = si.Next;
}

View file

@ -25,12 +25,13 @@ namespace YieldDesugarSyntaxTreeConverter
public syntax_tree_node Convert(syntax_tree_node root)
{
root.visit(new MarkMethodHasYieldAndCheckSomeErrorsVisitor());
root.visit(new ProcessYieldCapturedVarsVisitor());
ProcessYieldCapturedVarsVisitor.New.ProcessNode(root);
//root.visit(py); - пропускал корень
#if DEBUG
try
{
//root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz1.txt"));
root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz1.txt"));
}
catch
{

Binary file not shown.

View file

@ -1562,6 +1562,8 @@ function ReadSeqReal(const prompt: string; n: integer): sequence of real;
/// Выводит приглашение к вводу и возвращает последовательность из n строк, введенных с клавиатуры
function ReadSeqString(const prompt: string; n: integer): sequence of string;
/// Возвращает последовательность целых, вводимых с клавиатуры пока выполняется определенное условие
function ReadSeqIntegerWhile(cond: integer -> boolean): sequence of integer;
// -----------------------------------------------------
//>> Подпрограммы для генерации динамических массивов # Subroutines for array of T generation
@ -4094,6 +4096,17 @@ begin
Result := Range(1,n).Select(i->ReadInteger());
end;
function ReadSeqIntegerWhile(cond: integer -> boolean): sequence of integer;
begin
while True do
begin
var x := ReadInteger();
if not cond(x) then
break;
yield x;
end;
end;
function ReadSeqInteger(const prompt: string; n: integer): sequence of integer;
begin
Print(prompt);
@ -8765,6 +8778,8 @@ begin
yield c.TakeGroup();
end;
//ToDo Сделать AdjacentGroup с функцией сравнения
/// Возвращает минимальный элемент
function Min<T>(Self: array of T): T; extensionmethod; where T: System.IComparable<T>;
begin