From a45982f64deb575bbcde8c281ecf8d067d111ef3 Mon Sep 17 00:00:00 2001 From: miks1965 Date: Fri, 21 Aug 2015 10:24:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=20=D0=B2=D0=B8=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../YieldVisitors/DeleteAllLocalDefs.cs | 41 +++++++++++++++++++ .../YieldVisitors/LoweringVisitor.cs | 18 ++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 _ParsePABC1/ParsePABC1/YieldVisitors/DeleteAllLocalDefs.cs diff --git a/_ParsePABC1/ParsePABC1/YieldVisitors/DeleteAllLocalDefs.cs b/_ParsePABC1/ParsePABC1/YieldVisitors/DeleteAllLocalDefs.cs new file mode 100644 index 000000000..adf7f55b1 --- /dev/null +++ b/_ParsePABC1/ParsePABC1/YieldVisitors/DeleteAllLocalDefs.cs @@ -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 LocalDeletedDefs = new List(); // все локальные описания + public HashSet LocalDeletedDefsNames = new HashSet(); // их имена - для быстрого поиска + + 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(); + d.defs.Remove(vd); // может ли остаться список declarations пустым? + } + + } +} diff --git a/_ParsePABC1/ParsePABC1/YieldVisitors/LoweringVisitor.cs b/_ParsePABC1/ParsePABC1/YieldVisitors/LoweringVisitor.cs index a6defffe5..4d954c22c 100644 --- a/_ParsePABC1/ParsePABC1/YieldVisitors/LoweringVisitor.cs +++ b/_ParsePABC1/ParsePABC1/YieldVisitors/LoweringVisitor.cs @@ -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;