private JmespathExpression led(JmespathExpression left) {
        Token token = iterator.expect(LED_TOKENS);

        switch (token.type) {
            case DOT:
                // For example, "foo.bar"
                if (iterator.peek().type == TokenType.STAR) {
                    // "Example: foo.*". This is mostly an optimization of the
                    // generated AST to not need a subexpression to contain the
                    // projection.
                    iterator.expect(TokenType.STAR); // skip the "*".
                    return parseWildcardObject(left);
                } else {
                    // "foo.*", "foo.bar", "foo.[bar]", "foo.length(@)", etc.
                    JmespathExpression dotRhs = parseDotRhs(TokenType.DOT.lbp);
                    return new Subexpression(left, dotRhs, token.line, token.column);
                }
            case FLATTEN: // Example: a[].b
                return parseFlatten(left);
            case OR: // Example: a || b
                return new OrExpression(left, expression(token.type.lbp), token.line, token.column);
            case AND: // Example: a && b
                return new AndExpression(left, expression(token.type.lbp), token.line, token.column);
            case PIPE: // Example: a | b
                return new Subexpression(left, expression(token.type.lbp), token.line, token.column, true);
            case FILTER: // Example: a[?foo == bar]
                return parseFilter(left);
            case LBRACKET:
                Token bracketToken = iterator.expectPeek(TokenType.NUMBER, TokenType.COLON, TokenType.STAR);
                if (bracketToken.type == TokenType.STAR) {
                    // For example, "foo[*]"
                    return parseWildcardIndex(left);
                } else {
                    // For example, "foo[::1]", "foo[1]"
                    return new Subexpression(left, parseIndex(), token.line, token.column);
                }
            case EQUAL: // Example: a == b
                return parseComparator(ComparatorType.EQUAL, left);
            case NOT_EQUAL: // Example: a != b
                return parseComparator(ComparatorType.NOT_EQUAL, left);
            case GREATER_THAN: // Example: a > b
                return parseComparator(ComparatorType.GREATER_THAN, left);
            case GREATER_THAN_EQUAL: // Example: a >= b
                return parseComparator(ComparatorType.GREATER_THAN_EQUAL, left);
            case LESS_THAN: // Example: a < b
                return parseComparator(ComparatorType.LESS_THAN, left);
            case LESS_THAN_EQUAL: // Example: a <= b
                return parseComparator(ComparatorType.LESS_THAN_EQUAL, left);
            default:
                throw iterator.syntax("Invalid led token: " + token);
        }
    }
Tokens that can follow led tokens.
smithy-jmespath/src/main/java/software/amazon/smithy/jmespath/Parser.java