private FSM <int> ParseSet() { List <int> charset = new List <int>(); bool negate = false; if (this.Pattern[_parseIndex] == '^') { negate = true; _parseIndex++; } while (this.Pattern[_parseIndex] != ']') { switch (this.Pattern[_parseIndex]) { case '\\': _parseIndex++; charset.Add(this.Pattern[_parseIndex++]); break; case '-': _parseIndex++; int start = charset.Last(); charset.RemoveAt(charset.Count - 1); for (int c = start; c <= this.Pattern[_parseIndex]; c++) { charset.Add(c); } _parseIndex++; break; default: charset.Add(this.Pattern[_parseIndex++]); break; } } //consume closing set _parseIndex++; FSM <int> result = new NFSM <int>(-1); for (int i = 0; i < 256; i++) { if (i != (int)'\\') { if ((!negate && charset.Contains(i)) || (negate && !charset.Contains(i))) { result = result.Or(i); } } } return(result); }
private FSM <int> AnyChar() { FSM <int> result = new NFSM <int>(-1); for (int i = 0; i < 256; i++) { result = result.Or(i); } return(result); }