Exemple #1
0
        public static void Run(string input, TextWriter tw, string bek_js_master_file)
        {
            //input = input.Replace("\t", "  ");
            input = input.Replace("\r\n", "\n");
            string input1a = (input.StartsWith("==") ? "\n" + input : input);
            string input1 = (input1a.EndsWith("\n") ? input1a : input1a + "\n");

            string[] piece = input1.Split(new string[1] { "\n==\n" }, StringSplitOptions.None);

            if (piece.Length != 2)
            {
                tw.WriteLine(@"bek.bek(1,1): error : Expecting bek programs followed by \n==\n followed by bek queries");
                return;
            }
            //remove whitespace from the start
            //piece[1] = piece[1].TrimStart('\n', '\t', '\f', '\r', '\v', ' ');

            int lines = CountLines(piece[0]);

            List<BekProgram> progs;
            if (lines == 0)
            {
                progs = new List<BekProgram>();
            }
            else
            {
                try
                {
                    progs = BekParser.DefsFromString(piece[0]);
                }
                catch (BekParseException e)
                {
                    tw.WriteLine("pgm.bek({0},{1}): error : BekParseError, {2}", min1(e.line), min1(e.pos), e.Message);
                    return;
                }
                catch (BekException e)
                {
                    tw.WriteLine("pgm.bek({0},{1}): error : BekError, {2}", 1, 1, e.Message);
                    return;
                }
                catch (Exception e)
                {
                    tw.WriteLine("pgm.bek({0},{1}): error : InternalError, {2}", 1, 1, e.Message);
                    return;
                }
            }
            List<Expression> queries;
            List<string> queries_text;
            try
            {
                queries = Expression.ParseQueries(piece[1], out queries_text);
            }
            catch (QueryParseException e)
            {
                tw.WriteLine("query.bek({0},{1}): error : QueryParseError, {2}", e.line + lines + 2, e.pos, e.Message);
                return;
            }
            catch (Exception e)
            {
                tw.WriteLine("query.bek({0},{1}): error : QueryError, {2}", 1, 1, e.Message);
                return;
            }

            var ec = new EvaluationContext(progs, tw, bek_js_master_file);
            try
            {
                for (int i = 0; i < queries.Count; i++)
                {
                    if (i > 0)
                        tw.WriteLine();
                    tw.WriteLine(">> {0}", queries_text[i]);
                    queries[i].RunQuery(ec);
                }
               // ec.Dispose();
            }
            catch (BekParseException e) //bek pgms may be parsed as a result of exploration
            {
                tw.WriteLine("pgm.bek({0},{1}): error : ParseError, {2}", min1(e.line), min1(e.pos), e.Message);
               // ec.Dispose();
                return;
            }
            catch (BekException e)
            {
                tw.WriteLine("pgm.bek({0},{1}): error : BekError, {2}", 1, 1, e.Message);
               // ec.Dispose();
                return;
            }
            catch (QueryParseException e)
            {
                tw.WriteLine("pgm.bek({0},{1}): error : QueryParseError, {2}", e.line + lines + 2, e.pos, e.Message);
               // ec.Dispose();
                return;
            }
            catch (Exception e)
            {
                tw.WriteLine("pgm.bek({0},{1}): error : InternalError, {2}", 1, 1, e.Message);
               // ec.Dispose();
                return;
            }
            finally
            {
                //causes in some cases unhandled exception from Z3 for some reason
                //ec.Dispose();
            }
        }