// Path: src/main/java/com/nebhale/jsonpath/internal/parser/PathCharacter.java
// enum CharacterType {
//     ARRAY_CLOSE, //
//     ARRAY_OPEN, //
//     COMMA, //
//     COMPLEX_NAME_CHARACTER, //
//     DIGIT, //
//     DOT, //
//     DOUBLE_QUOTE, //
//     END, //
//     HYPHEN, //
//     INDEX_CHARACTER, //
//     LETTER, //
//     QUOTE, //
//     ROOT, //
//     SIMPLE_NAME_CHARACTER, //
//     SPACE, //
//     UNDERSCORE, //
//     WILDCARD;
// }
// 
// Path: src/main/java/com/nebhale/jsonpath/internal/parser/Token.java
// enum TokenType {
// 
//     CHILD, //
//     DEEP_WILDCARD, //
//     INDEX, //
//     ROOT, //
//     WILDCARD
// 
// }


import java.util.ArrayList;
import java.util.List;
import com.nebhale.jsonpath.internal.parser.PathCharacter.CharacterType;
import com.nebhale.jsonpath.internal.parser.Token.TokenType;

            if (context.parsingState == ParsingState.BASE) {
                base(context, c);
            } else if (context.parsingState == ParsingState.ARRAY_OPEN) {
                arrayOpen(context, c);
            } else if (context.parsingState == ParsingState.ARRAY_CLOSE) {
                arrayClose(context, c);
            } else if (context.parsingState == ParsingState.DOUBLE_QUOTE_CHILD) {
                arrayChild(context, c, CharacterType.DOUBLE_QUOTE, ParsingState.DOUBLE_QUOTE_CLOSE);
            } else if (context.parsingState == ParsingState.QUOTE_CHILD) {
                arrayChild(context, c, CharacterType.QUOTE, ParsingState.QUOTE_CLOSE);
            } else if (context.parsingState == ParsingState.DOT_CHILD) {
                dotChild(context, c);
            } else if (context.parsingState == ParsingState.DOUBLE_QUOTE_CLOSE) {
                arrayChildClose(context, c, CharacterType.DOUBLE_QUOTE);
            } else if (context.parsingState == ParsingState.INDEX) {
                index(context, c);
            } else if (context.parsingState == ParsingState.QUOTE_CLOSE) {
                arrayChildClose(context, c, CharacterType.QUOTE);
            }
        }

        return new LexerResult(context.tokenStream, context.problems);
    }

    private void arrayChild(LexerContext context, PathCharacter c, CharacterType quoteType, ParsingState closeState) {
        if (c.isType(CharacterType.COMPLEX_NAME_CHARACTER)) {
            context.value.add(c);
            context.scanner.consume();
        } else if (c.isType(quoteType)) {
// Path: src/main/java/com/nebhale/jsonpath/internal/parser/PathCharacter.java
// enum CharacterType {
//     ARRAY_CLOSE, //
//     ARRAY_OPEN, //
//     COMMA, //
//     COMPLEX_NAME_CHARACTER, //
//     DIGIT, //
//     DOT, //
//     DOUBLE_QUOTE, //
//     END, //
//     HYPHEN, //
//     INDEX_CHARACTER, //
//     LETTER, //
//     QUOTE, //
//     ROOT, //
//     SIMPLE_NAME_CHARACTER, //
//     SPACE, //
//     UNDERSCORE, //
//     WILDCARD;
// }
// 
// Path: src/main/java/com/nebhale/jsonpath/internal/parser/Token.java
// enum TokenType {
// 
//     CHILD, //
//     DEEP_WILDCARD, //
//     INDEX, //
//     ROOT, //
//     WILDCARD
// 
// }


// Path: src/main/java/com/nebhale/jsonpath/internal/parser/RecoveringPathLexer.java
import java.util.ArrayList;
import java.util.List;
import com.nebhale.jsonpath.internal.parser.PathCharacter.CharacterType;
import com.nebhale.jsonpath.internal.parser.Token.TokenType;


            if (context.parsingState == ParsingState.BASE) {
                base(context, c);
            } else if (context.parsingState == ParsingState.ARRAY_OPEN) {
                arrayOpen(context, c);
            } else if (context.parsingState == ParsingState.ARRAY_CLOSE) {
                arrayClose(context, c);
            } else if (context.parsingState == ParsingState.DOUBLE_QUOTE_CHILD) {
                arrayChild(context, c, CharacterType.DOUBLE_QUOTE, ParsingState.DOUBLE_QUOTE_CLOSE);
            } else if (context.parsingState == ParsingState.QUOTE_CHILD) {
                arrayChild(context, c, CharacterType.QUOTE, ParsingState.QUOTE_CLOSE);
            } else if (context.parsingState == ParsingState.DOT_CHILD) {
                dotChild(context, c);
            } else if (context.parsingState == ParsingState.DOUBLE_QUOTE_CLOSE) {
                arrayChildClose(context, c, CharacterType.DOUBLE_QUOTE);
            } else if (context.parsingState == ParsingState.INDEX) {
                index(context, c);
            } else if (context.parsingState == ParsingState.QUOTE_CLOSE) {
                arrayChildClose(context, c, CharacterType.QUOTE);
            }
        }

        return new LexerResult(context.tokenStream, context.problems);
    }

    private void arrayChild(LexerContext context, PathCharacter c, CharacterType quoteType, ParsingState closeState) {
        if (c.isType(CharacterType.COMPLEX_NAME_CHARACTER)) {
            context.value.add(c);
            context.scanner.consume();
        } else if (c.isType(quoteType)) {
            context.tokenStream.add(createToken(TokenType.CHILD, context));