Исправление реализации (var b := 1) методом синтаксического сахара
This commit is contained in:
parent
5cd6ab97f9
commit
4bf9c36d49
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=0
|
||||
%REVISION%=3408
|
||||
%MINOR%=9
|
||||
%REVISION%=3409
|
||||
%COREVERSION%=0
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -1 +1 @@
|
|||
3.9.0.3408
|
||||
3.9.0.3409
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.9.0.3408'
|
||||
!define VERSION '3.9.0.3409'
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
50
SyntaxVisitors/SugarVisitors/LetExprVisitor.cs
Normal file
50
SyntaxVisitors/SugarVisitors/LetExprVisitor.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
14
TestSuite/let_ex1.pas
Normal 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);
|
||||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in a new issue