Ускорен (a,b) := (b,a) - работает как Swap

This commit is contained in:
Mikhalkovich Stanislav 2023-05-16 15:36:00 +03:00
parent a196a18832
commit 03dea1990c
8 changed files with 48 additions and 9 deletions

View file

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

View file

@ -1,4 +1,4 @@
%MINOR%=9
%REVISION%=3281
%COREVERSION%=0 %COREVERSION%=0
%REVISION%=3282
%MINOR%=9
%MAJOR%=3 %MAJOR%=3

View file

@ -1 +1 @@
3.9.0.3281 3.9.0.3282

View file

@ -1 +1 @@
!define VERSION '3.9.0.3281' !define VERSION '3.9.0.3282'

View file

@ -46956,7 +46956,8 @@ namespace PascalABCCompiler.SyntaxTree
///<summary> ///<summary>
/// ///Это внутри begin:var (a,b) := (1,2);
///</summary> ///</summary>
[Serializable] [Serializable]
public partial class assign_var_tuple : statement public partial class assign_var_tuple : statement
@ -50962,7 +50963,7 @@ namespace PascalABCCompiler.SyntaxTree
///<summary> ///<summary>
/// ///Это только в секции до begin: var (a,b) := (3,4); begin
///</summary> ///</summary>
[Serializable] [Serializable]
public partial class var_tuple_def_statement : var_def_statement public partial class var_tuple_def_statement : var_def_statement

View file

@ -3520,7 +3520,7 @@
<HelpData Key="assign_tuple" Value="" /> <HelpData Key="assign_tuple" Value="" />
<HelpData Key="assign_tuple.expr" Value="" /> <HelpData Key="assign_tuple.expr" Value="" />
<HelpData Key="assign_tuple.vars" Value="" /> <HelpData Key="assign_tuple.vars" Value="" />
<HelpData Key="assign_var_tuple" Value="" /> <HelpData Key="assign_var_tuple" Value="Это внутри begin:var (a,b) := (1,2);&#xD;&#xA;" />
<HelpData Key="assign_var_tuple.expr" Value="" /> <HelpData Key="assign_var_tuple.expr" Value="" />
<HelpData Key="assign_var_tuple.idents" Value="" /> <HelpData Key="assign_var_tuple.idents" Value="" />
<HelpData Key="attribute" Value="" /> <HelpData Key="attribute" Value="" />
@ -4858,7 +4858,7 @@
<HelpData Key="var_statement." Value="" /> <HelpData Key="var_statement." Value="" />
<HelpData Key="var_statement.override string ToString()" Value="" /> <HelpData Key="var_statement.override string ToString()" Value="" />
<HelpData Key="var_statement.var_def" Value="" /> <HelpData Key="var_statement.var_def" Value="" />
<HelpData Key="var_tuple_def_statement" Value="" /> <HelpData Key="var_tuple_def_statement" Value="Это только в секции до begin: var (a,b) := (3,4); begin" />
<HelpData Key="variable_definitions" Value="Секция описания переменных (до beginа). Состоит из var_def_statement. Не путать с var_statement - однострочным описанием переменной внутри begin-end" /> <HelpData Key="variable_definitions" Value="Секция описания переменных (до beginа). Состоит из var_def_statement. Не путать с var_statement - однострочным описанием переменной внутри begin-end" />
<HelpData Key="variable_definitions." Value="" /> <HelpData Key="variable_definitions." Value="" />
<HelpData Key="variable_definitions.override string ToString()" Value="" /> <HelpData Key="variable_definitions.override string ToString()" Value="" />

View file

@ -120,6 +120,7 @@ namespace SyntaxVisitors.SugarVisitors
visit(assvartup.expr); // В assvartup.expr могут содержаться лямбды, в которых будут другие assign_var_tuple. visit(assvartup.expr); // В assvartup.expr могут содержаться лямбды, в которых будут другие assign_var_tuple.
// И вообще другой синтаксический сахар, размещённый в этом визиторе // И вообще другой синтаксический сахар, размещённый в этом визиторе
} }
public override void visit(var_tuple_def_statement vtd) public override void visit(var_tuple_def_statement vtd)
{ {
// Состоит из var_def_statements. Некоторые являются var_tuple_def_statement // Состоит из var_def_statements. Некоторые являются var_tuple_def_statement

View file

@ -19,6 +19,13 @@ namespace SyntaxVisitors.SugarVisitors
get { return new TupleVisitor(); } get { return new TupleVisitor(); }
} }
private int num = 0;
public string UniqueName()
{
num++;
return "#tup_vis"+num.ToString();
}
public override void visit(read_accessor_name wn) public override void visit(read_accessor_name wn)
{ {
DefaultVisit(wn); DefaultVisit(wn);
@ -48,6 +55,8 @@ namespace SyntaxVisitors.SugarVisitors
ProcessNode(ls.to_statement); ProcessNode(ls.to_statement);
} }
// Здесь раскрываются ситуации когда справа - кортеж с константами: var (a,b) := (1,2) и только это.
// Остальное раскрывается в AssignTuplesDesugarVisitor
public override void visit(assign_var_tuple assvartup) public override void visit(assign_var_tuple assvartup)
{ {
if (assvartup.expr is tuple_node tn && tn.el.expressions.All(ex => ex is const_node) && !tn.el.expressions.Any(ex => ex is nil_const)) if (assvartup.expr is tuple_node tn && tn.el.expressions.All(ex => ex is const_node) && !tn.el.expressions.Any(ex => ex is nil_const))
@ -94,6 +103,33 @@ namespace SyntaxVisitors.SugarVisitors
} }
ReplaceStatementUsingParent(asstup, sl); ReplaceStatementUsingParent(asstup, sl);
} }
else if (asstup.expr is tuple_node tn1 && !tn1.el.expressions.Any(ex => ex is nil_const))
{
var n = asstup.vars.variables.Count();
if (n > tn1.el.Count)
throw new SyntaxVisitorError("TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMENT", asstup.vars.variables[0]);
var sl = new List<statement>();
for (var i = 0; i < n; i++)
{
var temp_id = new ident(UniqueName(), tn1.el.expressions[i].source_context);
var var_def = new var_def_statement(temp_id, tn1.el.expressions[i], tn1.el.expressions[i].source_context);
var a = new var_statement(var_def, tn1.el.expressions[i].source_context);
sl.Add(a);
}
//for (var i = 0; i < n; i++)
for (var i = n-1; i >=0; i--)
{
var a = new assign(asstup.vars.variables[i],
(sl[i] as var_statement).var_def.vars.idents[0],
Operators.Assignment,
asstup.vars.variables[i].source_context);
sl.Add(a);
}
ReplaceStatementUsingParent(asstup, sl);
}
else else
{ {
DefaultVisit(asstup); DefaultVisit(asstup);
@ -111,6 +147,7 @@ namespace SyntaxVisitors.SugarVisitors
} }
} }
// А это по идее до begin - там немного другие узлы и внешний контекст
public override void visit(var_tuple_def_statement vtd) public override void visit(var_tuple_def_statement vtd)
{ {
if (vtd.inital_value is tuple_node tn && tn.el.expressions.All(ex => ex is const_node) && !tn.el.expressions.Any(ex => ex is nil_const)) if (vtd.inital_value is tuple_node tn && tn.el.expressions.All(ex => ex is const_node) && !tn.el.expressions.Any(ex => ex is nil_const))