示例#1
0
 protected override void OnRenderEnd(RegExpr defaultTokenWs, RegExpr parent,
                                     StringBuilder pattern, ref RenderMode mode)
 {
     base.OnRenderEnd(defaultTokenWs, parent, pattern, ref mode);
     pattern.Append(")");
     mode &= ~RenderMode.Assert;
 }
示例#2
0
            protected override void OnRenderNext(RegExpr defaultTokenWs, RegExpr parent,
                                                 StringBuilder pattern, ref RenderMode mode, Stack <Token> tokenStack)
            {
                base.OnRenderNext(defaultTokenWs, parent, pattern, ref mode, tokenStack);
                var tokenWs = GetTokenWhitespace(defaultTokenWs);

                if (NeedsWhitespaceGroup(tokenWs, mode))
                {
                    pattern.Append(")");
                }
                if (Expr != null)
                {
                    if (!mode.HasFlag(RenderMode.Assert) && !string.IsNullOrEmpty(Id))
                    {
                        string captureId = GenerateCaptureId(Id);
                        Parents.Add(captureId, tokenStack.Peek());
                        tokenStack.Peek().Children.Add(this);
                        pattern.AppendFormat("(?<{0}>", captureId);
                    }
                    else
                    {
                        pattern.Append("(?:");
                    }
                }
                tokenStack.Push(this);
            }
示例#3
0
 protected override IEnumerable <RegExpr> OnRender(RegExpr defaultTokenWs, RegExpr parent,
                                                   StringBuilder pattern, ref RenderMode mode)
 {
     base.OnRender(defaultTokenWs, parent, pattern, ref mode);
     pattern.Append(LiteralExpr);
     return(null);
 }
示例#4
0
        protected override void OnRenderEnd(RegExpr defaultTokenWs, RegExpr parent,
            StringBuilder pattern, ref RenderMode mode, Stack<Token> tokenStack)
        {
            base.OnRenderEnd(defaultTokenWs, parent, pattern, ref mode, tokenStack);

            if (parent == null || !(parent is CharClass))
                pattern.Append("]");
        }
示例#5
0
文件: Parser.cs 项目: freall/vstools
            public void Refresh(RegExpr expr, RegExpr defaultTokenWs = null)
            {
                // Render Regex string
                Pattern = Renderer.RenderPattern(expr, defaultTokenWs);

                // Compile Regex
                Regex = new Regex(Pattern.ExprRender, RegexOptions.Multiline);
            }
示例#6
0
 protected override void OnRenderNext(RegExpr defaultTokenWs, RegExpr parent,
                                      StringBuilder pattern, ref RenderMode mode)
 {
     base.OnRenderNext(defaultTokenWs, parent, pattern, ref mode);
     if (!IsSubSet && HasPositive && HasNegative)
     {
         pattern.Append("-[");
     }
 }
示例#7
0
 public Token(string id, SkipWhitespace skipWs, RegExpr expr)
 {
     Id = id;
     SkipLeadingWhitespace = (skipWs == SkipWhitespace.Enable);
     Expr     = expr;
     Rules    = new TokenRules();
     Children = new HashSet <Token>();
     Parents  = new Dictionary <string, Token>();
 }
示例#8
0
 public Token(string id, SkipWhitespace skipWs, RegExpr expr)
 {
     Id = id;
     SkipLeadingWhitespace = (skipWs == SkipWhitespace.Enable);
     Expr      = expr;
     Rules     = new TokenRules();
     CaptureId = GenerateCaptureId(Id);
     Children  = new List <Token>();
 }
示例#9
0
        protected override IEnumerable<RegExpr> OnRender(RegExpr defaultTokenWs, RegExpr parent,
            StringBuilder pattern, ref RenderMode mode, Stack<Token> tokenStack)
        {
            base.OnRender(defaultTokenWs, parent, pattern, ref mode, tokenStack);

            if (parent == null || !(parent is CharClass))
                pattern.Append("[");

            return Items(LowerBound, UpperBound);
        }
示例#10
0
 public Token(string id, RegExpr skipWs, RegExpr expr)
 {
     Id = id;
     SkipLeadingWhitespace = true;
     LeadingWhitespace     = skipWs;
     Expr      = expr;
     Rules     = new TokenRules();
     CaptureId = GenerateCaptureId(Id);
     Children  = new List <Token>();
 }
示例#11
0
 public Token(string id, RegExpr skipWs, RegExpr expr)
 {
     Id = id;
     SkipLeadingWhitespace = true;
     LeadingWhitespace     = skipWs;
     Expr     = expr;
     Rules    = new TokenRules();
     Children = new HashSet <Token>();
     Parents  = new Dictionary <string, Token>();
 }
示例#12
0
 protected override void OnRenderEnd(RegExpr defaultTokenWs, RegExpr parent,
                                     StringBuilder pattern, ref RenderMode mode, Stack <Token> tokenStack)
 {
     base.OnRenderEnd(defaultTokenWs, parent, pattern, ref mode, tokenStack);
     pattern.Append(")");
     if (!(parent is Token))
     {
         pattern.Append(")");
     }
 }
示例#13
0
        public static RegExprAssert AssertLookBehind(RegExpr expr)
        {
            var assert = expr.AsAssert();

            return(new RegExprAssert
            {
                Context = AssertLook.Behind,
                Negative = assert.Negative,
                Expr = assert.Expr
            });
        }
示例#14
0
        public static RegExprAssert AssertNegated(RegExpr expr)
        {
            var assert = expr.AsAssert();

            return(new RegExprAssert
            {
                Context = assert.Context,
                Negative = !assert.Negative,
                Expr = assert.Expr
            });
        }
示例#15
0
 protected override IEnumerable <RegExpr> OnRender(RegExpr defaultTokenWs, RegExpr parent,
                                                   StringBuilder pattern, ref RenderMode mode, Stack <Token> tokenStack)
 {
     base.OnRender(defaultTokenWs, parent, pattern, ref mode, tokenStack);
     if (!(parent is Token))
     {
         pattern.Append("(?:");
     }
     pattern.Append("(?:");
     return(Exprs);
 }
示例#16
0
        protected override IEnumerable <RegExpr> OnRender(RegExpr defaultTokenWs, RegExpr parent,
                                                          StringBuilder pattern, ref RenderMode mode, Stack <Token> tokenStack)
        {
            base.OnRender(defaultTokenWs, parent, pattern, ref mode, tokenStack);

            if (ExprNeedsGroup)
            {
                pattern.Append("(?:");
            }

            return(Items(Expr));
        }
示例#17
0
            RegExpr GetTokenWhitespace(RegExpr defaultTokenWs)
            {
                if (!SkipLeadingWhitespace)
                {
                    return(null);
                }
                var tokenWs = LeadingWhitespace;

                if (tokenWs == null)
                {
                    tokenWs = defaultTokenWs;
                }
                return(tokenWs);
            }
示例#18
0
 protected override IEnumerable <RegExpr> OnRender(RegExpr defaultTokenWs, RegExpr parent,
                                                   StringBuilder pattern, ref RenderMode mode, Stack <Token> tokenStack)
 {
     base.OnRender(defaultTokenWs, parent, pattern, ref mode, tokenStack);
     if ((parent == null || !(parent is CharClass)) && NeedsGroup(LiteralChars))
     {
         pattern.AppendFormat("[{0}]", LiteralChars);
     }
     else
     {
         pattern.Append(LiteralChars);
     }
     return(null);
 }
示例#19
0
        protected override IEnumerable <RegExpr> OnRender(RegExpr defaultTokenWs, RegExpr parent,
                                                          StringBuilder pattern, ref RenderMode mode)
        {
            base.OnRender(defaultTokenWs, parent, pattern, ref mode);

            if (!HasPositive && !HasNegative)
            {
                return(null);
            }

            if (!IsSubSet)
            {
                if (HasPositive)
                {
                    pattern.Append("[");
                }
                else
                {
                    pattern.Append("[^");
                }
            }

            IEnumerable <RegExpr> children = null;

            if (HasPositive && HasNegative)
            {
                children = Items(
                    new CharClassSet(positives: Positives)
                {
                    IsSubSet = true
                },
                    new CharClassSet(negatives: Negatives)
                {
                    IsSubSet = true
                });
            }
            else
            {
                if (HasPositive)
                {
                    children = Positives;
                }
                else if (HasNegative)
                {
                    children = Negatives;
                }
            }

            return(children);
        }
示例#20
0
            protected override void OnRenderEnd(RegExpr defaultTokenWs, RegExpr parent,
                                                StringBuilder pattern, ref RenderMode mode)
            {
                base.OnRenderEnd(defaultTokenWs, parent, pattern, ref mode);
                if (Expr != null)
                {
                    pattern.Append(")");
                }
                var tokenWs = GetTokenWhitespace(defaultTokenWs);

                if (tokenWs != null)
                {
                    pattern.Append(")");
                }
            }
示例#21
0
 protected override void OnRenderEnd(RegExpr defaultTokenWs, RegExpr parent,
                                     StringBuilder pattern, ref RenderMode mode, Stack <Token> tokenStack)
 {
     base.OnRenderEnd(defaultTokenWs, parent, pattern, ref mode, tokenStack);
     if (!IsSubSet)
     {
         if (HasPositive && HasNegative)
         {
             pattern.Append("]]");
         }
         else
         {
             pattern.Append("]");
         }
     }
 }
示例#22
0
            protected override IEnumerable <RegExpr> OnRender(RegExpr defaultTokenWs, RegExpr parent,
                                                              StringBuilder pattern, ref RenderMode mode)
            {
                base.OnRender(defaultTokenWs, parent, pattern, ref mode);

                var tokenWs = GetTokenWhitespace(defaultTokenWs);

                if (tokenWs != null)
                {
                    pattern.Append("(?:");
                }
                if (NeedsWhitespaceGroup(tokenWs, mode))
                {
                    pattern.Append("(?:");
                }
                return(Items(tokenWs, Expr));
            }
示例#23
0
        protected override void OnRenderEnd(RegExpr defaultTokenWs, RegExpr parent,
                                            StringBuilder pattern, ref RenderMode mode, Stack <Token> tokenStack)
        {
            base.OnRenderEnd(defaultTokenWs, parent, pattern, ref mode, tokenStack);

            if (ExprNeedsGroup)
            {
                pattern.Append(")");
            }

            if (AtLeast == 0 && AtMost == 1)
            {
                pattern.Append("?");
            }
            else if (AtLeast == 0 && AtMost == int.MaxValue)
            {
                pattern.Append("*");
            }
            else if (AtLeast == 1 && AtMost == int.MaxValue)
            {
                pattern.Append("+");
            }
            else if (AtLeast == AtMost)
            {
                pattern.AppendFormat("{{{0}}}", AtLeast);
            }
            else if (AtMost == int.MaxValue)
            {
                pattern.AppendFormat("{{{0},}}", AtLeast);
            }
            else if (AtLeast == 0)
            {
                pattern.AppendFormat("{{,{0}}}", AtMost);
            }
            else
            {
                pattern.AppendFormat("{{{0},{1}}}", AtLeast, AtMost);
            }
        }
示例#24
0
            protected override void OnRenderNext(RegExpr defaultTokenWs, RegExpr parent,
                                                 StringBuilder pattern, ref RenderMode mode)
            {
                base.OnRenderNext(defaultTokenWs, parent, pattern, ref mode);
                var tokenWs = GetTokenWhitespace(defaultTokenWs);

                if (NeedsWhitespaceGroup(tokenWs, mode))
                {
                    pattern.Append(")");
                }
                if (Expr != null)
                {
                    if (!mode.HasFlag(RenderMode.Assert) && !string.IsNullOrEmpty(Id))
                    {
                        pattern.AppendFormat("(?<{0}>", CaptureId);
                    }
                    else
                    {
                        pattern.Append("(?:");
                    }
                }
            }
示例#25
0
        protected override IEnumerable <RegExpr> OnRender(RegExpr defaultTokenWs, RegExpr parent,
                                                          StringBuilder pattern, ref RenderMode mode)
        {
            base.OnRender(defaultTokenWs, parent, pattern, ref mode);

            if (mode.HasFlag(RenderMode.Assert))
            {
                throw new NestedAssertException();
            }

            switch (Context)
            {
            case AssertLook.Ahead:
                if (Negative)
                {
                    pattern.Append("(?!");
                }
                else
                {
                    pattern.Append("(?=");
                }
                break;

            case AssertLook.Behind:
                if (Negative)
                {
                    pattern.Append("(?<!");
                }
                else
                {
                    pattern.Append("(?<=");
                }
                break;
            }

            mode |= RenderMode.Assert;
            return(Items(Expr));
        }
示例#26
0
 public Token(string id, RegExpr expr)
     : this(id, SkipWhitespace.Enable, expr)
 {
 }
示例#27
0
 bool NeedsWhitespaceGroup(RegExpr tokenWs, RenderMode mode)
 {
     return(tokenWs != null && !mode.HasFlag(RenderMode.Assert) &&
            (tokenWs is RegExprLiteral || tokenWs is RegExprSequence));
 }
示例#28
0
 public Token(Enum id, SkipWhitespace skipWs, RegExpr expr)
     : this(id.ToString(), skipWs, expr)
 {
 }
示例#29
0
 public Token(Enum id, RegExpr skipWs, RegExpr expr)
     : this(id.ToString(), skipWs, expr)
 {
 }
示例#30
0
 public Token(RegExpr expr)
     : this(string.Empty, SkipWhitespace.Enable, expr)
 {
 }