Example #1
0
        /// <summary>
        /// 添加指定字符类。
        /// </summary>
        /// <param name="cc">要添加的字符类。</param>
        public void AddCharClass(RegexCharClass cc)
        {
            // 这个方法的原版实现会直接将 cc 中的字符范围添加到当前类中,
            // 而不是复制副本,有时会导致出错。
            if (!(cc.CanMerge && this.CanMerge))
            {
                CompilerCommonExceptions.RegexCharClassCannotMerge("charClass");
            }
            int ccRangeCount   = RccRangeCount.Value(cc.charClass);
            int thisRangeCount = RccRangeCount.Value(this.charClass);

            if (!RccGetCanonical.Value(cc.charClass))
            {
                // 如果要合并的字符类并不规范,则自己也不规范。
                RccSetCanonical.Value(this.charClass, false);
            }
            else if (RccGetCanonical.Value(this.charClass) && thisRangeCount > 0 && ccRangeCount > 0 &&
                     RccSRGetFirst.Value(RccGetRangeAt.Value(cc.charClass, 0)) <=
                     RccSRGetLast.Value(RccGetRangeAt.Value(this, thisRangeCount - 1)))
            {
                // Range 不能恰好接起来,那么也会导致不规范。
                RccSetCanonical.Value(this.charClass, false);
            }
            IList list = RccGetRangelist.Value(this.charClass);

            for (int i = 0; i < ccRangeCount; i += 1)
            {
                object range = RccGetRangeAt.Value(cc.charClass, i);
                // 这里创建一个新的字符范围。
                list.Add(RccSRConstructor.Value(RccSRGetFirst.Value(range), RccSRGetLast.Value(range)));
            }
            RccGetCategories.Value(this.charClass).Append(RccGetCategories.Value(cc.charClass).ToString());
        }
Example #2
0
        /// <summary>
        /// 检查正则表达式是否可以被嵌套。
        /// </summary>
        /// <param name="regex">要检查的正则表达式。</param>
        protected static void CheckRegex(Regex regex)
        {
            AnchorExp anchor = regex as AnchorExp;

            if (anchor != null)
            {
                if (anchor.BeginningOfLine)
                {
                    throw CompilerCommonExceptions.NestedBeginningOfLine("regex");
                }
                if (anchor.TrailingExpression == AnchorExp.EndOfLine)
                {
                    throw CompilerCommonExceptions.NestedEndOfLine("regex");
                }
                throw CompilerCommonExceptions.NestedTrailing("regex");
            }
            if (regex is EndOfFileExp)
            {
                throw CompilerCommonExceptions.NestedEndOfFile("regex");
            }
        }