51 lines
1.6 KiB
C#
51 lines
1.6 KiB
C#
// 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);
|
||
}
|
||
}
|
||
}
|