コード例 #1
0
ファイル: UnitTest1.cs プロジェクト: michkot/Automata
        public void HexProjTest2()
        {
            Z3Provider z3p       = new Z3Provider();
            Sort       bv64      = z3p.MkBitVecSort(64);
            Sort       bv16      = z3p.MkBitVecSort(16);
            Expr       _0x654321 = z3p.MkNumeral((uint)0xF54321, bv64);
            Expr       _6        = z3p.MkHexProj(5, _0x654321, bv16).Simplify();
            Expr       _5        = z3p.MkHexProj(4, _0x654321, bv16).Simplify();
            Expr       _4        = z3p.MkHexProj(3, _0x654321, bv16).Simplify();
            Expr       _3        = z3p.MkHexProj(2, _0x654321, bv16).Simplify();
            Expr       _2        = z3p.MkHexProj(1, _0x654321, bv16).Simplify();
            Expr       _1        = z3p.MkHexProj(0, _0x654321, bv16).Simplify();
            int        _6v       = (int)z3p.GetNumeralInt(_6);
            int        _5v       = (int)z3p.GetNumeralInt(_5);
            int        _4v       = (int)z3p.GetNumeralInt(_4);
            int        _3v       = (int)z3p.GetNumeralInt(_3);
            int        _2v       = (int)z3p.GetNumeralInt(_2);
            int        _1v       = (int)z3p.GetNumeralInt(_1);

            Assert.AreEqual <int>(0xF, _6v);
            Assert.AreEqual <int>(5, _5v);
            Assert.AreEqual <int>(4, _4v);
            Assert.AreEqual <int>(3, _3v);
            Assert.AreEqual <int>(2, _2v);
            Assert.AreEqual <int>(1, _1v);
        }
コード例 #2
0
ファイル: UnitTest1.cs プロジェクト: AutomataDotNet/Automata
 public void HexProjTest2()
 {
     Z3Provider z3p = new Z3Provider();
     Sort bv64 = z3p.MkBitVecSort(64);
     Sort bv16 = z3p.MkBitVecSort(16);
     Expr _0x654321 = z3p.MkNumeral((uint)0xF54321, bv64);
     Expr _6 = z3p.MkHexProj(5, _0x654321, bv16).Simplify();
     Expr _5 = z3p.MkHexProj(4, _0x654321, bv16).Simplify();
     Expr _4 = z3p.MkHexProj(3, _0x654321, bv16).Simplify();
     Expr _3 = z3p.MkHexProj(2, _0x654321, bv16).Simplify();
     Expr _2 = z3p.MkHexProj(1, _0x654321, bv16).Simplify();
     Expr _1 = z3p.MkHexProj(0, _0x654321, bv16).Simplify();
     int _6v = (int)z3p.GetNumeralInt(_6);
     int _5v = (int)z3p.GetNumeralInt(_5);
     int _4v = (int)z3p.GetNumeralInt(_4);
     int _3v = (int)z3p.GetNumeralInt(_3);
     int _2v = (int)z3p.GetNumeralInt(_2);
     int _1v = (int)z3p.GetNumeralInt(_1);
     Assert.AreEqual<int>(0xF, _6v);
     Assert.AreEqual<int>(5, _5v);
     Assert.AreEqual<int>(4, _4v);
     Assert.AreEqual<int>(3, _3v);
     Assert.AreEqual<int>(2, _2v);
     Assert.AreEqual<int>(1, _1v);
 }
コード例 #3
0
ファイル: STbTests.cs プロジェクト: wellsoftware/Automata
        public void TestSTbSimplify()
        {
            string utf8decode_bek = @"
function fuse(r,c) = ((r << 6) | (c & 0x3F));
function one(c) = ((0 <= c) && (c <= 0x7F));
function C2_DF(c) = ((0xC2 <= c) && (c <= 0xDF));
function E1_EF(c) = ((0xE1 <= c) && (c <= 0xEF));
function A0_BF(c) = ((0xA0 <= c) && (c <= 0xBF));
function x80_BF(c) = ((0x80 <= c) && (c <= 0xBF));
function x80_9F(c) = ((0x80 <= c) && (c <= 0x9F));
program utf8decode(input){
  return iter(c in input)[q := 0; r := 0;] 
  {
    case (q == 0):
      if (one(c))                  {yield (c);}
      else if (C2_DF(c))           {q := 2; r := (c & 0x1F);}    // ------ 2 bytes --------
      else if (c == 0xE0)          {q := 4; r := (c & 0x0F);}    // ------ 3 bytes --------
      else if (c == 0xED)          {q := 5; r := (c & 0x0F);}    // ------ 3 bytes --------
      else if (E1_EF(c))           {q := 3; r := (c & 0x0F);}    // ------ 3 bytes --------
      else {raise InvalidInput;}

    case (q == 2): 
      if (x80_BF(c))                 {q := 0; yield(fuse(r,c)); r := 0;}
      else {raise InvalidInput;}

    case (q == 3): 
      if (x80_BF(c))                 {q := 2; r := fuse(r,c);}
      else {raise InvalidInput;}

    case (q == 4): 
      if (A0_BF(c))                  {q := 2; r := fuse(r,c);}
      else {raise InvalidInput;}

    case (q == 5): 
      if (x80_9F(c))                 {q := 2; r := fuse(r,c);}
      else {raise InvalidInput;}

    end case (!(q == 0)):
      raise InvalidInput;
  }; 
}
";

            Z3Provider solver     = new Z3Provider(BitWidth.BV16);
            var        dec        = BekConverter.BekToSTb(solver, utf8decode_bek);
            var        utf8decode = dec.ExploreBools();

            Sort bv32    = solver.MkBitVecSort(32);
            Sort outSort = solver.MkTupleSort(solver.StringSort, bv32);
            var  initReg = solver.MkTuple(solver.GetNil(solver.StringSort), solver.MkNumeral(0, bv32));
            var  regVar  = solver.MkVar(1, outSort);
            var  reg1    = solver.MkProj(1, regVar);
            var  reg0    = solver.MkProj(0, regVar);
            STb <FuncDecl, Expr, Sort> parse = new STbModel(solver, "Parse", solver.CharacterSort, outSort, outSort, initReg, 0);

            var letter = solver.MkOr( //solver.MkAnd(solver.MkCharLe(solver.MkCharExpr('\xC0'), solver.CharVar),
                                      //                    solver.MkCharLe(solver.CharVar, solver.MkCharExpr('\xFF'))),
                solver.MkAnd(solver.MkCharLe(solver.MkCharExpr('a'), solver.CharVar),
                             solver.MkCharLe(solver.CharVar, solver.MkCharExpr('z'))),
                solver.MkAnd(solver.MkCharLe(solver.MkCharExpr('A'), solver.CharVar),
                             solver.MkCharLe(solver.CharVar, solver.MkCharExpr('Z'))));

            //var not_letter = solver.MkNot(letter);

            var digit = solver.MkAnd(solver.MkCharLe(solver.MkCharExpr('0'), solver.CharVar),
                                     solver.MkCharLe(solver.CharVar, solver.MkCharExpr('9')));

            var nl = solver.MkEq(solver.CharVar, solver.MkCharExpr('\n'));

            var space = solver.MkEq(solver.CharVar, solver.MkCharExpr(' '));

            //var not_nl = solver.MkNot(nl);

            var _0 = solver.MkNumeral((int)'0', bv32);

            //var z = solver.Z3.MkFreshConst("z", solver.CharacterSort);

            //var constr = solver.MkNot(solver.Z3.MkExists(new Expr[] { z }, nl.Substitute(solver.CharVar, z)));
            ////var constr = nl.Substitute(solver.CharVar, z);

            //solver.Z3S.Push();
            //solver.Z3S.Assert((BoolExpr)solver.MkNot(constr));
            //var status = solver.Check();
            //var m = solver.Z3S.Model;
            //var zval = m.Evaluate(z, true);
            //solver.Z3S.Pop();


            var loop_0   = new BaseRule <Expr>(Sequence <Expr> .Empty, regVar, 0);
            var brule0_1 = new BaseRule <Expr>(Sequence <Expr> .Empty, solver.MkTuple(solver.MkListCons(solver.CharVar, reg0), reg1), 1);
            var rule0    = new IteRule <Expr>(letter, brule0_1, new IteRule <Expr>(space, loop_0, UndefRule <Expr> .Default));

            parse.AssignRule(0, rule0);

            var brule1_2 = new BaseRule <Expr>(Sequence <Expr> .Empty, solver.MkTuple(solver.MkListCons(solver.CharVar, reg0), reg1), 2);
            var brule_4  = new BaseRule <Expr>(Sequence <Expr> .Empty, regVar, 4);
            var rule1    = new IteRule <Expr>(letter, brule1_2, new IteRule <Expr>(space, brule_4, UndefRule <Expr> .Default));

            parse.AssignRule(1, rule1);

            var brule2_3 = new BaseRule <Expr>(Sequence <Expr> .Empty, solver.MkTuple(solver.MkListCons(solver.CharVar, reg0), reg1), 4);
            var rule2    = new IteRule <Expr>(letter, brule2_3, new IteRule <Expr>(space, brule_4, UndefRule <Expr> .Default));

            parse.AssignRule(2, rule2);

            var bv32var = solver.Z3.MkZeroExt(16, (BitVecExpr)solver.CharVar);

            var brule4_5 = new BaseRule <Expr>(Sequence <Expr> .Empty, solver.MkTuple(reg0, solver.MkBvAdd(
                                                                                          solver.MkBvMul(solver.MkNumeral(10, bv32), reg1),
                                                                                          solver.MkBvSub(bv32var, _0))), 5);
            var rule4 = new IteRule <Expr>(digit, brule4_5, new IteRule <Expr>(space, brule_4, UndefRule <Expr> .Default));

            parse.AssignRule(4, rule4);

            var brule_0 = new BaseRule <Expr>(Sequence <Expr> .Empty.Append(regVar), initReg, 0);

            var brule_7 = new BaseRule <Expr>(Sequence <Expr> .Empty, regVar, 7);

            var brule5_6 = new BaseRule <Expr>(Sequence <Expr> .Empty, solver.MkTuple(reg0, solver.MkBvAdd(
                                                                                          solver.MkBvMul(solver.MkNumeral(10, bv32), reg1),
                                                                                          solver.MkBvSub(bv32var, _0))), 6);
            var rule5 = new IteRule <Expr>(digit, brule5_6, new IteRule <Expr>(nl, brule_0, new IteRule <Expr>(space, brule_7, UndefRule <Expr> .Default)));

            parse.AssignRule(5, rule5);

            var brule6_7 = new BaseRule <Expr>(Sequence <Expr> .Empty, solver.MkTuple(reg0, solver.MkBvAdd(
                                                                                          solver.MkBvMul(solver.MkNumeral(10, bv32), reg1),
                                                                                          solver.MkBvSub(bv32var, _0))), 7);
            var rule6 = new IteRule <Expr>(digit, brule6_7, new IteRule <Expr>(nl, brule_0, new IteRule <Expr>(space, brule_7, UndefRule <Expr> .Default)));

            parse.AssignRule(6, rule6);

            var rule7 = new IteRule <Expr>(nl, brule_0, new IteRule <Expr>(space, brule_7, UndefRule <Expr> .Default));

            parse.AssignRule(7, rule7);

            parse.AssignFinalRule(0, new BaseRule <Expr>(Sequence <Expr> .Empty, initReg, 0));

            var comp = utf8decode.Compose(parse);

            //utf8decode.ToST().ShowGraph();

            //parse.ToST().ShowGraph();

            //comp.ToST().ShowGraph();

            //var comp1 = new STbSimulator<FuncDecl,Expr,Sort>(comp);
            //comp1.Explore();
            //Console.WriteLine(comp1.exploredSteps);

            //var rules = Array.ConvertAll(comp1.UncoveredMoves.ToArray(), r => new Tuple<int, int>(r.Item3.SourceState, r.Item3.TargetState));

            var simpl = comp.Simplify();

            Assert.AreEqual <int>(35, comp.StateCount);
            Assert.AreEqual <int>(7, simpl.StateCount);

            //simpl.ShowGraph();
        }
コード例 #4
0
ファイル: UnitTest1.cs プロジェクト: michkot/Automata
        public void TestCssCombinedCodepoint()
        {
            var        kkkk   = 0x7FFF - 65532;
            Z3Provider solver = new Z3Provider();
            Sort       bv64   = solver.MkBitVecSort(64);
            Sort       bv16   = solver.CharacterSort;

            Expr hs = solver.MkConst("hs", bv16);
            Expr ls = solver.MkConst("ls", bv16);

            Expr res = solver.MkConst("res", bv64);

            Expr maxVal = solver.MkNumeral(0x10FFFF, bv64); //max 16 bit nr

            Expr x        = solver.ConvertBitVector(hs, bv64);
            Expr y        = solver.ConvertBitVector(ls, bv64);
            Expr _0x10000 = solver.MkNumeral(0x10000, bv64);
            Expr _0xD800  = solver.MkNumeral(0xD800, bv64);
            Expr _0x400   = solver.MkNumeral(0x400, bv64);
            Expr _0xDC00  = solver.MkNumeral(0xDC00, bv64);

            ushort tmpLS = ((ushort)0xdfff) - ((ushort)0xdc00);

            for (int i = 0xdc00; i <= 0xdfff; i++)
            {
                int j = (i - 0xdc00) >> 8;
                int k = (i >> 8) & 3;
                Assert.AreEqual <int>(j, k);
            }

            int tmpHS = (((int)0xdbff) - ((int)0xd800)) * ((int)0x400);
            //int tmpHS = (((int)0xdbff) - ((int)0xd800)) << 10;

            int tmpHSLS = tmpLS + tmpHS;

            int maxcodepoint = tmpHSLS + 0x10000;

            Expr cp = solver.MkCharAdd(_0x10000,
                                       solver.MkCharAdd(solver.MkCharMul(solver.MkCharSub(x, _0xD800), _0x400),
                                                        solver.MkCharSub(y, _0xDC00)));

            Expr ls_is_lowSurrogate =
                solver.MkAnd(solver.MkCharGe(ls, solver.MkNumeral(0xdc00, bv16)),
                             solver.MkCharLe(ls, solver.MkNumeral(0xdfff, bv16)));

            Expr hs_is_highSurrogate =
                solver.MkAnd(solver.MkCharGe(hs, solver.MkNumeral(0xd800, bv16)),
                             solver.MkCharLe(hs, solver.MkNumeral(0xdbff, bv16)));

            Expr assert = solver.Simplify(solver.MkAnd(
                                              ls_is_lowSurrogate,
                                              hs_is_highSurrogate,
                                              solver.MkEq(res, cp)));

            //string s = solver.PrettyPrint(assert);

            solver.MainSolver.Assert(assert);

            var model = solver.MainSolver.GetModel(solver.MkCharLt(maxVal, res), hs, ls, res);

            Assert.IsNull(model);

            //if (model != null)
            //{
            //    int hsVal = solver.GetNumeralInt(model[hs].Value);
            //    int lsVal = solver.GetNumeralInt(model[ls].Value);
            //    long resval = solver.GetNumeralUInt(model[res].Value);
            //    Assert.AreEqual<long>(CssCombinedCodepoint(hsVal, lsVal), resval);
            //}
        }
コード例 #5
0
        STb <FuncDecl, Expr, Sort> Generate()
        {
            var name = DeclarationType.ContainingNamespace.Name + "." +
                       (DeclarationType.ContainingType == null ? "" : DeclarationType.ContainingType.Name + ".") + DeclarationType.Name;

            Console.WriteLine("XPath " + name);

            var        parser = new XPathParser <IXPathNode>();
            IXPathNode root;

            try
            {
                root = parser.Parse(_xpath, new XPathNodeBuilder());
                Console.WriteLine(root);
            }
            catch (XPathParserException e)
            {
                throw new TransducerCompilationException("XPath parsing failed", e);
            }

            var resultSort       = _ctx.MkBitVecSort(32);
            var levelCounterSort = _ctx.MkBitVecSort(32);
            var regSort          = _ctx.MkTupleSort(resultSort, levelCounterSort);
            var initReg          = _ctx.MkTuple(_ctx.MkNumeral(0, resultSort), _ctx.MkNumeral(0, levelCounterSort));

            var        stb       = new STb <FuncDecl, Expr, Sort>(_ctx, "stb", _ctx.CharSort, _ctx.MkBitVecSort(32), regSort, initReg, 0);
            int        freeState = 1;
            Func <int> nextState = () => freeState++;

            var resultProj       = _ctx.MkProj(0, stb.RegVar);
            var levelCounterProj = _ctx.MkProj(1, stb.RegVar);

            Func <int, IgnorerInfo> CreateIgnorer = (exitState) =>
            {
                IgnorerInfo info = new IgnorerInfo();

                int outsideTagState    = nextState();
                int freshTagState      = nextState();
                int openingTagState    = nextState();
                int standaloneTagState = nextState();
                int closingTagState    = nextState();

                stb.AssignRule(outsideTagState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '<'),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, freshTagState),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, outsideTagState)));

                stb.AssignRule(freshTagState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, closingTagState),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, openingTagState)));

                var counterOne      = _ctx.MkNumeral(1, levelCounterSort);
                var levelCounterInc = _ctx.MkTuple(resultProj, _ctx.MkBvAdd(levelCounterProj, counterOne));
                stb.AssignRule(openingTagState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, levelCounterInc, outsideTagState),
                                                  new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, standaloneTagState),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, openingTagState))));

                var counterZero        = _ctx.MkNumeral(0, levelCounterSort);
                var levelCounterZeroed = _ctx.MkTuple(resultProj, counterZero);
                stb.AssignRule(standaloneTagState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                  new IteRule <Expr>(_ctx.MkEq(levelCounterProj, counterZero),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, levelCounterZeroed, exitState),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, outsideTagState)),
                                                  new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, standaloneTagState),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, openingTagState))));

                var levelCounterDec = _ctx.MkTuple(resultProj, _ctx.MkBvSub(levelCounterProj, counterOne));
                stb.AssignRule(closingTagState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                  new IteRule <Expr>(_ctx.MkEq(levelCounterProj, counterOne),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, levelCounterZeroed, exitState),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, levelCounterDec, outsideTagState)),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, closingTagState)));

                info.MoveToTagOpening             = new BaseRule <Expr>(Sequence <Expr> .Empty, levelCounterZeroed, openingTagState);
                info.MoveToTagOpeningOrStandalone = new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                                                       new BaseRule <Expr>(Sequence <Expr> .Empty, levelCounterZeroed, standaloneTagState),
                                                                       info.MoveToTagOpening);
                var levelCounterSet = _ctx.MkTuple(resultProj, counterOne);
                info.MoveToOutsideTag = new BaseRule <Expr>(Sequence <Expr> .Empty, levelCounterSet, outsideTagState);

                return(info);
            };

            var next        = root;
            int?parentState = null;
            int startState  = stb.InitialState;
            int childState  = nextState();
            var zeroResult  = _ctx.MkTuple(_ctx.MkNumeral(0, resultSort), levelCounterProj);

            while (next != null)
            {
                XPathAxisNode current;
                var           step = next as XPathStepNode;
                if (step != null)
                {
                    current = step.Left as XPathAxisNode;
                    next    = step.Right;
                }
                else
                {
                    current = next as XPathAxisNode;
                    next    = null;
                }

                if (current.Axis == XPathAxis.Root)
                {
                    continue;
                }

                if (current == null)
                {
                    throw new TransducerCompilationException("Unsupported XPath node type: " + next.GetType());
                }
                if (current.Axis != XPathAxis.Child)
                {
                    throw new TransducerCompilationException("Unsupported axis: " + current.Axis);
                }
                if (current.Type != System.Xml.XPath.XPathNodeType.Element)
                {
                    throw new TransducerCompilationException("Unsupported node type: " + current.Type);
                }

                int freshTagState             = nextState();
                int closingTagState           = nextState();
                int standaloneMatchState      = nextState();
                int matchedOpeningTagState    = nextState();
                int matchedStandaloneTagState = nextState();
                var ignorer = CreateIgnorer(startState);

                stb.AssignRule(startState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '<'),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, freshTagState),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, startState)));

                int  matchState     = freshTagState;
                int  nextMatchState = nextState();
                bool first          = true;
                foreach (char c in current.Label)
                {
                    STbRule <Expr> matchRule;

                    if (first)
                    {
                        matchRule = new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                                       new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, closingTagState),
                                                       new IteRule <Expr>(EqualsChar(stb.InputVar, c),
                                                                          new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, nextMatchState),
                                                                          new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                                                             ignorer.MoveToOutsideTag,
                                                                                             ignorer.MoveToTagOpening)));
                        first = false;
                    }
                    else
                    {
                        matchRule = new IteRule <Expr>(EqualsChar(stb.InputVar, c),
                                                       new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, nextMatchState),
                                                       new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                                          ignorer.MoveToOutsideTag,
                                                                          ignorer.MoveToTagOpeningOrStandalone));
                    }

                    stb.AssignRule(matchState, matchRule);
                    matchState     = nextMatchState;
                    nextMatchState = nextState();
                }

                stb.AssignRule(closingTagState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                  parentState != null ? (STbRule <Expr>) new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, parentState.Value) : new UndefRule <Expr>(),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, closingTagState)));

                stb.AssignRule(matchState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, zeroResult, childState),
                                                  new IteRule <Expr>(EqualsChar(stb.InputVar, ' '),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, matchedOpeningTagState),
                                                                     new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                                                                        new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, standaloneMatchState),
                                                                                        ignorer.MoveToTagOpening))));

                stb.AssignRule(standaloneMatchState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, startState),
                                                  new UndefRule <Expr>()));

                stb.AssignRule(matchedOpeningTagState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, zeroResult, childState),
                                                  new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, matchedStandaloneTagState),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, matchedOpeningTagState))));

                stb.AssignRule(matchedStandaloneTagState,
                               new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                                  new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, startState),
                                                  new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, matchedStandaloneTagState),
                                                                     new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, matchedOpeningTagState))));

                parentState = startState;
                startState  = childState;
                childState  = nextState();
            }

            Func <Expr, Expr> AddZeros = (c) =>
            {
                uint k = (uint)(32 - (int)_ctx.CharSetProvider.Encoding);
                if (k == 0)
                {
                    return(c);
                }
                else
                {
                    return(_ctx.MkZeroExt(k, c));
                }
            };
            var toIntUpdate = _ctx.MkTuple(
                _ctx.MkBvAdd(_ctx.MkBvMul(_ctx.MkNumeral(10, resultSort), resultProj), _ctx.MkBvSub(AddZeros(stb.InputVar), _ctx.MkNumeral((int)'0', resultSort))),
                levelCounterProj);

            var expectSlashState = nextState();
            var scanTagState     = nextState();

            stb.AssignRule(startState,
                           new IteRule <Expr>(EqualsChar(stb.InputVar, '<'),
                                              new BaseRule <Expr>(new Sequence <Expr>(resultProj), zeroResult, expectSlashState),
                                              new BaseRule <Expr>(Sequence <Expr> .Empty, toIntUpdate, startState)));

            stb.AssignRule(expectSlashState,
                           new IteRule <Expr>(EqualsChar(stb.InputVar, '/'),
                                              new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, scanTagState),
                                              new UndefRule <Expr>()));

            stb.AssignRule(scanTagState,
                           new IteRule <Expr>(EqualsChar(stb.InputVar, '>'),
                                              parentState != null ? (STbRule <Expr>) new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, parentState.Value) : new UndefRule <Expr>(),
                                              new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, scanTagState)));

            Console.WriteLine(stb.StateCount);

            foreach (var state in stb.States)
            {
                stb.AssignFinalRule(state, new BaseRule <Expr>(Sequence <Expr> .Empty, stb.RegVar, state));
            }

            if (ShowGraphStages.Count > 0)
            {
                stb.ToST().ShowGraph();
            }
            return(stb);
        }
コード例 #6
0
ファイル: STbTests.cs プロジェクト: AutomataDotNet/Automata
        public void TestSTbSimplify()
        {
            string utf8decode_bek = @"
            function fuse(r,c) = ((r << 6) | (c & 0x3F));
            function one(c) = ((0 <= c) && (c <= 0x7F));
            function C2_DF(c) = ((0xC2 <= c) && (c <= 0xDF));
            function E1_EF(c) = ((0xE1 <= c) && (c <= 0xEF));
            function A0_BF(c) = ((0xA0 <= c) && (c <= 0xBF));
            function x80_BF(c) = ((0x80 <= c) && (c <= 0xBF));
            function x80_9F(c) = ((0x80 <= c) && (c <= 0x9F));
            program utf8decode(input){
              return iter(c in input)[q := 0; r := 0;]
              {
            case (q == 0):
              if (one(c))                  {yield (c);}
              else if (C2_DF(c))           {q := 2; r := (c & 0x1F);}    // ------ 2 bytes --------
              else if (c == 0xE0)          {q := 4; r := (c & 0x0F);}    // ------ 3 bytes --------
              else if (c == 0xED)          {q := 5; r := (c & 0x0F);}    // ------ 3 bytes --------
              else if (E1_EF(c))           {q := 3; r := (c & 0x0F);}    // ------ 3 bytes --------
              else {raise InvalidInput;}

            case (q == 2):
              if (x80_BF(c))                 {q := 0; yield(fuse(r,c)); r := 0;}
              else {raise InvalidInput;}

            case (q == 3):
              if (x80_BF(c))                 {q := 2; r := fuse(r,c);}
              else {raise InvalidInput;}

            case (q == 4):
              if (A0_BF(c))                  {q := 2; r := fuse(r,c);}
              else {raise InvalidInput;}

            case (q == 5):
              if (x80_9F(c))                 {q := 2; r := fuse(r,c);}
              else {raise InvalidInput;}

            end case (!(q == 0)):
              raise InvalidInput;
              };
            }
            ";

            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var dec = BekConverter.BekToSTb(solver, utf8decode_bek);
            var utf8decode = dec.ExploreBools();

            Sort bv32 = solver.MkBitVecSort(32);
            Sort outSort = solver.MkTupleSort(solver.StringSort, bv32);
            var initReg = solver.MkTuple(solver.GetNil(solver.StringSort), solver.MkNumeral(0,bv32));
            var regVar = solver.MkVar(1,outSort);
            var reg1 = solver.MkProj(1, regVar);
            var reg0 = solver.MkProj(0, regVar);
            STb<FuncDecl, Expr, Sort> parse = new STbModel(solver, "Parse", solver.CharacterSort, outSort, outSort, initReg, 0);

            var letter = solver.MkOr(//solver.MkAnd(solver.MkCharLe(solver.MkCharExpr('\xC0'), solver.CharVar),
                                     //                    solver.MkCharLe(solver.CharVar, solver.MkCharExpr('\xFF'))),
                                     solver.MkAnd(solver.MkCharLe(solver.MkCharExpr('a'), solver.CharVar),
                                                         solver.MkCharLe(solver.CharVar, solver.MkCharExpr('z'))),
                                     solver.MkAnd(solver.MkCharLe(solver.MkCharExpr('A'), solver.CharVar),
                                                         solver.MkCharLe(solver.CharVar, solver.MkCharExpr('Z'))));

            //var not_letter = solver.MkNot(letter);

            var digit = solver.MkAnd(solver.MkCharLe(solver.MkCharExpr('0'), solver.CharVar),
                                                         solver.MkCharLe(solver.CharVar, solver.MkCharExpr('9')));

            var nl = solver.MkEq(solver.CharVar, solver.MkCharExpr('\n'));

            var space = solver.MkEq(solver.CharVar, solver.MkCharExpr(' '));

            //var not_nl = solver.MkNot(nl);

            var _0 = solver.MkNumeral((int)'0', bv32);

            //var z = solver.Z3.MkFreshConst("z", solver.CharacterSort);

            //var constr = solver.MkNot(solver.Z3.MkExists(new Expr[] { z }, nl.Substitute(solver.CharVar, z)));
            ////var constr = nl.Substitute(solver.CharVar, z);

            //solver.Z3S.Push();
            //solver.Z3S.Assert((BoolExpr)solver.MkNot(constr));
            //var status = solver.Check();
            //var m = solver.Z3S.Model;
            //var zval = m.Evaluate(z, true);
            //solver.Z3S.Pop();

            var loop_0 = new BaseRule<Expr>(Sequence<Expr>.Empty, regVar, 0);
            var brule0_1 = new BaseRule<Expr>(Sequence<Expr>.Empty, solver.MkTuple(solver.MkListCons(solver.CharVar, reg0), reg1), 1);
            var rule0 = new IteRule<Expr>(letter, brule0_1, new IteRule<Expr>(space, loop_0, UndefRule<Expr>.Default));
            parse.AssignRule(0, rule0);

            var brule1_2 = new BaseRule<Expr>(Sequence<Expr>.Empty, solver.MkTuple(solver.MkListCons(solver.CharVar, reg0), reg1), 2);
            var brule_4 = new BaseRule<Expr>(Sequence<Expr>.Empty, regVar, 4);
            var rule1 = new IteRule<Expr>(letter, brule1_2, new IteRule<Expr>(space, brule_4, UndefRule<Expr>.Default));
            parse.AssignRule(1, rule1);

            var brule2_3 = new BaseRule<Expr>(Sequence<Expr>.Empty, solver.MkTuple(solver.MkListCons(solver.CharVar, reg0), reg1), 4);
            var rule2 = new IteRule<Expr>(letter, brule2_3, new IteRule<Expr>(space, brule_4, UndefRule<Expr>.Default));
            parse.AssignRule(2, rule2);

            var bv32var = solver.Z3.MkZeroExt(16, (BitVecExpr)solver.CharVar);

            var brule4_5 = new BaseRule<Expr>(Sequence<Expr>.Empty, solver.MkTuple(reg0, solver.MkBvAdd(
                solver.MkBvMul(solver.MkNumeral(10,bv32),reg1),
                solver.MkBvSub(bv32var,_0))),5);
            var rule4 = new IteRule<Expr>(digit, brule4_5, new IteRule<Expr>(space, brule_4, UndefRule<Expr>.Default));
            parse.AssignRule(4, rule4);

            var brule_0 = new BaseRule<Expr>(Sequence<Expr>.Empty.Append(regVar), initReg, 0);

            var brule_7 = new BaseRule<Expr>(Sequence<Expr>.Empty, regVar, 7);

            var brule5_6 = new BaseRule<Expr>(Sequence<Expr>.Empty, solver.MkTuple(reg0, solver.MkBvAdd(
                solver.MkBvMul(solver.MkNumeral(10, bv32), reg1),
                solver.MkBvSub(bv32var, _0))), 6);
            var rule5 = new IteRule<Expr>(digit, brule5_6, new IteRule<Expr>(nl, brule_0, new IteRule<Expr>(space, brule_7, UndefRule<Expr>.Default)));
            parse.AssignRule(5, rule5);

            var brule6_7 = new BaseRule<Expr>(Sequence<Expr>.Empty, solver.MkTuple(reg0, solver.MkBvAdd(
                solver.MkBvMul(solver.MkNumeral(10, bv32), reg1),
                solver.MkBvSub(bv32var, _0))), 7);
            var rule6 = new IteRule<Expr>(digit, brule6_7, new IteRule<Expr>(nl, brule_0, new IteRule<Expr>(space, brule_7, UndefRule<Expr>.Default)));
            parse.AssignRule(6, rule6);

            var rule7 = new IteRule<Expr>(nl, brule_0, new IteRule<Expr>(space, brule_7, UndefRule<Expr>.Default));
            parse.AssignRule(7, rule7);

            parse.AssignFinalRule(0, new BaseRule<Expr>(Sequence<Expr>.Empty, initReg, 0));

            var comp = utf8decode.Compose(parse);

            //utf8decode.ToST().ShowGraph();

            //parse.ToST().ShowGraph();

            //comp.ToST().ShowGraph();

            //var comp1 = new STbSimulator<FuncDecl,Expr,Sort>(comp);
            //comp1.Explore();
            //Console.WriteLine(comp1.exploredSteps);

            //var rules = Array.ConvertAll(comp1.UncoveredMoves.ToArray(), r => new Tuple<int, int>(r.Item3.SourceState, r.Item3.TargetState));

            var simpl = comp.Simplify();

            Assert.AreEqual<int>(35, comp.StateCount);
            Assert.AreEqual<int>(7, simpl.StateCount);

            //simpl.ShowGraph();
        }
コード例 #7
0
ファイル: UnitTest1.cs プロジェクト: AutomataDotNet/Automata
        public void TestCssCombinedCodepoint()
        {
            var kkkk = 0x7FFF - 65532;
            Z3Provider solver = new Z3Provider();
            Sort bv64 = solver.MkBitVecSort(64);
            Sort bv16 = solver.CharacterSort;

            Expr hs = solver.MkConst("hs", bv16);
            Expr ls = solver.MkConst("ls", bv16);

            Expr res = solver.MkConst("res", bv64);

            Expr maxVal = solver.MkNumeral(0x10FFFF, bv64); //max 16 bit nr

            Expr x = solver.ConvertBitVector(hs, bv64);
            Expr y = solver.ConvertBitVector(ls, bv64);
            Expr _0x10000 = solver.MkNumeral(0x10000, bv64);
            Expr _0xD800 = solver.MkNumeral(0xD800, bv64);
            Expr _0x400 = solver.MkNumeral(0x400, bv64);
            Expr _0xDC00 = solver.MkNumeral(0xDC00, bv64);

            ushort tmpLS = ((ushort)0xdfff) - ((ushort)0xdc00);

            for (int i = 0xdc00; i <= 0xdfff; i++ )
            {
                int j = (i - 0xdc00) >> 8;
                int k = (i >> 8) & 3;
                Assert.AreEqual<int>(j, k);
            }

            int tmpHS = (((int)0xdbff) - ((int)0xd800)) * ((int)0x400);
            //int tmpHS = (((int)0xdbff) - ((int)0xd800)) << 10;

            int tmpHSLS = tmpLS + tmpHS;

            int maxcodepoint = tmpHSLS + 0x10000;

            Expr cp = solver.MkCharAdd(_0x10000,
                       solver.MkCharAdd(solver.MkCharMul(solver.MkCharSub(x, _0xD800), _0x400),
                                        solver.MkCharSub(y, _0xDC00)));

            Expr ls_is_lowSurrogate =
                solver.MkAnd(solver.MkCharGe(ls, solver.MkNumeral(0xdc00, bv16)),
                                solver.MkCharLe(ls, solver.MkNumeral(0xdfff, bv16)));

            Expr hs_is_highSurrogate =
                solver.MkAnd(solver.MkCharGe(hs, solver.MkNumeral(0xd800, bv16)),
                                solver.MkCharLe(hs, solver.MkNumeral(0xdbff, bv16)));

            Expr assert = solver.Simplify(solver.MkAnd(
                ls_is_lowSurrogate,
                hs_is_highSurrogate,
                solver.MkEq(res, cp)));

            //string s = solver.PrettyPrint(assert);

            solver.MainSolver.Assert(assert);

            var model = solver.MainSolver.GetModel(solver.MkCharLt(maxVal, res), hs, ls, res);

            Assert.IsNull(model);

            //if (model != null)
            //{
            //    int hsVal = solver.GetNumeralInt(model[hs].Value);
            //    int lsVal = solver.GetNumeralInt(model[ls].Value);
            //    long resval = solver.GetNumeralUInt(model[res].Value);
            //    Assert.AreEqual<long>(CssCombinedCodepoint(hsVal, lsVal), resval);
            //}
        }