Ускорен (a,b) := (b,a) - работает как Swap
This commit is contained in:
parent
a196a18832
commit
03dea1990c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
%MINOR%=9
|
|
||||||
%REVISION%=3281
|
|
||||||
%COREVERSION%=0
|
%COREVERSION%=0
|
||||||
|
%REVISION%=3282
|
||||||
|
%MINOR%=9
|
||||||
%MAJOR%=3
|
%MAJOR%=3
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
3.9.0.3281
|
3.9.0.3282
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
!define VERSION '3.9.0.3281'
|
!define VERSION '3.9.0.3282'
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
" />
|
||||||
<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="" />
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue