public string GenerateString(VarDeclStmt statement, int tabs) { if (decStatementsToPrintAsUpdates.Contains(statement)) { return(GenerateString(statement.Update as UpdateStmt, tabs)); } var bob = new StringBuilder(); ApplyIndentation(bob, tabs); bob.Append("var "); if (statement.Update != null) { bob.Append(GenerateString(statement.Update, 0)); } else { foreach (Microsoft.Dafny.LocalVariable locVar in statement.Locals) { bob.Append(locVar.Name + ": " + locVar.Type.ToString() + ", "); } bob.Remove(bob.Length - 2, 2); bob.Append(statement.EndTok.val); } return(bob.ToString()); }
public virtual void Visit(VarDeclStmt variableDeclarationStatement) { foreach (var localVariable in variableDeclarationStatement.Locals) { Visit(localVariable); } if (variableDeclarationStatement.Update != null) { Visit(variableDeclarationStatement.Update); } }
public object VisitVarDeclStmt(VarDeclStmt stmt) { Declare(stmt.Name); if (stmt.Initializer != null) { Resolve(stmt.Initializer); } Define(stmt.Name); return(null); }
public object VisitVarDeclStmt(VarDeclStmt stmt) { object value = null; if (stmt.Initializer != null) { value = Evaluate(stmt.Initializer); } _scope.Define(stmt.Name.Lexeme, value); return(null); }
private string ScanMemberBody(MemberDecl md) { Contract.Requires(md != null); solution_list.plist.Clear(); Method m = md as Method; if (m == null) { return(null); } if (m.Body == null) { return(null); } List <IVariable> variables = new List <IVariable>(); variables.AddRange(m.Ins); variables.AddRange(m.Outs); SolutionList sol_list = new SolutionList(); sol_list.AddRange(solution_list.plist); if (TacnyOptions.O.ParallelExecution) { Parallel.ForEach(m.Body.Body, st => { // register local variables VarDeclStmt vds = st as VarDeclStmt; if (vds != null) { variables.AddRange(vds.Locals); } UpdateStmt us = st as UpdateStmt; if (us != null) { if (tacnyProgram.IsTacticCall(us)) { try { tacnyProgram.SetCurrent(tacnyProgram.GetTactic(us), md); // get the resolved variables List <IVariable> resolved = tacnyProgram.GetResolvedVariables(md); resolved.AddRange(m.Ins); // add input arguments as resolved variables Atomic.ResolveTactic(tacnyProgram.GetTactic(us), us, md, tacnyProgram, variables, resolved, ref sol_list); tacnyProgram.CurrentDebug.Fin(); } catch (AggregateException e) { foreach (var err in e.Data) { Printer.Error(err.ToString()); } } } } }); } else { foreach (var st in m.Body.Body) { // register local variables VarDeclStmt vds = st as VarDeclStmt; if (vds != null) { variables.AddRange(vds.Locals); } UpdateStmt us = st as UpdateStmt; if (us != null) { if (tacnyProgram.IsTacticCall(us)) { try { tacnyProgram.SetCurrent(tacnyProgram.GetTactic(us), md); // get the resolved variables List <IVariable> resolved = tacnyProgram.GetResolvedVariables(md); resolved.AddRange(m.Ins); // add input arguments as resolved variables Atomic.ResolveTactic(tacnyProgram.GetTactic(us), us, md, tacnyProgram, variables, resolved, ref sol_list); tacnyProgram.CurrentDebug.Fin(); } catch (Exception e) { return(e.Message); } } } } } solution_list.AddRange(sol_list.plist); return(null); }
void VarDeclStatement(out Statement/*!*/ s) { IToken x = null, assignTok = null; bool isGhost = false; LocalVariable d; AssignmentRhs r; List<LocalVariable> lhss = new List<LocalVariable>(); List<AssignmentRhs> rhss = new List<AssignmentRhs>(); IToken suchThatAssume = null; Expression suchThat = null; Attributes attrs = null; IToken endTok; if (la.kind == 73) { Get(); isGhost = true; x = t; } Expect(78); if (!isGhost) { x = t; } while (la.kind == 46) { Attribute(ref attrs); } LocalIdentTypeOptional(out d, isGhost); lhss.Add(d); d.Attributes = attrs; attrs = null; while (la.kind == 22) { Get(); while (la.kind == 46) { Attribute(ref attrs); } LocalIdentTypeOptional(out d, isGhost); lhss.Add(d); d.Attributes = attrs; attrs = null; } if (la.kind == 25 || la.kind == 46 || la.kind == 95) { if (la.kind == 95) { Get(); assignTok = t; Rhs(out r); rhss.Add(r); while (la.kind == 22) { Get(); Rhs(out r); rhss.Add(r); } } else { while (la.kind == 46) { Attribute(ref attrs); } Expect(25); assignTok = t; if (la.kind == _assume) { Expect(31); suchThatAssume = t; } Expression(out suchThat, false, true); } } while (!(la.kind == 0 || la.kind == 28)) {SynErr(184); Get();} Expect(28); endTok = t; ConcreteUpdateStatement update; if (suchThat != null) { var ies = new List<Expression>(); foreach (var lhs in lhss) { ies.Add(new IdentifierExpr(lhs.Tok, lhs.Name)); } update = new AssignSuchThatStmt(assignTok, endTok, ies, suchThat, suchThatAssume, attrs); } else if (rhss.Count == 0) { update = null; } else { var ies = new List<Expression>(); foreach (var lhs in lhss) { ies.Add(new AutoGhostIdentifierExpr(lhs.Tok, lhs.Name)); } update = new UpdateStmt(assignTok, endTok, ies, rhss); } s = new VarDeclStmt(x, endTok, lhss, update); }
public virtual Statement CloneStmt(Statement stmt) { if (stmt == null) { return null; } Statement r; if (stmt is AssertStmt) { var s = (AssertStmt)stmt; r = new AssertStmt(Tok(s.Tok), Tok(s.EndTok), CloneExpr(s.Expr), null); } else if (stmt is AssumeStmt) { var s = (AssumeStmt)stmt; r = new AssumeStmt(Tok(s.Tok), Tok(s.EndTok), CloneExpr(s.Expr), null); } else if (stmt is TacticInvariantStmt) { var s = (TacticInvariantStmt)stmt; r = new TacticInvariantStmt(Tok(s.Tok), Tok(s.EndTok), CloneExpr(s.Expr), null, s.IsObjectLevel); } else if (stmt is TacticAssertStmt) { var s = (TacticAssertStmt)stmt; r = new TacticAssertStmt(Tok(s.Tok), Tok(s.EndTok), CloneExpr(s.Expr), null, s.IsObjectLevel); } else if (stmt is PrintStmt) { var s = (PrintStmt)stmt; r = new PrintStmt(Tok(s.Tok), Tok(s.EndTok), s.Args.ConvertAll(CloneExpr)); } else if (stmt is BreakStmt) { var s = (BreakStmt)stmt; if (s.TargetLabel != null) { r = new BreakStmt(Tok(s.Tok), Tok(s.EndTok), s.TargetLabel); } else { r = new BreakStmt(Tok(s.Tok), Tok(s.EndTok), s.BreakCount); } } else if (stmt is ReturnStmt) { var s = (ReturnStmt)stmt; r = new ReturnStmt(Tok(s.Tok), Tok(s.EndTok), s.rhss == null ? null : s.rhss.ConvertAll(CloneRHS)); } else if (stmt is YieldStmt) { var s = (YieldStmt)stmt; r = new YieldStmt(Tok(s.Tok), Tok(s.EndTok), s.rhss == null ? null : s.rhss.ConvertAll(CloneRHS)); } else if (stmt is AssignStmt) { var s = (AssignStmt)stmt; r = new AssignStmt(Tok(s.Tok), Tok(s.EndTok), CloneExpr(s.Lhs), CloneRHS(s.Rhs)); } else if (stmt is BlockStmt) { r = CloneBlockStmt((BlockStmt)stmt); } else if (stmt is IfStmt) { var s = (IfStmt)stmt; r = new IfStmt(Tok(s.Tok), Tok(s.EndTok), s.IsExistentialGuard, CloneExpr(s.Guard), CloneBlockStmt(s.Thn), CloneStmt(s.Els)); } else if (stmt is AlternativeStmt) { var s = (AlternativeStmt)stmt; r = new AlternativeStmt(Tok(s.Tok), Tok(s.EndTok), s.Alternatives.ConvertAll(CloneGuardedAlternative)); } else if (stmt is WhileStmt) { var s = (WhileStmt)stmt; r = new WhileStmt(Tok(s.Tok), Tok(s.EndTok), CloneExpr(s.Guard), s.Invariants.ConvertAll(CloneMayBeFreeExpr), CloneSpecExpr(s.Decreases), CloneSpecFrameExpr(s.Mod), CloneBlockStmt(s.Body)); ((WhileStmt)r).TacAps = s.TacAps; } else if (stmt is AlternativeLoopStmt) { var s = (AlternativeLoopStmt)stmt; r = new AlternativeLoopStmt(Tok(s.Tok), Tok(s.EndTok), s.Invariants.ConvertAll(CloneMayBeFreeExpr), CloneSpecExpr(s.Decreases), CloneSpecFrameExpr(s.Mod), s.Alternatives.ConvertAll(CloneGuardedAlternative)); } else if (stmt is ForallStmt) { var s = (ForallStmt)stmt; r = new ForallStmt(Tok(s.Tok), Tok(s.EndTok), s.BoundVars.ConvertAll(CloneBoundVar), null, CloneExpr(s.Range), s.Ens.ConvertAll(CloneMayBeFreeExpr), CloneStmt(s.Body)); if (s.ForallExpressions != null) { ((ForallStmt)r).ForallExpressions = s.ForallExpressions.ConvertAll(CloneExpr); } } else if (stmt is CalcStmt) { var s = (CalcStmt)stmt; // calc statements have the unusual property that the last line is duplicated. If that is the case (which // we expect it to be here), we share the clone of that line as well. var lineCount = s.Lines.Count; var lines = new List<Expression>(lineCount); for (int i = 0; i < lineCount; i++) { lines.Add(i == lineCount - 1 && 2 <= lineCount && s.Lines[i] == s.Lines[i - 1] ? lines[i - 1] : CloneExpr(s.Lines[i])); } Contract.Assert(lines.Count == lineCount); r = new CalcStmt(Tok(s.Tok), Tok(s.EndTok), CloneCalcOp(s.Op), lines, s.Hints.ConvertAll(CloneBlockStmt), s.StepOps.ConvertAll(CloneCalcOp), CloneCalcOp(s.ResultOp), CloneAttributes(s.Attributes)); } else if (stmt is MatchStmt) { var s = (MatchStmt)stmt; r = new MatchStmt(Tok(s.Tok), Tok(s.EndTok), CloneExpr(s.Source), s.Cases.ConvertAll(CloneMatchCaseStmt), s.UsesOptionalBraces); } else if (stmt is AssignSuchThatStmt) { var s = (AssignSuchThatStmt)stmt; r = new AssignSuchThatStmt(Tok(s.Tok), Tok(s.EndTok), s.Lhss.ConvertAll(CloneExpr), CloneExpr(s.Expr), s.AssumeToken == null ? null : Tok(s.AssumeToken), null); } else if (stmt is UpdateStmt) { var s = (UpdateStmt)stmt; r = new UpdateStmt(Tok(s.Tok), Tok(s.EndTok), s.Lhss.ConvertAll(CloneExpr), s.Rhss.ConvertAll(CloneRHS), s.CanMutateKnownState); } else if (stmt is VarDeclStmt) { var s = (VarDeclStmt)stmt; var lhss = s.Locals.ConvertAll(c => new LocalVariable(Tok(c.Tok), Tok(c.EndTok), c.Name, CloneType(c.OptionalType), c.IsGhost)); r = new VarDeclStmt(Tok(s.Tok), Tok(s.EndTok), lhss, (ConcreteUpdateStatement)CloneStmt(s.Update)); } else if (stmt is LetStmt) { var s = (LetStmt)stmt; r = new LetStmt(Tok(s.Tok), Tok(s.EndTok), s.LHSs.ConvertAll(CloneCasePattern), s.RHSs.ConvertAll(CloneExpr)); } else if (stmt is ModifyStmt) { var s = (ModifyStmt)stmt; var mod = CloneSpecFrameExpr(s.Mod); var body = s.Body == null ? null : CloneBlockStmt(s.Body); r = new ModifyStmt(Tok(s.Tok), Tok(s.EndTok), mod.Expressions, mod.Attributes, body); } else if (stmt is TacnyCasesBlockStmt) { var s = (TacnyCasesBlockStmt)stmt; var guard = CloneExpr(s.Guard); var body = s.Body == null ? null : CloneBlockStmt(s.Body); r = new TacnyCasesBlockStmt(Tok(s.Tok), Tok(s.EndTok), guard, body); } else if (stmt is TacnyChangedBlockStmt) { var s = (TacnyChangedBlockStmt)stmt; var body = s.Body == null ? null : CloneBlockStmt(s.Body); r = new TacnyChangedBlockStmt(Tok(s.Tok), Tok(s.EndTok), body); } else if (stmt is TacnySolvedBlockStmt) { var s = (TacnySolvedBlockStmt)stmt; var body = s.Body == null ? null : CloneBlockStmt(s.Body); r = new TacnySolvedBlockStmt(Tok(s.Tok), Tok(s.EndTok), body); } else if (stmt is TacnyTryCatchBlockStmt) { var s = (TacnyTryCatchBlockStmt)stmt; var body = s.Body == null ? null : CloneBlockStmt(s.Body); var c = s.Ctch == null ? null : CloneBlockStmt(s.Ctch); r = new TacnyTryCatchBlockStmt(Tok(s.Tok), Tok(s.EndTok), body, c); } else if (stmt is TacticVarDeclStmt) { var s = (TacticVarDeclStmt)stmt; var lhss = s.Locals.ConvertAll(c => new LocalVariable(Tok(c.Tok), Tok(c.EndTok), c.Name, CloneType(c.OptionalType), c.IsGhost)); r = new TacticVarDeclStmt(Tok(s.Tok), Tok(s.EndTok), lhss, (ConcreteUpdateStatement)CloneStmt(s.Update)); } else { Contract.Assert(false); throw new cce.UnreachableException(); // unexpected statement } // add labels to the cloned statement AddStmtLabels(r, stmt.Labels); r.Attributes = CloneAttributes(stmt.Attributes); return r; }
void VarDeclStatement(out Statement/*!*/ s) { IToken x = null, assignTok = null; bool isGhost = false; LocalVariable d; AssignmentRhs r; List<LocalVariable> lhss = new List<LocalVariable>(); List<AssignmentRhs> rhss = new List<AssignmentRhs>(); IToken suchThatAssume = null; Expression suchThat = null; Attributes attrs = null; IToken endTok; s = dummyStmt; if (la.kind == 65) { Get(); isGhost = true; x = t; } Expect(61); if (!isGhost) { x = t; } if (la.kind == 1 || la.kind == 46) { while (la.kind == 46) { Attribute(ref attrs); } LocalIdentTypeOptional(out d, isGhost); lhss.Add(d); d.Attributes = attrs; attrs = null; while (la.kind == 22) { Get(); while (la.kind == 46) { Attribute(ref attrs); } LocalIdentTypeOptional(out d, isGhost); lhss.Add(d); d.Attributes = attrs; attrs = null; } if (la.kind == 25 || la.kind == 46 || la.kind == 104) { if (la.kind == 104) { Get(); assignTok = t; Rhs(out r); rhss.Add(r); while (la.kind == 22) { Get(); Rhs(out r); rhss.Add(r); } } else { while (la.kind == 46) { Attribute(ref attrs); } Expect(25); assignTok = t; if (la.kind == _assume) { Expect(31); suchThatAssume = t; } Expression(out suchThat, false, true); } } while (!(la.kind == 0 || la.kind == 28)) {SynErr(198); Get();} Expect(28); endTok = t; ConcreteUpdateStatement update; if (suchThat != null) { var ies = new List<Expression>(); foreach (var lhs in lhss) { ies.Add(new IdentifierExpr(lhs.Tok, lhs.Name)); } update = new AssignSuchThatStmt(assignTok, endTok, ies, suchThat, suchThatAssume, attrs); } else if (rhss.Count == 0) { update = null; } else { var ies = new List<Expression>(); foreach (var lhs in lhss) { ies.Add(new AutoGhostIdentifierExpr(lhs.Tok, lhs.Name)); } update = new UpdateStmt(assignTok, endTok, ies, rhss); } s = new VarDeclStmt(x, endTok, lhss, update); } else if (la.kind == 50) { Get(); var letLHSs = new List<CasePattern>(); var letRHSs = new List<Expression>(); List<CasePattern> arguments = new List<CasePattern>(); CasePattern pat; Expression e = dummyExpr; IToken id = t; if (la.kind == 1 || la.kind == 50) { CasePattern(out pat); arguments.Add(pat); while (la.kind == 22) { Get(); CasePattern(out pat); arguments.Add(pat); } } Expect(51); theBuiltIns.TupleType(id, arguments.Count, true); // make sure the tuple type exists string ctor = BuiltIns.TupleTypeCtorName; //use the TupleTypeCtors pat = new CasePattern(id, ctor, arguments); if (isGhost) { pat.Vars.Iter(bv => bv.IsGhost = true); } letLHSs.Add(pat); if (la.kind == 104) { Get(); } else if (la.kind == 25 || la.kind == 46) { while (la.kind == 46) { Attribute(ref attrs); } Expect(25); SemErr(pat.tok, "LHS of assign-such-that expression must be variables, not general patterns"); } else SynErr(199); Expression(out e, false, true); letRHSs.Add(e); Expect(28); s = new LetStmt(e.tok, e.tok, letLHSs, letRHSs); } else SynErr(200); }
private Solution LazyScanMemberBody(MemberDecl md) { Contract.Requires(md != null); Console.WriteLine($"Starting thread: {System.Threading.Thread.CurrentThread.Name}"); Debug.WriteLine($"Scanning member {md.Name} body"); var function = md as Function; if (function != null) { var fun = function; if (fun.Body == null) { return(null); } var expt = ExpressionTree.ExpressionToTree(fun.Body); expt.FindAndResolveTacticApplication(_tacnyProgram, fun); /* No reason ot generate new solution * if nothing has been changed */ if (!expt.Modified) { return(null); } var res = expt.TreeToExpression(); var newFun = new Function(fun.tok, fun.Name, fun.HasStaticKeyword, fun.IsProtected, fun.IsGhost, fun.TypeArgs, fun.Formals, fun.ResultType, fun.Req, fun.Reads, fun.Ens, fun.Decreases, res, fun.Attributes, fun.SignatureEllipsis); var ac = new Atomic { IsFunction = true, DynamicContext = { newTarget = newFun } }; return(new Solution(ac)); } var m = md as Method; if (m?.Body == null) { return(null); } List <IVariable> variables = new List <IVariable>(); List <IVariable> resolved; lock (_tacnyProgram) { resolved = _tacnyProgram.GetResolvedVariables(md); } variables.AddRange(m.Ins); variables.AddRange(m.Outs); resolved.AddRange(m.Ins); // add input arguments as resolved variables resolved.AddRange(m.Outs); // does not work for multiple tactic applications foreach (var st in m.Body.Body) { UpdateStmt us = null; WhileStmt ws = null; // register local variables if (st is VarDeclStmt) { VarDeclStmt vds = st as VarDeclStmt; variables.AddRange(vds.Locals); } else if (st is UpdateStmt) { us = st as UpdateStmt; } else if (st is WhileStmt) { ws = st as WhileStmt; us = ws.TacAps as UpdateStmt; foreach (var wst in ws.Body.Body) { if (!(wst is VarDeclStmt)) { continue; } var vds = wst as VarDeclStmt; variables.AddRange(vds.Locals); } } if (us == null || !_tacnyProgram.IsTacticCall(us)) { continue; } Debug.WriteLine("Tactic call found"); return(ResolveTactic(variables, resolved, us, md, ws)); } return(null); }