В проект визиторов

This commit is contained in:
miks1965 2015-08-21 10:24:12 +03:00
parent 868616ade1
commit a45982f64d
2 changed files with 56 additions and 3 deletions

View file

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors
{
public class DeleteAllLocalDefs : BaseChangeVisitor
{
public List<var_def_statement> LocalDeletedDefs = new List<var_def_statement>(); // все локальные описания
public HashSet<string> LocalDeletedDefsNames = new HashSet<string>(); // их имена - для быстрого поиска
public DeleteAllLocalDefs() // надо запускать этот визитор начиная с корня подпрограммы
{
}
public override void visit(var_statement vs) // локальные описания внутри процедуры
{
LocalDeletedDefs.Add(vs.var_def);
DeleteInStatementList(vs);
LocalDeletedDefsNames.UnionWith(vs.var_def.vars.idents.Select(id => id.name));
}
public override void visit(variable_definitions vd)
{
foreach (var v in vd.list)
{
LocalDeletedDefs.Add(v);
LocalDeletedDefsNames.UnionWith(v.vars.idents.Select(id => id.name));
}
var d = UpperNodeAs<declarations>();
d.defs.Remove(vd); // может ли остаться список declarations пустым?
}
}
}

View file

@ -17,6 +17,14 @@ namespace SyntaxVisitors
get { return new LoweringVisitor(); }
}
int varnum = 0;
public string newVarName()
{
varnum++;
return "<>varLV" + varnum.ToString();
}
public static void Accept(procedure_definition pd)
{
New.ProcessNode(pd);
@ -63,13 +71,17 @@ namespace SyntaxVisitors
var gt1 = goto_statement.New;
var gt2 = goto_statement.New;
var assi = new var_statement(fn.loop_variable, fn.type_name, fn.initial_value);
var endtemp = new ident(newVarName());
var ass1 = new var_statement(fn.loop_variable, fn.type_name, fn.initial_value);
var ass2 = new var_statement(endtemp, fn.type_name, fn.finish_value);
var if0 = new if_node(new bin_expr(fn.loop_variable, fn.finish_value,Operators.Greater), gt1);
var if0 = new if_node(bin_expr.Greater(fn.loop_variable, fn.finish_value), gt1);
var lb2 = new labeled_statement(gt2.label, if0);
var lb1 = new labeled_statement(gt1.label);
var Inc = new procedure_call(new method_call(new ident("Inc"),new expression_list(fn.loop_variable)));
ReplaceStatement(fn, SeqStatements(lb2, fn.statements, gt2, lb1));
ReplaceStatement(fn, SeqStatements(ass1,ass2,lb2, fn.statements, Inc, gt2, lb1));
// в declarations ближайшего блока добавить описание labels
block bl = listNodes.FindLast(x => x is block) as block;