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); }
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); }