public override void visit(while_node wn) { var b = HasStatementVisitor <yield_node> .Has(wn); if (!b) { return; } var gotoBreak = goto_statement.New; var gotoContinue = goto_statement.New; ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak); wn.statements.visit(replaceBreakContinueVis); ProcessNode(wn.statements); statement if0; //if (wn.expr is ident && (wn.expr as ident).name.ToLower() == "true") // if0 = gotoBreak; //else if0 = new if_node(un_expr.Not(wn.expr), gotoBreak); var lb2 = new labeled_statement(gotoContinue.label, if0); // continue var lb1 = new labeled_statement(gotoBreak.label); // break ReplaceStatement(wn, SeqStatements(lb2, wn.statements, gotoContinue, lb1)); // в declarations ближайшего блока добавить описание labels block bl = listNodes.FindLast(x => x is block) as block; bl.defs.Add(new label_definitions(gotoBreak.label, gotoContinue.label)); }
public statement MyStmt(expression ex, statement st) { // Проверить, что в ex - целый тип // Сделать специальный узел для проверки new semantic_check("Тип проверки",params syntax_node[] ob) // Включать этот узел первым для "сахарных" узлов синтаксического дерева var sc = new semantic_check("ExprIsInteger", ex); var id = new ident("#my"); var idlist = new ident_list(id); var typ = new named_type_reference("integer"); var one = new int32_const(1); var vdef = new var_def_statement(idlist, typ, one, definition_attribute.None, false, null); var vstat = new var_statement(vdef, null); var ass = new assign(new ident("#my"), one, Operators.AssignmentAddition); var stlistwhile = new statement_list(st); stlistwhile.Add(ass); var bin = new bin_expr(id, ex, Operators.LessEqual); var wh = new while_node(bin, stlistwhile, WhileCycleType.While); var stlist = new statement_list(sc); stlist.Add(vstat); stlist.Add(wh); return(stlist); }
private void VisitWhile(while_node stmt) { RetVal rv = GetConstantValue(stmt.condition); VisitExpression(stmt.condition); if (rv == RetVal.False) { is_break_stmt = true; } VisitStatement(stmt.body); }
public while_node NewWhileStmt(token_info tkWhile, expression expr, token_info opt_tk_do, statement stmt, LexLocation loc) { var nws = new while_node(expr, stmt, WhileCycleType.While, loc); if (opt_tk_do == null) { file_position fp = expr.source_context.end_position; syntax_tree_node err_stn = stmt; if (err_stn == null) { err_stn = expr; } parsertools.errors.Add(new PABCNETUnexpectedToken(parsertools.CurrentFileName, StringResources.Get("TKDO"), new SourceContext(fp.line_num, fp.column_num + 1, fp.line_num, fp.column_num + 1, 0, 0), err_stn)); } return(nws); }
public override void visit(while_node wn) { ProcessNode(wn.statements); var gt1 = new goto_statement(newLabelName()); var gt2 = new goto_statement(newLabelName()); var gt3 = new goto_statement(newLabelName()); var if0 = new if_node(wn.expr, gt1, null); var lb3 = new labeled_statement(gt3.label, if0); var lb1 = new labeled_statement(gt1.label, wn.statements); var lb2 = new labeled_statement(gt2.label, new empty_statement()); var stl = new statement_list(lb3, gt2, lb1, gt3, lb2); Replace(wn, stl); // в declarations ближайшего блока добавить описание labels block bl = listNodes.FindLast(x => x is block) as block; var ld = new label_definitions(gt1.label, gt2.label, gt3.label); bl.defs.Add(ld); }
public override void visit(while_node wn) { ProcessNode(wn.statements); var b = HasStatementVisitor <yield_node> .Has(wn); if (!b) { return; } var gt1 = goto_statement.New; var gt2 = goto_statement.New; var if0 = new if_node(un_expr.Not(wn.expr), gt1); var lb2 = new labeled_statement(gt2.label, if0); var lb1 = new labeled_statement(gt1.label); ReplaceStatement(wn, SeqStatements(lb2, wn.statements, gt2, lb1)); // в declarations ближайшего блока добавить описание labels block bl = listNodes.FindLast(x => x is block) as block; bl.defs.Add(new label_definitions(gt1.label, gt2.label)); }
public override void visit(while_node _while_node) { text = "Cycle type: " + _while_node.CycleType.ToString(); }
public virtual void visit(while_node _while_node) { DefaultVisit(_while_node); }
public virtual void post_do_visit(while_node _while_node) { }
public override void visit(while_node _while_node) { DefaultVisit(_while_node); pre_do_visit(_while_node); visit(while_node.expr); visit(while_node.statements); post_do_visit(_while_node); }
public virtual void visit(while_node _while_node) { }
// frninja 21/05/16 public override void visit(foreach_stmt frch) { // Полный код Loweringа c yield_unknown_foreach_type = integer // var a: System.Collections.Generic.IEnumerable<integer>; // a := l; // var en := a.GetEnumerator(); // while en.MoveNext do // begin // var curr := en.Current; // var не нужно ставить если curr была описана раньше // Print(curr); // end; /// // var a: System.Collections.Generic.IEnumerable<yield_unknown_foreach_type> := l; var foreachCollIdent = this.NewForeachCollectionName(); var foreachCollType = new template_type_reference(new named_type_reference("System.Collections.Generic.IEnumerable"), new template_param_list(new yield_unknown_foreach_type(frch))); var foreachCollVarDef = new var_statement(foreachCollIdent, foreachCollType); var ass = new assign(foreachCollIdent, frch.in_what); // var en := a.GetEnumerator(); var enumeratorIdent = this.NewEnumeratorName(); var enumeratorVarDef = new var_statement(enumeratorIdent, new method_call(new dot_node(foreachCollIdent, new ident("GetEnumerator")), new expression_list())); //var curr := en.Current; // Переменная цикла foreach. Есть три варианта: // 1. foreach x in l do -> curr := en.Current; // 2. foreach var x in l do -> var curr := en.Current; // 3. foreach var x: T in l do -> var curr: T := en.Current; var currentIdent = frch.identifier; statement st = null; var curExpr = new dot_node(enumeratorIdent, "Current"); // С типом if (frch.type_name == null) // 1. foreach x in l do -> curr := en.Current; { st = new assign(currentIdent, curExpr); } else if (frch.type_name is no_type_foreach) // 2. foreach var x in l do -> var curr := en.Current; { // Получаем служебное имя с $ и заменяем его в теле цикла currentIdent = this.NewVarNames(frch.identifier).VarName; var replacerVis = new ReplaceVariableNameVisitor(frch.identifier, currentIdent); frch.visit(replacerVis); st = new var_statement(currentIdent, curExpr); } else // 3. foreach var x: T in l do -> var curr: T := en.Current; { // Получаем служебное имя с $ и заменяем его в теле цикла currentIdent = this.NewVarNames(frch.identifier).VarName; var replacerVis = new ReplaceVariableNameVisitor(frch.identifier, currentIdent); frch.visit(replacerVis); st = new var_statement(currentIdent, frch.type_name, curExpr); } // Добавляем тело цикла в stl var stl = new statement_list(st); ProcessNode(frch.stmt); // для обработки вложенных конструкций stl.Add(frch.stmt); var whileNode = new while_node(new method_call(new dot_node(enumeratorIdent, "MoveNext"), new expression_list()), stl, WhileCycleType.While); var sq = SeqStatements(foreachCollVarDef, ass, enumeratorVarDef, whileNode); ReplaceStatement(frch, sq); visit(whileNode); // Lowering оставшегося whileNode }
public virtual void visit(while_node _while_node) { }
public virtual void visit(while_node _while_node) { DefaultVisit(_while_node); }
public override void visit(while_node _while_node) { prepare_node(_while_node.expr, "condition"); prepare_node(_while_node.statements, "body"); }
public override void visit(while_node _while_node) { AddPossibleComments(_while_node, true, false); _while_node.expr.visit(this); _while_node.statements.visit(this); }
public override void visit(while_node _while_node) { executer.visit(_while_node); if (_while_node.expr != null) this.visit((dynamic)_while_node.expr); if (_while_node.statements != null) this.visit((dynamic)_while_node.statements); if (_while_node.attributes != null) this.visit((dynamic)_while_node.attributes); }