/// <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()); }
/// <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"); } }