Исправление реализации (var b := 1) методом синтаксического сахара

This commit is contained in:
Mikhalkovich Stanislav 2024-01-02 14:43:48 +03:00
parent 5cd6ab97f9
commit 4bf9c36d49
13 changed files with 1223 additions and 1159 deletions

View file

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

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3408
%MINOR%=9
%REVISION%=3409
%COREVERSION%=0
%MAJOR%=3

View file

@ -2,7 +2,7 @@
// This CSharp output file generated by Gardens Point LEX
// Version: 1.1.3.301
// Machine: DESKTOP-G8V08V4
// DateTime: 31.12.2023 18:49:08
// DateTime: 02.01.2024 14:42:04
// UserName: ?????????
// GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource>

View file

@ -4213,8 +4213,6 @@ factor
{ $$ = $1; }
| tuple
{ $$ = $1; }
| tkRoundOpen tkVar identifier tkAssign expr_dq tkRoundClose
{ $$ = new let_var_expr($3,$5,@$); }
;
literal_or_number
@ -4249,6 +4247,8 @@ var_reference
{ $$ = $1; }
| var_question_point
{ $$ = $1; }
| tkRoundOpen tkVar identifier tkAssign expr_dq tkRoundClose
{ $$ = new let_var_expr($3,$5,@$); }
;
var_address

File diff suppressed because it is too large Load diff

View file

@ -1 +1 @@
3.9.0.3408
3.9.0.3409

View file

@ -1 +1 @@
!define VERSION '3.9.0.3408'
!define VERSION '3.9.0.3409'

View file

@ -2106,4 +2106,9 @@ namespace PascalABCCompiler.SyntaxTree
public class semantic_check_delegates_pointers_in_cached_function // класс - маркер семантической проверки
{ }
public partial class let_var_expr
{
public bool visit_var = true;
}
}

View file

@ -21,11 +21,14 @@ namespace PascalABCCompiler.SyntaxTreeConverters
// FillParentNodeVisitor расположен в SyntaxTree/tree как базовый визитор, отвечающий за построение дерева
//FillParentNodeVisitor.New.ProcessNode(root); // почему-то перепрошивает не всё. А следующий вызов - всё
root.FillParentsInAllChilds();
#if DEBUG
// var stat = new ABCStatisticsVisitor();
// stat.ProcessNode(root);
#endif
// SSM 02.01.24
LetExprVisitor.New.ProcessNode(root);
// new range - до всего! До выноса выражения с лямбдой из foreach. 11.07 добавил поиск yields и присваивание pd.HasYield
NewRangeDesugarAndFindHasYieldVisitor.New.ProcessNode(root);

View file

@ -0,0 +1,50 @@
// 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.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors
{
/// <summary>
/// А здесь не только замена кортежа - здесь оптимизация (a,b) := (1,2) и var (a,b) := (1,2)
/// </summary>
public class LetExprVisitor : BaseChangeVisitor
{
public static LetExprVisitor New
{
get { return new LetExprVisitor(); }
}
private int num = 0;
public string UniqueName()
{
num++;
return "#let_expr_vis"+num.ToString();
}
public override void visit(let_var_expr let_ex)
{
// Сгенерировать var_def_statement
var vds = new var_statement(let_ex.id, let_ex.ex, let_ex.source_context);
Replace(let_ex, let_ex.id);
// Подняться до statement
syntax_tree_node p = let_ex;
while (p != null && !(p is statement))
p = p.Parent;
if (p == null)
new SyntaxVisitorError("LET_EXPR_CANNOT_BE_IN_THIS_CONTEXT", let_ex);
var stat = p as statement;
var sl = new List<statement>();
sl.Add(vds);
sl.Add(stat);
ReplaceStatementUsingParent(stat, sl);
ProcessNode(vds);
ProcessNode(stat);
}
}
}

View file

@ -51,6 +51,7 @@
<Compile Include="LightSymInfoVisitors\LightScopeCreator.cs" />
<Compile Include="LightSymInfoVisitors\LightScopeHelperClasses.cs" />
<Compile Include="SugarVisitors\CacheFunctionVisitor.cs" />
<Compile Include="SugarVisitors\LetExprVisitor.cs" />
<Compile Include="SugarVisitors\UnpackLambdaParametersVisitor.cs" />
<Compile Include="TeacherControl\TeacherControl.cs" />
<Compile Include="UniversalVisitors\ABCStatisticsVisitors.cs" />

14
TestSuite/let_ex1.pas Normal file
View file

@ -0,0 +1,14 @@
##
var c := (var a := (var b := 5 + 1) + 2);
Assert(a = 8);
Assert(b = 6);
Assert(c = 8);
Print(a,b,c);
var lst := |(var yyy := 2),yyy+1|;
Print(lst);
Assert(lst.SequenceEqual(Arr(2,3)));
var a1 := (var b1 := 5) ** 2;
var a2 := Sqrt((var b2 := 5));
var res := Arr(1,2,3).Sum(x -> begin var d := (var b := 1); Result := d; end);
res.Print;
Assert(res = 3);

View file

@ -19800,13 +19800,6 @@ namespace PascalABCCompiler.TreeConverter
ret.reset(); // SSM 19.01.17 не возвращать семантическое значение т.к. ничего не нужно добавлять в текущий список операторов!!
}
public override void visit(SyntaxTree.let_var_expr node)
{
var vs = new SyntaxTree.var_statement(node.id, node.ex);
visit(vs);
return_value((statement_node)convert_strong(node.ex));
}
public override void visit(SyntaxTree.expression_as_statement node)
{
return_value((statement_node)convert_strong(node.expr));