private Item convertExpression(OperatorNode<ExpressionOperator> ast) {
        try {

            annotationStack.addFirst(ast);
            return switch (ast.getOperator()) {
                case AND -> buildAnd(ast);
                case OR -> buildOr(ast);
                case EQ -> buildEquals(ast);
                case LT -> buildLessThan(ast);
                case GT -> buildGreaterThan(ast);
                case LTEQ -> buildLessThanOrEquals(ast);
                case GTEQ -> buildGreaterThanOrEquals(ast);
                case CONTAINS -> buildTermSearch(ast);
                case MATCHES -> buildRegExpSearch(ast);
                case CALL -> buildFunctionCall(ast);
                case LITERAL -> buildLiteral(ast);
                case NOT -> buildNot(ast);
                case IN -> buildIn(ast);
                default -> throw newUnexpectedArgumentException(ast.getOperator(),
                                                                ExpressionOperator.AND, ExpressionOperator.CALL,
                                                                ExpressionOperator.CONTAINS, ExpressionOperator.EQ,
                                                                ExpressionOperator.GT, ExpressionOperator.GTEQ,
                                                                ExpressionOperator.IN,
                                                                ExpressionOperator.LT, ExpressionOperator.LTEQ,
                                                                ExpressionOperator.OR);
            };
        } finally {
            annotationStack.removeFirst();
        }
    }
The YQL query language.

This class <em>must</em> be kept in lockstep with {@link VespaSerializer}.
Adding anything here will usually require a corresponding addition in
VespaSerializer.

@author Steinar Knutsen
@author Stian Kristoffersen
@author Simon Thoresen Hult
container-search/src/main/java/com/yahoo/search/yql/YqlParser.java