public IFilter Parse() { var tokenizer = new Tokenizer(Filter); tokens = tokenizer.Tokenize(); pos = -2; string conjunction; ListFilter.JoinType joinType; FilterSet filter = new FilterAndSet(); IFilter thisFilter; IFilter last; FilterOrSet orSet; while (++pos < tokens.Count) { conjunction = pos == -1 ? "," : tokens[pos]; var name = GetNextToken("field name"); var oper = GetNextToken("operator"); var value = GetNextToken("value"); if (Tokens.IsListStart(value)) { joinType = ListFilter.JoinType.And; var values = new List<string>(); while (!Tokens.IsListEnd(tokens[pos]) && !Tokens.IsListEnd(GetNextToken("value"))) { values.Add(tokens[pos]); if (GetNextToken("conjunction or list end") == "|") joinType = ListFilter.JoinType.Or; } thisFilter = new ListFilter(name, oper, values, joinType); } else thisFilter = new Filter(name, oper, value); if (conjunction == ",") // and filter.Add(thisFilter); else if (conjunction == "|") // or { last = filter.Last(); if (!(last is FilterOrSet)) { filter.RemoveAt(filter.Count - 1); orSet = new FilterOrSet(); orSet.Add(last); orSet.Add(thisFilter); filter.Add(orSet); } else ((FilterOrSet)last).Add(thisFilter); } else throw new ParseException("Parser: Unexpected '{0}', expected conjunction instead.", conjunction); } return filter; }
public IFilter Parse() { var tokenizer = new Tokenizer(Filter); tokens = tokenizer.Tokenize(); pos = -2; string conjunction; FilterSet filter = new FilterAndSet(); Filter thisFilter; IFilter last; FilterOrSet orSet; while (++pos < tokens.Count) { conjunction = pos == -1 ? "," : tokens[pos]; thisFilter = new Filter(GetNextToken("field name"), GetNextToken("operator"), GetNextToken("value")); if (conjunction == ",") // and filter.Add(thisFilter); else if (conjunction == "|") // or { last = filter.Last(); if (!(last is FilterOrSet)) { filter.RemoveAt(filter.Count - 1); orSet = new FilterOrSet(); orSet.Add(last); orSet.Add(thisFilter); filter.Add(orSet); } else ((FilterOrSet)last).Add(thisFilter); } else throw new ParseException("Parser: Unexpected '{0}', expected conjunction instead.", conjunction); } return filter; }