/// <summary> /// /// </summary> /// <param name="line"></param> /// <param name="ns"></param> /// <param name="datatype"></param> /// <param name="fL"></param>a function list which contains a function to generate stetment list with given line number /// <returns></returns> private MatchStmt GenerateMatchStmt(int line, NameSegment ns, DatatypeDecl datatype, List <Func <int, List <Statement> > > fL) { Contract.Requires(ns != null); Contract.Requires(datatype != null); Contract.Ensures(Contract.Result <MatchStmt>() != null); List <MatchCaseStmt> cases = new List <MatchCaseStmt>(); int index = TacnyDriver.TacticCodeTokLine;//line + 1; for (int j = 0; j < datatype.Ctors.Count; j++) { var dc = datatype.Ctors[j]; Func <int, List <Statement> > f = _ => new List <Statement>(); if (j < fL.Count) { f = fL[j]; } MatchCaseStmt mcs = GenerateMatchCaseStmt(index, dc, f); cases.Add(mcs); line += mcs.Body.Count + 1; } return(new MatchStmt(new Token(index, 0) { val = "match" }, new Token(index, 0) { val = "=>" }, ns, cases, false)); }
public virtual void Visit(MatchCaseStmt matchCaseStatement) { foreach (var argument in matchCaseStatement.Arguments) { Visit(argument); } foreach (var body in matchCaseStatement.Body) { Visit(body); } }
private void InterpretCaseStmt(MatchCaseStmt stmt, Stack <Dictionary <IVariable, Type> > frame) { frame.Push(new Dictionary <IVariable, Type>()); foreach (var var in stmt.Ctor.Formals) { try { frame.Peek().Add(var, var.Type); } catch (Exception e) { Console.Out.WriteLine(e.Message); } } InterpertBlockStmt(stmt.Body, frame); frame.Pop(); }
public string GenerateString(MatchStmt statement, int tabs) { var bob = new StringBuilder(); ApplyIndentation(bob, tabs); bob.AppendLine(statement.Tok.val + " " + GenerateString(statement.Source) + " {"); foreach (MatchCase matchCase in statement.Cases) { ApplyIndentation(bob, tabs + 1); bob.Append("case " + matchCase.Ctor.Name); if (matchCase.Arguments.Any()) { bob.Append("("); foreach (BoundVar arg in matchCase.Arguments) { bob.Append(arg.Name + ", "); } bob.Remove(bob.Length - 2, 2); bob.Append(")"); } bob.Append(" =>"); if (matchCase is MatchCaseStmt) { bob.AppendLine(); MatchCaseStmt mcs = matchCase as MatchCaseStmt; foreach (Statement sub in mcs.Body) { bob.AppendLine(GenerateString(sub, tabs + 2)); } } else if (matchCase is MatchCaseExpr) { MatchCaseExpr mcs = matchCase as MatchCaseExpr; bob.Append(GenerateString(mcs.Body)); } } ApplyIndentation(bob, tabs); bob.Append("}"); return(bob.ToString()); }
/// <summary> /// /// </summary> /// <param name="line"></param> /// <param name="dtc"></param> /// <param name="f"></param> /// <returns></returns> private MatchCaseStmt GenerateMatchCaseStmt(int line, DatatypeCtor dtc, Func <int, List <Statement> > f) { Contract.Requires(dtc != null); List <CasePattern> casePatterns = new List <CasePattern>(); dtc = new DatatypeCtor(dtc.tok, dtc.Name, dtc.Formals, dtc.Attributes); foreach (var formal in dtc.Formals) { var cp = GenerateCasePattern(line, formal); casePatterns.Add(cp); } //List<Statement> body = new List<Statement>(); //body.Add(GenerateAssumeFalseStmt(line)); var mcs = new MatchCaseStmt(new Token(line, 0) { val = "cases" }, dtc.CompileName, casePatterns, f(line)); return(mcs); }
private void GenerateMatchCaseStmt(int line, DatatypeCtor dtc, Solution solution, out MatchCaseStmt mcs) { Contract.Requires(dtc != null); Contract.Ensures(Contract.ValueAtReturn(out mcs) != null); List <CasePattern> casePatterns = new List <CasePattern>(); dtc = new DatatypeCtor(dtc.tok, dtc.Name, dtc.Formals, dtc.Attributes); foreach (var formal in dtc.Formals) { CasePattern cp; GenerateCasePattern(line, formal, out cp); casePatterns.Add(cp); } List <Statement> body = new List <Statement>(); if (solution != null) { Atomic ac = solution.State.Copy(); body = ac.GetAllUpdated(); } mcs = new MatchCaseStmt(CreateToken("cases", line, 0), dtc.CompileName, casePatterns, body); }
void CaseStatement(out MatchCaseStmt/*!*/ c) { Contract.Ensures(Contract.ValueAtReturn(out c) != null); IToken/*!*/ x, id; List<CasePattern/*!*/> arguments = new List<CasePattern/*!*/>(); CasePattern/*!*/ pat; List<Statement/*!*/> body = new List<Statement/*!*/>(); string/*!*/ name = ""; Expect(33); x = t; if (la.kind == 1) { Ident(out id); name = id.val; if (la.kind == 50) { Get(); CasePattern(out pat); arguments.Add(pat); while (la.kind == 22) { Get(); CasePattern(out pat); arguments.Add(pat); } Expect(51); } } else if (la.kind == 50) { Get(); CasePattern(out pat); arguments.Add(pat); while (la.kind == 22) { Get(); CasePattern(out pat); arguments.Add(pat); } Expect(51); } else SynErr(205); Expect(29); while (!(StartOf(28))) {SynErr(206); Get();} while (IsNotEndOfCase()) { Stmt(body); while (!(StartOf(28))) {SynErr(207); Get();} } c = new MatchCaseStmt(x, name, arguments, body); }
public MatchCaseStmt CloneMatchCaseStmt(MatchCaseStmt c) { Contract.Requires(c != null); if (c.Arguments != null) { Contract.Assert(c.CasePatterns == null); return new MatchCaseStmt(Tok(c.tok), c.Id, c.Arguments.ConvertAll(CloneBoundVar), c.Body.ConvertAll(CloneStmt)); } else { Contract.Assert(c.Arguments == null); Contract.Assert(c.CasePatterns != null); return new MatchCaseStmt(Tok(c.tok), c.Id, c.CasePatterns.ConvertAll(CloneCasePattern), c.Body.ConvertAll(CloneStmt)); } }
/// <summary> /// /// </summary> /// <param name="line"></param> /// <param name="dtc"></param> /// <param name="f"></param> /// <returns></returns> private MatchCaseStmt GenerateMatchCaseStmt(int line, DatatypeCtor dtc, Func<int,List<Statement>> f) { Contract.Requires(dtc != null); List<CasePattern> casePatterns = new List<CasePattern>(); MatchCaseStmt mcs; dtc = new DatatypeCtor(dtc.tok, dtc.Name, dtc.Formals, dtc.Attributes); foreach(var formal in dtc.Formals) { CasePattern cp; cp = GenerateCasePattern(line, formal); casePatterns.Add(cp); } //List<Statement> body = new List<Statement>(); //body.Add(GenerateAssumeFalseStmt(line)); mcs = new MatchCaseStmt(new Token(line, 0) { val = "cases" }, dtc.CompileName, casePatterns, f(line)); return mcs; }