Beispiel #1
0
        /// <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);
     }
 }
Beispiel #3
0
 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());
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
 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));
   }
 }
Beispiel #9
0
    /// <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;
    }