private RegExp ParseCharClassExp() { if (this.Match('[')) { bool negate = false; if (this.Match('^')) { negate = true; } RegExp e = this.ParseCharClasses(); if (negate) { e = RegExp.MakeIntersection(RegExp.MakeAnyChar(), RegExp.MakeComplement(e)); } if (!this.Match(']')) { throw new ArgumentException("expected ']' at position " + this.pos); } return(e); } return(this.ParseSimpleExp()); }
private RegExp ParseSimpleExp() { if (this.Match('.')) { return(RegExp.MakeAnyChar()); } if (this.Check(RegExpSyntaxOptions.Empty) && this.Match('#')) { return(RegExp.MakeEmpty()); } if (this.Check(RegExpSyntaxOptions.Anystring) && this.Match('@')) { return(RegExp.MakeAnyString()); } if (this.Match('"')) { int start = this.pos; while (this.More() && !this.Peek("\"")) { this.Next(); } if (!this.Match('"')) { throw new ArgumentException("expected '\"' at position " + this.pos); } return(RegExp.MakeString(this.b.Substring(start, ((this.pos - 1) - start)))); } if (this.Match('(')) { if (this.Match('?')) { this.SkipNonCapturingSubpatternExp(); } if (this.Match(')')) { return(RegExp.MakeString(string.Empty)); } RegExp e = this.ParseUnionExp(); if (!this.Match(')')) { throw new ArgumentException("expected ')' at position " + this.pos); } return(e); } if ((this.Check(RegExpSyntaxOptions.Automaton) || this.Check(RegExpSyntaxOptions.Interval)) && this.Match('<')) { int start = this.pos; while (this.More() && !this.Peek(">")) { this.Next(); } if (!this.Match('>')) { throw new ArgumentException("expected '>' at position " + this.pos); } string str = this.b.Substring(start, ((this.pos - 1) - start)); int i = str.IndexOf('-'); if (i == -1) { if (!this.Check(RegExpSyntaxOptions.Automaton)) { throw new ArgumentException("interval syntax error at position " + (this.pos - 1)); } return(RegExp.MakeAutomaton(str)); } if (!this.Check(RegExpSyntaxOptions.Interval)) { throw new ArgumentException("illegal identifier at position " + (this.pos - 1)); } try { if (i == 0 || i == str.Length - 1 || i != str.LastIndexOf('-')) { throw new FormatException(); } string smin = str.Substring(0, i - 0); string smax = str.Substring(i + 1, (str.Length - (i + 1))); int imin = int.Parse(smin, CultureInfo.CurrentCulture); int imax = int.Parse(smax, CultureInfo.CurrentCulture); int numdigits = smin.Length == smax.Length ? smin.Length : 0; if (imin > imax) { int t = imin; imin = imax; imax = t; } return(RegExp.MakeInterval(imin, imax, numdigits)); } catch (FormatException) { throw new ArgumentException("interval syntax error at position " + (this.pos - 1)); } } return(RegExp.MakeChar(this.ParseCharExp())); }