public override FilterTerm VisitFilter_expression(V1QueryParser.Filter_expressionContext context) { var firstGroup = context.grouped_filter_term(0); var firstSimple = context.simple_filter_term(0); FilterTerm leftTerm = firstGroup != null?Visit(firstGroup) : Visit(firstSimple); int index = 0; while (true) { FilterTermType groupOp; if (context.and_operator(index) != null) { groupOp = FilterTermType.And; } else if (context.or_operator(index) != null) { groupOp = FilterTermType.Or; } else { break; } index++; var nextGroup = context.grouped_filter_term(index); var nextSimple = context.simple_filter_term(index); FilterTerm rightTerm = nextGroup != null?Visit(nextGroup) : Visit(nextSimple); if (leftTerm.Type == groupOp) { ((GroupFilterTerm)leftTerm).Add(rightTerm); } else { var groupTerm = groupOp == FilterTermType.And ? (GroupFilterTerm) new AndFilterTerm() : new OrFilterTerm(); groupTerm.Add(leftTerm); groupTerm.Add(rightTerm); leftTerm = groupTerm; } } return(leftTerm); }
/// <summary> /// Exit a parse tree produced by <see cref="V1QueryParser.filter_expression"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitFilter_expression([NotNull] V1QueryParser.Filter_expressionContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="V1QueryParser.filter_expression"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitFilter_expression([NotNull] V1QueryParser.Filter_expressionContext context) { return(VisitChildren(context)); }