예제 #1
0
 public void EmitIn(LinkRef tail)
 {
     // emitted for things like [\dabcfh]
     BeginLink(tail);
     Emit(RxOp.TestCharGroup);
     EmitLink(tail);
 }
예제 #2
0
        public void EmitUntil(LinkRef repeat)
        {
            ResolveLink(repeat);
            Emit(OpCode.Until);

            TraceRegexp("end until {0}", repeat);
        }
예제 #3
0
        void EmitLink(LinkRef lref)
        {
            RxLinkRef link = lref as RxLinkRef;

            link.PushOffsetPosition(curpos);
            Emit((ushort)0);
        }
예제 #4
0
 public void EmitTest(LinkRef yes, LinkRef tail)
 {
     BeginLink(yes);
     BeginLink(tail);
     Emit(RxOp.Test);
     EmitLink(yes);
     EmitLink(tail);
 }
예제 #5
0
        private void EmitLink(LinkRef lref)
        {
            PatternLinkStack stack = (PatternLinkStack)lref;

            stack.OffsetAddress = CurrentAddress;
            Emit((ushort)0);                    // placeholder
            stack.Push();
        }
예제 #6
0
        public void EmitJump(LinkRef target)
        {
            BeginLink(target);
            Emit(OpCode.Jump, 0);
            EmitLink(target);

            TraceRegexp("jmp target {0}", target);
        }
예제 #7
0
        public void EmitBranch(LinkRef next)
        {
            BeginLink(next);
            Emit(OpCode.Branch, 0);
            EmitLink(next);

            TraceRegexp("branch next {0}", next);
        }
예제 #8
0
 public void EmitFastRepeat(int min, int max, bool lazy, LinkRef tail)
 {
     BeginLink(tail);
     Emit(lazy ? RxOp.FastRepeatLazy : RxOp.FastRepeat);
     EmitLink(tail);
     Emit(min);
     Emit(max);
 }
예제 #9
0
        public void EmitIn(LinkRef tail)
        {
            BeginLink(tail);
            Emit(OpCode.In);
            EmitLink(tail);

            TraceRegexp("in tail {0}", tail);
        }
예제 #10
0
 public void EmitRepeat(int min, int max, bool lazy, LinkRef until)
 {
     BeginLink(until);
     Emit(lazy ? RxOp.RepeatLazy : RxOp.Repeat);
     EmitLink(until);
     Emit(min);
     Emit(max);
 }
예제 #11
0
        public void EmitSub(LinkRef tail)
        {
            BeginLink(tail);
            Emit(OpCode.Sub);
            EmitLink(tail);

            TraceRegexp("sub {0}", tail);
        }
예제 #12
0
 public void EmitBalanceStart(int gid, int balance, bool capture, LinkRef tail)
 {
     BeginLink(tail);
     Emit(RxOp.BalanceStart);
     Emit((ushort)gid);
     Emit((ushort)balance);
     Emit((byte)(capture ? 1 : 0));
     EmitLink(tail);
 }
예제 #13
0
        public void EmitAnchor(bool reverse, int offset, LinkRef tail)
        {
            BeginLink(tail);
            Emit(OpCode.Anchor, MakeFlags(false, false, reverse, false));
            EmitLink(tail);
            Emit((ushort)offset);

            TraceRegexp("anchor reverse {0} offset {1} tail {2}", reverse, offset, tail);
        }
예제 #14
0
        public void EmitIfDefined(int gid, LinkRef tail)
        {
            BeginLink(tail);
            Emit(OpCode.IfDefined);
            EmitLink(tail);
            Emit((ushort)gid);

            TraceRegexp("if defined gid {1} tail {2}", gid, tail);
        }
예제 #15
0
        public void EmitTest(LinkRef yes, LinkRef tail)
        {
            BeginLink(yes);
            BeginLink(tail);
            Emit(OpCode.Test);
            EmitLink(yes);
            EmitLink(tail);

            TraceRegexp("test yes {0} tail {1}", yes, tail);
        }
예제 #16
0
        public void EmitFastRepeat(int min, int max, bool lazy, LinkRef tail)
        {
            BeginLink(tail);
            Emit(OpCode.FastRepeat, MakeFlags(false, false, false, lazy));
            EmitLink(tail);
            EmitCount(min);
            EmitCount(max);

            TraceRegexp("repeat-fast min {0} max {1} lazy {2} tail {3}", min, max, lazy, tail);
        }
예제 #17
0
        public void ResolveLink(LinkRef lref)
        {
            PatternLinkStack stack = (PatternLinkStack)lref;

            while (stack.Pop())
            {
                pgm[stack.OffsetAddress] = (ushort)stack.GetOffset(CurrentAddress);
            }

            TraceRegexpLabel(lref);
        }
예제 #18
0
 public void EmitIfDefined(int gid, LinkRef tail)
 {
     if (gid > ushort.MaxValue)
     {
         throw new NotSupportedException();
     }
     BeginLink(tail);
     Emit(RxOp.IfDefined);
     EmitLink(tail);
     Emit((ushort)gid);
 }
예제 #19
0
        public void EmitBalanceStart(int gid, int balance, bool capture, LinkRef tail)
        {
            BeginLink(tail);
            Emit(OpCode.BalanceStart);
            Emit((ushort)gid);
            Emit((ushort)balance);
            Emit((ushort)(capture ? 1 : 0));
            EmitLink(tail);

            TraceRegexp("balance start gid {0} balance {1} capture {2} tail {3}", gid, balance, capture, tail);
        }
예제 #20
0
        public void ResolveLink(LinkRef link)
        {
            RxLinkRef l = link as RxLinkRef;

            for (int i = 0; i < l.current; i += 2)
            {
                int offset = curpos - l.offsets [i];
                if (offset > ushort.MaxValue)
                {
                    throw new NotSupportedException();
                }
                int offsetpos = l.offsets [i + 1];
                program [offsetpos]     = (byte)offset;
                program [offsetpos + 1] = (byte)(offset >> 8);
            }
        }
예제 #21
0
 public void EmitAnchor(bool reverse, int offset, LinkRef tail)
 {
     BeginLink(tail);
     if (reverse)
     {
         Emit(RxOp.AnchorReverse);
     }
     else
     {
         Emit(RxOp.Anchor);
     }
     EmitLink(tail);
     if (offset > ushort.MaxValue)
     {
         throw new NotSupportedException();
     }
     Emit((ushort)offset);
 }
예제 #22
0
 public void EmitSub(LinkRef tail)
 {
     BeginLink(tail);
     Emit(RxOp.SubExpression);
     EmitLink(tail);
 }
예제 #23
0
 public void EmitUntil(LinkRef repeat)
 {
     ResolveLink(repeat);
     Emit(RxOp.Until);
 }
예제 #24
0
        void BeginLink(LinkRef lref)
        {
            RxLinkRef link = lref as RxLinkRef;

            link.PushInstructionBase(curpos);
        }
예제 #25
0
        private void BeginLink(LinkRef lref)
        {
            PatternLinkStack stack = (PatternLinkStack)lref;

            stack.BaseAddress = CurrentAddress;
        }
예제 #26
0
 public void EmitJump(LinkRef target)
 {
     BeginLink(target);
     Emit(RxOp.Jump);
     EmitLink(target);
 }
예제 #27
0
 static void TraceRegexpLabel(LinkRef lref)
 {
     Console.Write("{0}:", lref);
 }
예제 #28
0
 public void EmitBranch(LinkRef next)
 {
     BeginLink(next);
     Emit(RxOp.Branch);
     EmitLink(next);
 }