package selfhost.gen;

import org.pragmatica.lang.Cause;
import org.pragmatica.lang.Option;
import org.pragmatica.lang.Result;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * Generated PEG parser with CST (Concrete Syntax Tree) output.
 * This parser preserves all source information including trivia (whitespace/comments).
 * Depends only on pragmatica-lite:core for Result type.
 */
public final class Java25SelfHost51 {

    // === Rule ID Types ===

    public sealed interface RuleId {
        int ordinal();
        String name();

        record CompilationUnit() implements RuleId {
            public int ordinal() { return 0; }
            public String name() { return "CompilationUnit"; }
        }
        record OrdinaryUnit() implements RuleId {
            public int ordinal() { return 1; }
            public String name() { return "OrdinaryUnit"; }
        }
        record PackageDecl() implements RuleId {
            public int ordinal() { return 2; }
            public String name() { return "PackageDecl"; }
        }
        record ImportDecl() implements RuleId {
            public int ordinal() { return 3; }
            public String name() { return "ImportDecl"; }
        }
        record ModuleDecl() implements RuleId {
            public int ordinal() { return 4; }
            public String name() { return "ModuleDecl"; }
        }
        record ModuleDirective() implements RuleId {
            public int ordinal() { return 5; }
            public String name() { return "ModuleDirective"; }
        }
        record RequiresDirective() implements RuleId {
            public int ordinal() { return 6; }
            public String name() { return "RequiresDirective"; }
        }
        record ExportsDirective() implements RuleId {
            public int ordinal() { return 7; }
            public String name() { return "ExportsDirective"; }
        }
        record OpensDirective() implements RuleId {
            public int ordinal() { return 8; }
            public String name() { return "OpensDirective"; }
        }
        record UsesDirective() implements RuleId {
            public int ordinal() { return 9; }
            public String name() { return "UsesDirective"; }
        }
        record ProvidesDirective() implements RuleId {
            public int ordinal() { return 10; }
            public String name() { return "ProvidesDirective"; }
        }
        record TypeDecl() implements RuleId {
            public int ordinal() { return 11; }
            public String name() { return "TypeDecl"; }
        }
        record TypeKind() implements RuleId {
            public int ordinal() { return 12; }
            public String name() { return "TypeKind"; }
        }
        record ClassDecl() implements RuleId {
            public int ordinal() { return 13; }
            public String name() { return "ClassDecl"; }
        }
        record InterfaceDecl() implements RuleId {
            public int ordinal() { return 14; }
            public String name() { return "InterfaceDecl"; }
        }
        record AnnotationDecl() implements RuleId {
            public int ordinal() { return 15; }
            public String name() { return "AnnotationDecl"; }
        }
        record ClassKW() implements RuleId {
            public int ordinal() { return 16; }
            public String name() { return "ClassKW"; }
        }
        record InterfaceKW() implements RuleId {
            public int ordinal() { return 17; }
            public String name() { return "InterfaceKW"; }
        }
        record AnnotationBody() implements RuleId {
            public int ordinal() { return 18; }
            public String name() { return "AnnotationBody"; }
        }
        record AnnotationMember() implements RuleId {
            public int ordinal() { return 19; }
            public String name() { return "AnnotationMember"; }
        }
        record AnnotationElemDecl() implements RuleId {
            public int ordinal() { return 20; }
            public String name() { return "AnnotationElemDecl"; }
        }
        record EnumDecl() implements RuleId {
            public int ordinal() { return 21; }
            public String name() { return "EnumDecl"; }
        }
        record RecordDecl() implements RuleId {
            public int ordinal() { return 22; }
            public String name() { return "RecordDecl"; }
        }
        record EnumKW() implements RuleId {
            public int ordinal() { return 23; }
            public String name() { return "EnumKW"; }
        }
        record RecordKW() implements RuleId {
            public int ordinal() { return 24; }
            public String name() { return "RecordKW"; }
        }
        record ImplementsClause() implements RuleId {
            public int ordinal() { return 25; }
            public String name() { return "ImplementsClause"; }
        }
        record PermitsClause() implements RuleId {
            public int ordinal() { return 26; }
            public String name() { return "PermitsClause"; }
        }
        record TypeList() implements RuleId {
            public int ordinal() { return 27; }
            public String name() { return "TypeList"; }
        }
        record TypeParams() implements RuleId {
            public int ordinal() { return 28; }
            public String name() { return "TypeParams"; }
        }
        record TypeParam() implements RuleId {
            public int ordinal() { return 29; }
            public String name() { return "TypeParam"; }
        }
        record ClassBody() implements RuleId {
            public int ordinal() { return 30; }
            public String name() { return "ClassBody"; }
        }
        record ClassMember() implements RuleId {
            public int ordinal() { return 31; }
            public String name() { return "ClassMember"; }
        }
        record Member() implements RuleId {
            public int ordinal() { return 32; }
            public String name() { return "Member"; }
        }
        record InitializerBlock() implements RuleId {
            public int ordinal() { return 33; }
            public String name() { return "InitializerBlock"; }
        }
        record EnumBody() implements RuleId {
            public int ordinal() { return 34; }
            public String name() { return "EnumBody"; }
        }
        record EnumConsts() implements RuleId {
            public int ordinal() { return 35; }
            public String name() { return "EnumConsts"; }
        }
        record EnumConst() implements RuleId {
            public int ordinal() { return 36; }
            public String name() { return "EnumConst"; }
        }
        record RecordComponents() implements RuleId {
            public int ordinal() { return 37; }
            public String name() { return "RecordComponents"; }
        }
        record RecordComp() implements RuleId {
            public int ordinal() { return 38; }
            public String name() { return "RecordComp"; }
        }
        record RecordBody() implements RuleId {
            public int ordinal() { return 39; }
            public String name() { return "RecordBody"; }
        }
        record RecordMember() implements RuleId {
            public int ordinal() { return 40; }
            public String name() { return "RecordMember"; }
        }
        record CompactConstructor() implements RuleId {
            public int ordinal() { return 41; }
            public String name() { return "CompactConstructor"; }
        }
        record FieldDecl() implements RuleId {
            public int ordinal() { return 42; }
            public String name() { return "FieldDecl"; }
        }
        record VarDecls() implements RuleId {
            public int ordinal() { return 43; }
            public String name() { return "VarDecls"; }
        }
        record VarDecl() implements RuleId {
            public int ordinal() { return 44; }
            public String name() { return "VarDecl"; }
        }
        record VarInit() implements RuleId {
            public int ordinal() { return 45; }
            public String name() { return "VarInit"; }
        }
        record MethodDecl() implements RuleId {
            public int ordinal() { return 46; }
            public String name() { return "MethodDecl"; }
        }
        record Params() implements RuleId {
            public int ordinal() { return 47; }
            public String name() { return "Params"; }
        }
        record Param() implements RuleId {
            public int ordinal() { return 48; }
            public String name() { return "Param"; }
        }
        record Throws() implements RuleId {
            public int ordinal() { return 49; }
            public String name() { return "Throws"; }
        }
        record ConstructorDecl() implements RuleId {
            public int ordinal() { return 50; }
            public String name() { return "ConstructorDecl"; }
        }
        record Block() implements RuleId {
            public int ordinal() { return 51; }
            public String name() { return "Block"; }
        }
        record BlockStmt() implements RuleId {
            public int ordinal() { return 52; }
            public String name() { return "BlockStmt"; }
        }
        record LocalTypeDecl() implements RuleId {
            public int ordinal() { return 53; }
            public String name() { return "LocalTypeDecl"; }
        }
        record LocalVar() implements RuleId {
            public int ordinal() { return 54; }
            public String name() { return "LocalVar"; }
        }
        record LocalVarType() implements RuleId {
            public int ordinal() { return 55; }
            public String name() { return "LocalVarType"; }
        }
        record Stmt() implements RuleId {
            public int ordinal() { return 56; }
            public String name() { return "Stmt"; }
        }
        record IfKW() implements RuleId {
            public int ordinal() { return 57; }
            public String name() { return "IfKW"; }
        }
        record WhileKW() implements RuleId {
            public int ordinal() { return 58; }
            public String name() { return "WhileKW"; }
        }
        record ForKW() implements RuleId {
            public int ordinal() { return 59; }
            public String name() { return "ForKW"; }
        }
        record DoKW() implements RuleId {
            public int ordinal() { return 60; }
            public String name() { return "DoKW"; }
        }
        record TryKW() implements RuleId {
            public int ordinal() { return 61; }
            public String name() { return "TryKW"; }
        }
        record SwitchKW() implements RuleId {
            public int ordinal() { return 62; }
            public String name() { return "SwitchKW"; }
        }
        record SynchronizedKW() implements RuleId {
            public int ordinal() { return 63; }
            public String name() { return "SynchronizedKW"; }
        }
        record ReturnKW() implements RuleId {
            public int ordinal() { return 64; }
            public String name() { return "ReturnKW"; }
        }
        record ThrowKW() implements RuleId {
            public int ordinal() { return 65; }
            public String name() { return "ThrowKW"; }
        }
        record BreakKW() implements RuleId {
            public int ordinal() { return 66; }
            public String name() { return "BreakKW"; }
        }
        record ContinueKW() implements RuleId {
            public int ordinal() { return 67; }
            public String name() { return "ContinueKW"; }
        }
        record AssertKW() implements RuleId {
            public int ordinal() { return 68; }
            public String name() { return "AssertKW"; }
        }
        record YieldKW() implements RuleId {
            public int ordinal() { return 69; }
            public String name() { return "YieldKW"; }
        }
        record CatchKW() implements RuleId {
            public int ordinal() { return 70; }
            public String name() { return "CatchKW"; }
        }
        record FinallyKW() implements RuleId {
            public int ordinal() { return 71; }
            public String name() { return "FinallyKW"; }
        }
        record WhenKW() implements RuleId {
            public int ordinal() { return 72; }
            public String name() { return "WhenKW"; }
        }
        record ForCtrl() implements RuleId {
            public int ordinal() { return 73; }
            public String name() { return "ForCtrl"; }
        }
        record ForInit() implements RuleId {
            public int ordinal() { return 74; }
            public String name() { return "ForInit"; }
        }
        record LocalVarNoSemi() implements RuleId {
            public int ordinal() { return 75; }
            public String name() { return "LocalVarNoSemi"; }
        }
        record ResourceSpec() implements RuleId {
            public int ordinal() { return 76; }
            public String name() { return "ResourceSpec"; }
        }
        record Resource() implements RuleId {
            public int ordinal() { return 77; }
            public String name() { return "Resource"; }
        }
        record Catch() implements RuleId {
            public int ordinal() { return 78; }
            public String name() { return "Catch"; }
        }
        record Finally() implements RuleId {
            public int ordinal() { return 79; }
            public String name() { return "Finally"; }
        }
        record SwitchBlock() implements RuleId {
            public int ordinal() { return 80; }
            public String name() { return "SwitchBlock"; }
        }
        record SwitchRule() implements RuleId {
            public int ordinal() { return 81; }
            public String name() { return "SwitchRule"; }
        }
        record SwitchLabel() implements RuleId {
            public int ordinal() { return 82; }
            public String name() { return "SwitchLabel"; }
        }
        record CaseItem() implements RuleId {
            public int ordinal() { return 83; }
            public String name() { return "CaseItem"; }
        }
        record Pattern() implements RuleId {
            public int ordinal() { return 84; }
            public String name() { return "Pattern"; }
        }
        record TypePattern() implements RuleId {
            public int ordinal() { return 85; }
            public String name() { return "TypePattern"; }
        }
        record RecordPattern() implements RuleId {
            public int ordinal() { return 86; }
            public String name() { return "RecordPattern"; }
        }
        record PatternList() implements RuleId {
            public int ordinal() { return 87; }
            public String name() { return "PatternList"; }
        }
        record Guard() implements RuleId {
            public int ordinal() { return 88; }
            public String name() { return "Guard"; }
        }
        record Expr() implements RuleId {
            public int ordinal() { return 89; }
            public String name() { return "Expr"; }
        }
        record Assignment() implements RuleId {
            public int ordinal() { return 90; }
            public String name() { return "Assignment"; }
        }
        record Ternary() implements RuleId {
            public int ordinal() { return 91; }
            public String name() { return "Ternary"; }
        }
        record LogOr() implements RuleId {
            public int ordinal() { return 92; }
            public String name() { return "LogOr"; }
        }
        record LogAnd() implements RuleId {
            public int ordinal() { return 93; }
            public String name() { return "LogAnd"; }
        }
        record BitOr() implements RuleId {
            public int ordinal() { return 94; }
            public String name() { return "BitOr"; }
        }
        record BitXor() implements RuleId {
            public int ordinal() { return 95; }
            public String name() { return "BitXor"; }
        }
        record BitAnd() implements RuleId {
            public int ordinal() { return 96; }
            public String name() { return "BitAnd"; }
        }
        record Equality() implements RuleId {
            public int ordinal() { return 97; }
            public String name() { return "Equality"; }
        }
        record Relational() implements RuleId {
            public int ordinal() { return 98; }
            public String name() { return "Relational"; }
        }
        record Shift() implements RuleId {
            public int ordinal() { return 99; }
            public String name() { return "Shift"; }
        }
        record URShift() implements RuleId {
            public int ordinal() { return 100; }
            public String name() { return "URShift"; }
        }
        record RShift() implements RuleId {
            public int ordinal() { return 101; }
            public String name() { return "RShift"; }
        }
        record LShift() implements RuleId {
            public int ordinal() { return 102; }
            public String name() { return "LShift"; }
        }
        record URShiftAssign() implements RuleId {
            public int ordinal() { return 103; }
            public String name() { return "URShiftAssign"; }
        }
        record RShiftAssign() implements RuleId {
            public int ordinal() { return 104; }
            public String name() { return "RShiftAssign"; }
        }
        record LShiftAssign() implements RuleId {
            public int ordinal() { return 105; }
            public String name() { return "LShiftAssign"; }
        }
        record Additive() implements RuleId {
            public int ordinal() { return 106; }
            public String name() { return "Additive"; }
        }
        record Multiplicative() implements RuleId {
            public int ordinal() { return 107; }
            public String name() { return "Multiplicative"; }
        }
        record Unary() implements RuleId {
            public int ordinal() { return 108; }
            public String name() { return "Unary"; }
        }
        record Postfix() implements RuleId {
            public int ordinal() { return 109; }
            public String name() { return "Postfix"; }
        }
        record PostOp() implements RuleId {
            public int ordinal() { return 110; }
            public String name() { return "PostOp"; }
        }
        record Primary() implements RuleId {
            public int ordinal() { return 111; }
            public String name() { return "Primary"; }
        }
        record TypeExpr() implements RuleId {
            public int ordinal() { return 112; }
            public String name() { return "TypeExpr"; }
        }
        record Lambda() implements RuleId {
            public int ordinal() { return 113; }
            public String name() { return "Lambda"; }
        }
        record LambdaParams() implements RuleId {
            public int ordinal() { return 114; }
            public String name() { return "LambdaParams"; }
        }
        record LambdaParam() implements RuleId {
            public int ordinal() { return 115; }
            public String name() { return "LambdaParam"; }
        }
        record Args() implements RuleId {
            public int ordinal() { return 116; }
            public String name() { return "Args"; }
        }
        record ExprList() implements RuleId {
            public int ordinal() { return 117; }
            public String name() { return "ExprList"; }
        }
        record Type() implements RuleId {
            public int ordinal() { return 118; }
            public String name() { return "Type"; }
        }
        record PrimType() implements RuleId {
            public int ordinal() { return 119; }
            public String name() { return "PrimType"; }
        }
        record RefType() implements RuleId {
            public int ordinal() { return 120; }
            public String name() { return "RefType"; }
        }
        record AnnotatedTypeName() implements RuleId {
            public int ordinal() { return 121; }
            public String name() { return "AnnotatedTypeName"; }
        }
        record Dims() implements RuleId {
            public int ordinal() { return 122; }
            public String name() { return "Dims"; }
        }
        record ArrayType() implements RuleId {
            public int ordinal() { return 123; }
            public String name() { return "ArrayType"; }
        }
        record DimExprs() implements RuleId {
            public int ordinal() { return 124; }
            public String name() { return "DimExprs"; }
        }
        record TypeArgs() implements RuleId {
            public int ordinal() { return 125; }
            public String name() { return "TypeArgs"; }
        }
        record TypeArg() implements RuleId {
            public int ordinal() { return 126; }
            public String name() { return "TypeArg"; }
        }
        record QualifiedName() implements RuleId {
            public int ordinal() { return 127; }
            public String name() { return "QualifiedName"; }
        }
        record Identifier() implements RuleId {
            public int ordinal() { return 128; }
            public String name() { return "Identifier"; }
        }
        record Modifier() implements RuleId {
            public int ordinal() { return 129; }
            public String name() { return "Modifier"; }
        }
        record Annotation() implements RuleId {
            public int ordinal() { return 130; }
            public String name() { return "Annotation"; }
        }
        record AnnotationValue() implements RuleId {
            public int ordinal() { return 131; }
            public String name() { return "AnnotationValue"; }
        }
        record AnnotationElem() implements RuleId {
            public int ordinal() { return 132; }
            public String name() { return "AnnotationElem"; }
        }
        record Literal() implements RuleId {
            public int ordinal() { return 133; }
            public String name() { return "Literal"; }
        }
        record CharLit() implements RuleId {
            public int ordinal() { return 134; }
            public String name() { return "CharLit"; }
        }
        record StringLit() implements RuleId {
            public int ordinal() { return 135; }
            public String name() { return "StringLit"; }
        }
        record NumLit() implements RuleId {
            public int ordinal() { return 136; }
            public String name() { return "NumLit"; }
        }
        record Keyword() implements RuleId {
            public int ordinal() { return 137; }
            public String name() { return "Keyword"; }
        }
        // Built-in types for anonymous terminals
        record PegLiteral() implements RuleId {
            public int ordinal() { return -1; }
            public String name() { return "literal"; }
        }
        record PegCharClass() implements RuleId {
            public int ordinal() { return -2; }
            public String name() { return "char"; }
        }
        record PegAny() implements RuleId {
            public int ordinal() { return -3; }
            public String name() { return "any"; }
        }
        record PegToken() implements RuleId {
            public int ordinal() { return -4; }
            public String name() { return "token"; }
        }
    }

    // Rule ID singleton instances
    private static final RuleId.CompilationUnit RULE_COMPILATION_UNIT = new RuleId.CompilationUnit();
    private static final RuleId.OrdinaryUnit RULE_ORDINARY_UNIT = new RuleId.OrdinaryUnit();
    private static final RuleId.PackageDecl RULE_PACKAGE_DECL = new RuleId.PackageDecl();
    private static final RuleId.ImportDecl RULE_IMPORT_DECL = new RuleId.ImportDecl();
    private static final RuleId.ModuleDecl RULE_MODULE_DECL = new RuleId.ModuleDecl();
    private static final RuleId.ModuleDirective RULE_MODULE_DIRECTIVE = new RuleId.ModuleDirective();
    private static final RuleId.RequiresDirective RULE_REQUIRES_DIRECTIVE = new RuleId.RequiresDirective();
    private static final RuleId.ExportsDirective RULE_EXPORTS_DIRECTIVE = new RuleId.ExportsDirective();
    private static final RuleId.OpensDirective RULE_OPENS_DIRECTIVE = new RuleId.OpensDirective();
    private static final RuleId.UsesDirective RULE_USES_DIRECTIVE = new RuleId.UsesDirective();
    private static final RuleId.ProvidesDirective RULE_PROVIDES_DIRECTIVE = new RuleId.ProvidesDirective();
    private static final RuleId.TypeDecl RULE_TYPE_DECL = new RuleId.TypeDecl();
    private static final RuleId.TypeKind RULE_TYPE_KIND = new RuleId.TypeKind();
    private static final RuleId.ClassDecl RULE_CLASS_DECL = new RuleId.ClassDecl();
    private static final RuleId.InterfaceDecl RULE_INTERFACE_DECL = new RuleId.InterfaceDecl();
    private static final RuleId.AnnotationDecl RULE_ANNOTATION_DECL = new RuleId.AnnotationDecl();
    private static final RuleId.ClassKW RULE_CLASS_K_W = new RuleId.ClassKW();
    private static final RuleId.InterfaceKW RULE_INTERFACE_K_W = new RuleId.InterfaceKW();
    private static final RuleId.AnnotationBody RULE_ANNOTATION_BODY = new RuleId.AnnotationBody();
    private static final RuleId.AnnotationMember RULE_ANNOTATION_MEMBER = new RuleId.AnnotationMember();
    private static final RuleId.AnnotationElemDecl RULE_ANNOTATION_ELEM_DECL = new RuleId.AnnotationElemDecl();
    private static final RuleId.EnumDecl RULE_ENUM_DECL = new RuleId.EnumDecl();
    private static final RuleId.RecordDecl RULE_RECORD_DECL = new RuleId.RecordDecl();
    private static final RuleId.EnumKW RULE_ENUM_K_W = new RuleId.EnumKW();
    private static final RuleId.RecordKW RULE_RECORD_K_W = new RuleId.RecordKW();
    private static final RuleId.ImplementsClause RULE_IMPLEMENTS_CLAUSE = new RuleId.ImplementsClause();
    private static final RuleId.PermitsClause RULE_PERMITS_CLAUSE = new RuleId.PermitsClause();
    private static final RuleId.TypeList RULE_TYPE_LIST = new RuleId.TypeList();
    private static final RuleId.TypeParams RULE_TYPE_PARAMS = new RuleId.TypeParams();
    private static final RuleId.TypeParam RULE_TYPE_PARAM = new RuleId.TypeParam();
    private static final RuleId.ClassBody RULE_CLASS_BODY = new RuleId.ClassBody();
    private static final RuleId.ClassMember RULE_CLASS_MEMBER = new RuleId.ClassMember();
    private static final RuleId.Member RULE_MEMBER = new RuleId.Member();
    private static final RuleId.InitializerBlock RULE_INITIALIZER_BLOCK = new RuleId.InitializerBlock();
    private static final RuleId.EnumBody RULE_ENUM_BODY = new RuleId.EnumBody();
    private static final RuleId.EnumConsts RULE_ENUM_CONSTS = new RuleId.EnumConsts();
    private static final RuleId.EnumConst RULE_ENUM_CONST = new RuleId.EnumConst();
    private static final RuleId.RecordComponents RULE_RECORD_COMPONENTS = new RuleId.RecordComponents();
    private static final RuleId.RecordComp RULE_RECORD_COMP = new RuleId.RecordComp();
    private static final RuleId.RecordBody RULE_RECORD_BODY = new RuleId.RecordBody();
    private static final RuleId.RecordMember RULE_RECORD_MEMBER = new RuleId.RecordMember();
    private static final RuleId.CompactConstructor RULE_COMPACT_CONSTRUCTOR = new RuleId.CompactConstructor();
    private static final RuleId.FieldDecl RULE_FIELD_DECL = new RuleId.FieldDecl();
    private static final RuleId.VarDecls RULE_VAR_DECLS = new RuleId.VarDecls();
    private static final RuleId.VarDecl RULE_VAR_DECL = new RuleId.VarDecl();
    private static final RuleId.VarInit RULE_VAR_INIT = new RuleId.VarInit();
    private static final RuleId.MethodDecl RULE_METHOD_DECL = new RuleId.MethodDecl();
    private static final RuleId.Params RULE_PARAMS = new RuleId.Params();
    private static final RuleId.Param RULE_PARAM = new RuleId.Param();
    private static final RuleId.Throws RULE_THROWS = new RuleId.Throws();
    private static final RuleId.ConstructorDecl RULE_CONSTRUCTOR_DECL = new RuleId.ConstructorDecl();
    private static final RuleId.Block RULE_BLOCK = new RuleId.Block();
    private static final RuleId.BlockStmt RULE_BLOCK_STMT = new RuleId.BlockStmt();
    private static final RuleId.LocalTypeDecl RULE_LOCAL_TYPE_DECL = new RuleId.LocalTypeDecl();
    private static final RuleId.LocalVar RULE_LOCAL_VAR = new RuleId.LocalVar();
    private static final RuleId.LocalVarType RULE_LOCAL_VAR_TYPE = new RuleId.LocalVarType();
    private static final RuleId.Stmt RULE_STMT = new RuleId.Stmt();
    private static final RuleId.IfKW RULE_IF_K_W = new RuleId.IfKW();
    private static final RuleId.WhileKW RULE_WHILE_K_W = new RuleId.WhileKW();
    private static final RuleId.ForKW RULE_FOR_K_W = new RuleId.ForKW();
    private static final RuleId.DoKW RULE_DO_K_W = new RuleId.DoKW();
    private static final RuleId.TryKW RULE_TRY_K_W = new RuleId.TryKW();
    private static final RuleId.SwitchKW RULE_SWITCH_K_W = new RuleId.SwitchKW();
    private static final RuleId.SynchronizedKW RULE_SYNCHRONIZED_K_W = new RuleId.SynchronizedKW();
    private static final RuleId.ReturnKW RULE_RETURN_K_W = new RuleId.ReturnKW();
    private static final RuleId.ThrowKW RULE_THROW_K_W = new RuleId.ThrowKW();
    private static final RuleId.BreakKW RULE_BREAK_K_W = new RuleId.BreakKW();
    private static final RuleId.ContinueKW RULE_CONTINUE_K_W = new RuleId.ContinueKW();
    private static final RuleId.AssertKW RULE_ASSERT_K_W = new RuleId.AssertKW();
    private static final RuleId.YieldKW RULE_YIELD_K_W = new RuleId.YieldKW();
    private static final RuleId.CatchKW RULE_CATCH_K_W = new RuleId.CatchKW();
    private static final RuleId.FinallyKW RULE_FINALLY_K_W = new RuleId.FinallyKW();
    private static final RuleId.WhenKW RULE_WHEN_K_W = new RuleId.WhenKW();
    private static final RuleId.ForCtrl RULE_FOR_CTRL = new RuleId.ForCtrl();
    private static final RuleId.ForInit RULE_FOR_INIT = new RuleId.ForInit();
    private static final RuleId.LocalVarNoSemi RULE_LOCAL_VAR_NO_SEMI = new RuleId.LocalVarNoSemi();
    private static final RuleId.ResourceSpec RULE_RESOURCE_SPEC = new RuleId.ResourceSpec();
    private static final RuleId.Resource RULE_RESOURCE = new RuleId.Resource();
    private static final RuleId.Catch RULE_CATCH = new RuleId.Catch();
    private static final RuleId.Finally RULE_FINALLY = new RuleId.Finally();
    private static final RuleId.SwitchBlock RULE_SWITCH_BLOCK = new RuleId.SwitchBlock();
    private static final RuleId.SwitchRule RULE_SWITCH_RULE = new RuleId.SwitchRule();
    private static final RuleId.SwitchLabel RULE_SWITCH_LABEL = new RuleId.SwitchLabel();
    private static final RuleId.CaseItem RULE_CASE_ITEM = new RuleId.CaseItem();
    private static final RuleId.Pattern RULE_PATTERN = new RuleId.Pattern();
    private static final RuleId.TypePattern RULE_TYPE_PATTERN = new RuleId.TypePattern();
    private static final RuleId.RecordPattern RULE_RECORD_PATTERN = new RuleId.RecordPattern();
    private static final RuleId.PatternList RULE_PATTERN_LIST = new RuleId.PatternList();
    private static final RuleId.Guard RULE_GUARD = new RuleId.Guard();
    private static final RuleId.Expr RULE_EXPR = new RuleId.Expr();
    private static final RuleId.Assignment RULE_ASSIGNMENT = new RuleId.Assignment();
    private static final RuleId.Ternary RULE_TERNARY = new RuleId.Ternary();
    private static final RuleId.LogOr RULE_LOG_OR = new RuleId.LogOr();
    private static final RuleId.LogAnd RULE_LOG_AND = new RuleId.LogAnd();
    private static final RuleId.BitOr RULE_BIT_OR = new RuleId.BitOr();
    private static final RuleId.BitXor RULE_BIT_XOR = new RuleId.BitXor();
    private static final RuleId.BitAnd RULE_BIT_AND = new RuleId.BitAnd();
    private static final RuleId.Equality RULE_EQUALITY = new RuleId.Equality();
    private static final RuleId.Relational RULE_RELATIONAL = new RuleId.Relational();
    private static final RuleId.Shift RULE_SHIFT = new RuleId.Shift();
    private static final RuleId.URShift RULE_U_R_SHIFT = new RuleId.URShift();
    private static final RuleId.RShift RULE_R_SHIFT = new RuleId.RShift();
    private static final RuleId.LShift RULE_L_SHIFT = new RuleId.LShift();
    private static final RuleId.URShiftAssign RULE_U_R_SHIFT_ASSIGN = new RuleId.URShiftAssign();
    private static final RuleId.RShiftAssign RULE_R_SHIFT_ASSIGN = new RuleId.RShiftAssign();
    private static final RuleId.LShiftAssign RULE_L_SHIFT_ASSIGN = new RuleId.LShiftAssign();
    private static final RuleId.Additive RULE_ADDITIVE = new RuleId.Additive();
    private static final RuleId.Multiplicative RULE_MULTIPLICATIVE = new RuleId.Multiplicative();
    private static final RuleId.Unary RULE_UNARY = new RuleId.Unary();
    private static final RuleId.Postfix RULE_POSTFIX = new RuleId.Postfix();
    private static final RuleId.PostOp RULE_POST_OP = new RuleId.PostOp();
    private static final RuleId.Primary RULE_PRIMARY = new RuleId.Primary();
    private static final RuleId.TypeExpr RULE_TYPE_EXPR = new RuleId.TypeExpr();
    private static final RuleId.Lambda RULE_LAMBDA = new RuleId.Lambda();
    private static final RuleId.LambdaParams RULE_LAMBDA_PARAMS = new RuleId.LambdaParams();
    private static final RuleId.LambdaParam RULE_LAMBDA_PARAM = new RuleId.LambdaParam();
    private static final RuleId.Args RULE_ARGS = new RuleId.Args();
    private static final RuleId.ExprList RULE_EXPR_LIST = new RuleId.ExprList();
    private static final RuleId.Type RULE_TYPE = new RuleId.Type();
    private static final RuleId.PrimType RULE_PRIM_TYPE = new RuleId.PrimType();
    private static final RuleId.RefType RULE_REF_TYPE = new RuleId.RefType();
    private static final RuleId.AnnotatedTypeName RULE_ANNOTATED_TYPE_NAME = new RuleId.AnnotatedTypeName();
    private static final RuleId.Dims RULE_DIMS = new RuleId.Dims();
    private static final RuleId.ArrayType RULE_ARRAY_TYPE = new RuleId.ArrayType();
    private static final RuleId.DimExprs RULE_DIM_EXPRS = new RuleId.DimExprs();
    private static final RuleId.TypeArgs RULE_TYPE_ARGS = new RuleId.TypeArgs();
    private static final RuleId.TypeArg RULE_TYPE_ARG = new RuleId.TypeArg();
    private static final RuleId.QualifiedName RULE_QUALIFIED_NAME = new RuleId.QualifiedName();
    private static final RuleId.Identifier RULE_IDENTIFIER = new RuleId.Identifier();
    private static final RuleId.Modifier RULE_MODIFIER = new RuleId.Modifier();
    private static final RuleId.Annotation RULE_ANNOTATION = new RuleId.Annotation();
    private static final RuleId.AnnotationValue RULE_ANNOTATION_VALUE = new RuleId.AnnotationValue();
    private static final RuleId.AnnotationElem RULE_ANNOTATION_ELEM = new RuleId.AnnotationElem();
    private static final RuleId.Literal RULE_LITERAL = new RuleId.Literal();
    private static final RuleId.CharLit RULE_CHAR_LIT = new RuleId.CharLit();
    private static final RuleId.StringLit RULE_STRING_LIT = new RuleId.StringLit();
    private static final RuleId.NumLit RULE_NUM_LIT = new RuleId.NumLit();
    private static final RuleId.Keyword RULE_KEYWORD = new RuleId.Keyword();
    private static final RuleId.PegLiteral RULE_PEG_LITERAL = new RuleId.PegLiteral();
    private static final RuleId.PegCharClass RULE_PEG_CHAR_CLASS = new RuleId.PegCharClass();
    private static final RuleId.PegAny RULE_PEG_ANY = new RuleId.PegAny();
    private static final RuleId.PegToken RULE_PEG_TOKEN = new RuleId.PegToken();
    private static final String[] ASCII_CHAR_STRINGS = new String[128];
    static {
        for (int __i = 0; __i < 128; __i++) {
            ASCII_CHAR_STRINGS[__i] = String.valueOf((char) __i);
        }
    }

    // === CST Types ===

    public record SourceLocation(int line, int column, int offset) {
        public static final SourceLocation START = new SourceLocation(1, 1, 0);
        public static SourceLocation sourceLocation(int line, int column, int offset) {
            return new SourceLocation(line, column, offset);
        }
        @Override public String toString() { return line + ":" + column; }
    }

    public record SourceSpan(int startLine, int startColumn, int startOffset,
                             int endLine, int endColumn, int endOffset) {
        public static SourceSpan sourceSpan(SourceLocation start, SourceLocation end) {
            return new SourceSpan(start.line(), start.column(), start.offset(),
                                  end.line(), end.column(), end.offset());
        }
        public static SourceSpan sourceSpan(SourceLocation location) {
            return sourceSpan(location, location);
        }
        public SourceLocation start() {
            return SourceLocation.sourceLocation(startLine, startColumn, startOffset);
        }
        public SourceLocation end() {
            return SourceLocation.sourceLocation(endLine, endColumn, endOffset);
        }
        public int length() { return endOffset - startOffset; }
        public String extract(String source) { return source.substring(startOffset, endOffset); }
        public SourceSpan merge(SourceSpan other) {
            int nsl, nsc, nso, nel, nec, neo;
            if (startOffset <= other.startOffset) {
                nsl = startLine; nsc = startColumn; nso = startOffset;
            } else {
                nsl = other.startLine; nsc = other.startColumn; nso = other.startOffset;
            }
            if (endOffset >= other.endOffset) {
                nel = endLine; nec = endColumn; neo = endOffset;
            } else {
                nel = other.endLine; nec = other.endColumn; neo = other.endOffset;
            }
            return new SourceSpan(nsl, nsc, nso, nel, nec, neo);
        }
        @Override public String toString() {
            return startLine + ":" + startColumn + "-" + endLine + ":" + endColumn;
        }
    }

    public sealed interface Trivia {
        SourceSpan span();
        String text();
        record Whitespace(SourceSpan span, String text) implements Trivia {}
        record LineComment(SourceSpan span, String text) implements Trivia {}
        record BlockComment(SourceSpan span, String text) implements Trivia {}
    }

    /**
     * v0.5.0 Phase 1.2 (Lever A): per-parse stable-ID source for CST nodes.
     * IDs are unique within a parse-session lineage and excluded from
     * structural equality (see CstNode equals/hashCode).
     */
    public sealed interface IdGenerator permits IdGenerator.PerSessionCounter {
        long next();

        final class PerSessionCounter implements IdGenerator {
            private long next = 0L;
            @Override public long next() { return next++; }
        }
    }

    public sealed interface CstNode {
        long id();
        SourceSpan span();
        RuleId rule();
        List<Trivia> leadingTrivia();
        List<Trivia> trailingTrivia();

        record Terminal(long id, SourceSpan span, RuleId rule, StringSpan textSpan,
                        List<Trivia> leadingTrivia, List<Trivia> trailingTrivia) implements CstNode {
            /** Convenience constructor   wraps a String as a fully-materialized StringSpan. */
            public Terminal(long id, SourceSpan span, RuleId rule, String text,
                            List<Trivia> leadingTrivia, List<Trivia> trailingTrivia) {
                this(id, span, rule, StringSpan.ofString(text), leadingTrivia, trailingTrivia);
            }
            public String text() { return textSpan.toString(); }
            @Override
            public boolean equals(Object other) {
                return other instanceof Terminal that
                    && java.util.Objects.equals(span, that.span)
                    && java.util.Objects.equals(rule, that.rule)
                    && java.util.Objects.equals(textSpan, that.textSpan)
                    && java.util.Objects.equals(leadingTrivia, that.leadingTrivia)
                    && java.util.Objects.equals(trailingTrivia, that.trailingTrivia);
            }
            @Override
            public int hashCode() {
                return java.util.Objects.hash(Terminal.class, span, rule, textSpan, leadingTrivia, trailingTrivia);
            }
        }

        record NonTerminal(long id, SourceSpan span, RuleId rule, List<CstNode> children,
                           List<Trivia> leadingTrivia, List<Trivia> trailingTrivia) implements CstNode {
            @Override
            public boolean equals(Object other) {
                return other instanceof NonTerminal that
                    && java.util.Objects.equals(span, that.span)
                    && java.util.Objects.equals(rule, that.rule)
                    && java.util.Objects.equals(children, that.children)
                    && java.util.Objects.equals(leadingTrivia, that.leadingTrivia)
                    && java.util.Objects.equals(trailingTrivia, that.trailingTrivia);
            }
            @Override
            public int hashCode() {
                return java.util.Objects.hash(NonTerminal.class, span, rule, children, leadingTrivia, trailingTrivia);
            }
        }

        record Token(long id, SourceSpan span, RuleId rule, StringSpan textSpan,
                     List<Trivia> leadingTrivia, List<Trivia> trailingTrivia) implements CstNode {
            /** Convenience constructor   wraps a String as a fully-materialized StringSpan. */
            public Token(long id, SourceSpan span, RuleId rule, String text,
                         List<Trivia> leadingTrivia, List<Trivia> trailingTrivia) {
                this(id, span, rule, StringSpan.ofString(text), leadingTrivia, trailingTrivia);
            }
            public String text() { return textSpan.toString(); }
            @Override
            public boolean equals(Object other) {
                return other instanceof Token that
                    && java.util.Objects.equals(span, that.span)
                    && java.util.Objects.equals(rule, that.rule)
                    && java.util.Objects.equals(textSpan, that.textSpan)
                    && java.util.Objects.equals(leadingTrivia, that.leadingTrivia)
                    && java.util.Objects.equals(trailingTrivia, that.trailingTrivia);
            }
            @Override
            public int hashCode() {
                return java.util.Objects.hash(Token.class, span, rule, textSpan, leadingTrivia, trailingTrivia);
            }
        }
    }

    /**
     * View into a substring of the parser input. Defers materialization to a
     * Java String until first access via toString(). Cleanup F.3: token text in
     * generated parsers flows through StringSpan to avoid eager substring()
     * allocation in match helpers, token boundary capture, and DFA fast-path.
     *
     * <p>Embedded inline so the standalone-parser invariant (depends only on
     * pragmatica-lite:core) is preserved.
     */
    public static final class StringSpan implements CharSequence {
        private final String source;
        private final int start;
        private final int end;
        private String materialized;

        public StringSpan(String source, int start, int end) {
            this.source = source;
            this.start = start;
            this.end = end;
        }

        /** Wrap a fully-materialized String with no deferral. */
        public static StringSpan ofString(String text) {
            var span = new StringSpan(text, 0, text.length());
            span.materialized = text;
            return span;
        }

        public int start() { return start; }
        public int end() { return end; }

        @Override public int length() { return end - start; }
        @Override public char charAt(int i) { return source.charAt(start + i); }
        @Override public CharSequence subSequence(int s, int e) {
            return new StringSpan(source, start + s, start + e);
        }

        @Override
        public String toString() {
            var m = materialized;
            if (m == null) {
                m = source.substring(start, end);
                materialized = m;
            }
            return m;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o instanceof StringSpan that) {
                int len = this.length();
                if (len != that.length()) return false;
                if (this.source == that.source && this.start == that.start && this.end == that.end) return true;
                for (int i = 0; i < len; i++) {
                    if (this.source.charAt(this.start + i) != that.source.charAt(that.start + i)) return false;
                }
                return true;
            }
            return false;
        }

        @Override
        public int hashCode() {
            if (materialized != null) return materialized.hashCode();
            int h = 0;
            int len = end - start;
            for (int i = 0; i < len; i++) {
                h = 31 * h + source.charAt(start + i);
            }
            return h;
        }
    }

    public sealed interface AstNode {
        SourceSpan span();
        String rule();

        record Terminal(SourceSpan span, String rule, String text) implements AstNode {}
        record NonTerminal(SourceSpan span, String rule, List<AstNode> children) implements AstNode {}
    }

    public record ParseError(SourceLocation location, String reason) implements Cause {
        @Override
        public String message() {
            return reason + " at " + location;
        }
    }

    // === Parse Context ===

    private String input;
    private int pos;
    private int line;
    private int column;
    private Map<Long, CstParseResult> cache;
    // 0.2.9: in-flight growing seeds for direct left-recursive rules.
    // Keyed by the same (ruleId, position) encoding as cache. When an
    // entry is present, a Warth seed-and-grow loop is active for that
    // rule at that position and self-recursive calls should return the
    // current seed instead of re-entering the body.
    private Map<Long, CstParseResult> growingSeeds;
    private Map<String, String> captures;
    private int tokenBoundaryDepth;
    private boolean skippingWhitespace;
    private boolean packratEnabled = true;
    private Option<SourceLocation> furthestFailure;
    private Option<String> furthestExpected;

    // Pending leading trivia   trivia captured between sibling
    // sequence elements that will attach to the following sibling's
    // leadingTrivia. Backtracking combinators save/restore snapshots.
    private final ArrayList<Trivia> pendingLeadingTrivia = new ArrayList<>();

    // v0.5.0 Phase 1.2 (Lever A): per-parse stable-ID allocator.
    // Reset on every init() so each parse session has its own
    // monotonically increasing ID lineage starting from 0.
    private IdGenerator idGen = new IdGenerator.PerSessionCounter();

    /**
     * Enable or disable packrat memoization.
     * Disabling may reduce memory usage for large inputs.
     */
    public void setPackratEnabled(boolean enabled) {
        this.packratEnabled = enabled;
    }
    private final Map<String, CstParseResult> literalFailureCache = new HashMap<>();
    private final Map<String, CstParseResult> charClassFailureCache = new HashMap<>();

    private void init(String input) {
        this.input = input;
        this.pos = 0;
        this.line = 1;
        this.column = 1;
        this.cache = packratEnabled ? new HashMap<>() : null;
        this.growingSeeds = new HashMap<>();
        this.captures = new HashMap<>();
        this.tokenBoundaryDepth = 0;
        this.furthestFailure = Option.none();
        this.furthestExpected = Option.none();
        this.pendingLeadingTrivia.clear();
        this.idGen = new IdGenerator.PerSessionCounter();
    }

    private SourceLocation location() {
        return SourceLocation.sourceLocation(line, column, pos);
    }

    private boolean isAtEnd() {
        return pos >= input.length();
    }

    private char peek() {
        return input.charAt(pos);
    }

    private char peek(int offset) {
        return input.charAt(pos + offset);
    }

    private char advance() {
        char c = input.charAt(pos++);
        if (c == '\n') {
            line++;
            column = 1;
        } else {
            column++;
        }
        return c;
    }

    private int remaining() {
        return input.length() - pos;
    }

    private String substring(int start, int end) {
        return input.substring(start, end);
    }

    /**
     * Cleanup F.3: build a StringSpan view over the input without materializing
     * a Java String. Used by match helpers and token boundary capture so the
     * substring is deferred until a consumer actually needs it.
     */
    private StringSpan substringSpan(int start, int end) {
        return new StringSpan(input, start, end);
    }

    private long cacheKey(int ruleId, int position) {
        return ((long) ruleId << 32) | position;
    }

    private void restoreLocation(SourceLocation loc) {
        this.pos = loc.offset();
        this.line = loc.line();
        this.column = loc.column();
    }

    // v0.5.0 phase 1.7 (D): raw-int location restore. Skips
    // SourceLocation allocation in the hot path; called from emission
    // sites that capture (pos,line,column) as int locals at entry.
    private void restoreLocationRaw(int pos, int line, int column) {
        this.pos = pos;
        this.line = line;
        this.column = column;
    }

    private void trackFailure(String expected) {
        if (!furthestFailure.isEmpty()) {
            int furthestOffset = furthestFailure.unwrap().offset();
            if (pos < furthestOffset) return;
            if (pos == furthestOffset) {
                String existing = furthestExpected.or("");
                if (existing.contains(expected)) return;
                furthestExpected = Option.some(
                    existing.isEmpty() ? expected : existing + " or " + expected);
                return;
            }
        }
        furthestFailure = Option.some(location());
        furthestExpected = Option.some(expected);
    }

    // === Public Parse Methods ===

    public Result<CstNode> parse(String input) {
        init(input);
        var result = parse_CompilationUnit();
        if (result.isFailure()) {
            var errorLoc = furthestFailure.or(location());
            var expected = furthestExpected.filter(s -> !s.isEmpty()).or(result.expected.or("valid input"));
            return Result.failure(new ParseError(errorLoc, "expected " + expected));
        }
        var trailingTrivia = skipWhitespace(); // Capture trailing trivia
        if (!isAtEnd()) {
            var errorLoc = furthestFailure.or(location());
            return Result.failure(new ParseError(errorLoc, "unexpected input"));
        }
        // Attach trailing trivia to root node
        var rootNode = attachTrailingTrivia(result.node.unwrap(), trailingTrivia);
                        rootNode = TriviaPostPass.assignTrivia(input, rootNode, 0);
    return Result.success(rootNode);
    }

    /**
     * Parse input and return AST (Abstract Syntax Tree).
     * The AST is a simplified tree without trivia (whitespace/comments).
     */
    public Result<AstNode> parseAst(String input) {
        return parse(input).map(this::toAst);
    }

    private AstNode toAst(CstNode cst) {
        return switch (cst) {
            case CstNode.Terminal t -> new AstNode.Terminal(t.span(), t.rule().name(), t.text());
            case CstNode.Token tok -> new AstNode.Terminal(tok.span(), tok.rule().name(), tok.text());
            case CstNode.NonTerminal nt -> new AstNode.NonTerminal(
                nt.span(), nt.rule().name(),
                nt.children().stream().map(this::toAst).toList()
            );
            default -> new AstNode.Terminal(cst.span(), "error", "");
        };
    }

// === PartialParse (0.3.0) ===

/**
 * Result of a partial parse via
 * {@link #parseRuleAt(Class, String, int)}. Pairs the produced CST
 * subtree with the absolute offset where parsing stopped.
 */
public record PartialParse(CstNode node, int endOffset) {}

// Dispatch table: RuleId marker class -> rule method.
private final Map<Class<? extends RuleId>,
                  Supplier<CstParseResult>> ruleDispatch = buildRuleDispatch();

private Map<Class<? extends RuleId>,
            Supplier<CstParseResult>> buildRuleDispatch() {
    var m = new HashMap<Class<? extends RuleId>,
                        Supplier<CstParseResult>>();
        m.put(RuleId.CompilationUnit.class, this::parse_CompilationUnit);
        m.put(RuleId.OrdinaryUnit.class, this::parse_OrdinaryUnit);
        m.put(RuleId.PackageDecl.class, this::parse_PackageDecl);
        m.put(RuleId.ImportDecl.class, this::parse_ImportDecl);
        m.put(RuleId.ModuleDecl.class, this::parse_ModuleDecl);
        m.put(RuleId.ModuleDirective.class, this::parse_ModuleDirective);
        m.put(RuleId.RequiresDirective.class, this::parse_RequiresDirective);
        m.put(RuleId.ExportsDirective.class, this::parse_ExportsDirective);
        m.put(RuleId.OpensDirective.class, this::parse_OpensDirective);
        m.put(RuleId.UsesDirective.class, this::parse_UsesDirective);
        m.put(RuleId.ProvidesDirective.class, this::parse_ProvidesDirective);
        m.put(RuleId.TypeDecl.class, this::parse_TypeDecl);
        m.put(RuleId.TypeKind.class, this::parse_TypeKind);
        m.put(RuleId.ClassDecl.class, this::parse_ClassDecl);
        m.put(RuleId.InterfaceDecl.class, this::parse_InterfaceDecl);
        m.put(RuleId.AnnotationDecl.class, this::parse_AnnotationDecl);
        m.put(RuleId.ClassKW.class, this::parse_ClassKW);
        m.put(RuleId.InterfaceKW.class, this::parse_InterfaceKW);
        m.put(RuleId.AnnotationBody.class, this::parse_AnnotationBody);
        m.put(RuleId.AnnotationMember.class, this::parse_AnnotationMember);
        m.put(RuleId.AnnotationElemDecl.class, this::parse_AnnotationElemDecl);
        m.put(RuleId.EnumDecl.class, this::parse_EnumDecl);
        m.put(RuleId.RecordDecl.class, this::parse_RecordDecl);
        m.put(RuleId.EnumKW.class, this::parse_EnumKW);
        m.put(RuleId.RecordKW.class, this::parse_RecordKW);
        m.put(RuleId.ImplementsClause.class, this::parse_ImplementsClause);
        m.put(RuleId.PermitsClause.class, this::parse_PermitsClause);
        m.put(RuleId.TypeList.class, this::parse_TypeList);
        m.put(RuleId.TypeParams.class, this::parse_TypeParams);
        m.put(RuleId.TypeParam.class, this::parse_TypeParam);
        m.put(RuleId.ClassBody.class, this::parse_ClassBody);
        m.put(RuleId.ClassMember.class, this::parse_ClassMember);
        m.put(RuleId.Member.class, this::parse_Member);
        m.put(RuleId.InitializerBlock.class, this::parse_InitializerBlock);
        m.put(RuleId.EnumBody.class, this::parse_EnumBody);
        m.put(RuleId.EnumConsts.class, this::parse_EnumConsts);
        m.put(RuleId.EnumConst.class, this::parse_EnumConst);
        m.put(RuleId.RecordComponents.class, this::parse_RecordComponents);
        m.put(RuleId.RecordComp.class, this::parse_RecordComp);
        m.put(RuleId.RecordBody.class, this::parse_RecordBody);
        m.put(RuleId.RecordMember.class, this::parse_RecordMember);
        m.put(RuleId.CompactConstructor.class, this::parse_CompactConstructor);
        m.put(RuleId.FieldDecl.class, this::parse_FieldDecl);
        m.put(RuleId.VarDecls.class, this::parse_VarDecls);
        m.put(RuleId.VarDecl.class, this::parse_VarDecl);
        m.put(RuleId.VarInit.class, this::parse_VarInit);
        m.put(RuleId.MethodDecl.class, this::parse_MethodDecl);
        m.put(RuleId.Params.class, this::parse_Params);
        m.put(RuleId.Param.class, this::parse_Param);
        m.put(RuleId.Throws.class, this::parse_Throws);
        m.put(RuleId.ConstructorDecl.class, this::parse_ConstructorDecl);
        m.put(RuleId.Block.class, this::parse_Block);
        m.put(RuleId.BlockStmt.class, this::parse_BlockStmt);
        m.put(RuleId.LocalTypeDecl.class, this::parse_LocalTypeDecl);
        m.put(RuleId.LocalVar.class, this::parse_LocalVar);
        m.put(RuleId.LocalVarType.class, this::parse_LocalVarType);
        m.put(RuleId.Stmt.class, this::parse_Stmt);
        m.put(RuleId.IfKW.class, this::parse_IfKW);
        m.put(RuleId.WhileKW.class, this::parse_WhileKW);
        m.put(RuleId.ForKW.class, this::parse_ForKW);
        m.put(RuleId.DoKW.class, this::parse_DoKW);
        m.put(RuleId.TryKW.class, this::parse_TryKW);
        m.put(RuleId.SwitchKW.class, this::parse_SwitchKW);
        m.put(RuleId.SynchronizedKW.class, this::parse_SynchronizedKW);
        m.put(RuleId.ReturnKW.class, this::parse_ReturnKW);
        m.put(RuleId.ThrowKW.class, this::parse_ThrowKW);
        m.put(RuleId.BreakKW.class, this::parse_BreakKW);
        m.put(RuleId.ContinueKW.class, this::parse_ContinueKW);
        m.put(RuleId.AssertKW.class, this::parse_AssertKW);
        m.put(RuleId.YieldKW.class, this::parse_YieldKW);
        m.put(RuleId.CatchKW.class, this::parse_CatchKW);
        m.put(RuleId.FinallyKW.class, this::parse_FinallyKW);
        m.put(RuleId.WhenKW.class, this::parse_WhenKW);
        m.put(RuleId.ForCtrl.class, this::parse_ForCtrl);
        m.put(RuleId.ForInit.class, this::parse_ForInit);
        m.put(RuleId.LocalVarNoSemi.class, this::parse_LocalVarNoSemi);
        m.put(RuleId.ResourceSpec.class, this::parse_ResourceSpec);
        m.put(RuleId.Resource.class, this::parse_Resource);
        m.put(RuleId.Catch.class, this::parse_Catch);
        m.put(RuleId.Finally.class, this::parse_Finally);
        m.put(RuleId.SwitchBlock.class, this::parse_SwitchBlock);
        m.put(RuleId.SwitchRule.class, this::parse_SwitchRule);
        m.put(RuleId.SwitchLabel.class, this::parse_SwitchLabel);
        m.put(RuleId.CaseItem.class, this::parse_CaseItem);
        m.put(RuleId.Pattern.class, this::parse_Pattern);
        m.put(RuleId.TypePattern.class, this::parse_TypePattern);
        m.put(RuleId.RecordPattern.class, this::parse_RecordPattern);
        m.put(RuleId.PatternList.class, this::parse_PatternList);
        m.put(RuleId.Guard.class, this::parse_Guard);
        m.put(RuleId.Expr.class, this::parse_Expr);
        m.put(RuleId.Assignment.class, this::parse_Assignment);
        m.put(RuleId.Ternary.class, this::parse_Ternary);
        m.put(RuleId.LogOr.class, this::parse_LogOr);
        m.put(RuleId.LogAnd.class, this::parse_LogAnd);
        m.put(RuleId.BitOr.class, this::parse_BitOr);
        m.put(RuleId.BitXor.class, this::parse_BitXor);
        m.put(RuleId.BitAnd.class, this::parse_BitAnd);
        m.put(RuleId.Equality.class, this::parse_Equality);
        m.put(RuleId.Relational.class, this::parse_Relational);
        m.put(RuleId.Shift.class, this::parse_Shift);
        m.put(RuleId.URShift.class, this::parse_URShift);
        m.put(RuleId.RShift.class, this::parse_RShift);
        m.put(RuleId.LShift.class, this::parse_LShift);
        m.put(RuleId.URShiftAssign.class, this::parse_URShiftAssign);
        m.put(RuleId.RShiftAssign.class, this::parse_RShiftAssign);
        m.put(RuleId.LShiftAssign.class, this::parse_LShiftAssign);
        m.put(RuleId.Additive.class, this::parse_Additive);
        m.put(RuleId.Multiplicative.class, this::parse_Multiplicative);
        m.put(RuleId.Unary.class, this::parse_Unary);
        m.put(RuleId.Postfix.class, this::parse_Postfix);
        m.put(RuleId.PostOp.class, this::parse_PostOp);
        m.put(RuleId.Primary.class, this::parse_Primary);
        m.put(RuleId.TypeExpr.class, this::parse_TypeExpr);
        m.put(RuleId.Lambda.class, this::parse_Lambda);
        m.put(RuleId.LambdaParams.class, this::parse_LambdaParams);
        m.put(RuleId.LambdaParam.class, this::parse_LambdaParam);
        m.put(RuleId.Args.class, this::parse_Args);
        m.put(RuleId.ExprList.class, this::parse_ExprList);
        m.put(RuleId.Type.class, this::parse_Type);
        m.put(RuleId.PrimType.class, this::parse_PrimType);
        m.put(RuleId.RefType.class, this::parse_RefType);
        m.put(RuleId.AnnotatedTypeName.class, this::parse_AnnotatedTypeName);
        m.put(RuleId.Dims.class, this::parse_Dims);
        m.put(RuleId.ArrayType.class, this::parse_ArrayType);
        m.put(RuleId.DimExprs.class, this::parse_DimExprs);
        m.put(RuleId.TypeArgs.class, this::parse_TypeArgs);
        m.put(RuleId.TypeArg.class, this::parse_TypeArg);
        m.put(RuleId.QualifiedName.class, this::parse_QualifiedName);
        m.put(RuleId.Identifier.class, this::parse_Identifier);
        m.put(RuleId.Modifier.class, this::parse_Modifier);
        m.put(RuleId.Annotation.class, this::parse_Annotation);
        m.put(RuleId.AnnotationValue.class, this::parse_AnnotationValue);
        m.put(RuleId.AnnotationElem.class, this::parse_AnnotationElem);
        m.put(RuleId.Literal.class, this::parse_Literal);
        m.put(RuleId.CharLit.class, this::parse_CharLit);
        m.put(RuleId.StringLit.class, this::parse_StringLit);
        m.put(RuleId.NumLit.class, this::parse_NumLit);
        m.put(RuleId.Keyword.class, this::parse_Keyword);
        return Map.copyOf(m);
    }

    /**
     * Parse the rule identified by {@code ruleId} starting at {@code offset}
     * in {@code input}. Unlike {@link #parse(String)}, the matched rule is
     * not required to consume all remaining input   parsing stops when the
     * rule itself finishes, and the returned {@link PartialParse#endOffset()}
     * reports the absolute offset at which it stopped.
     *
     * @since 0.3.0
     */
    public Result<PartialParse> parseRuleAt(
            Class<? extends RuleId> ruleId,
            String input, int offset) {
        if (ruleId == null) {
            return Result.failure(new ParseError(SourceLocation.START, "Rule id class is null"));
        }
        if (input == null) {
            return Result.failure(new ParseError(SourceLocation.START, "Input is null"));
        }
        if (offset < 0 || offset > input.length()) {
            return Result.failure(new ParseError(SourceLocation.START,
                    "Offset " + offset + " out of range [0, " + input.length() + "]"));
        }
        var supplier = ruleDispatch.get(ruleId);
        if (supplier == null) {
            return Result.failure(new ParseError(SourceLocation.START,
                    "Unknown rule for class " + ruleId.getSimpleName()));
        }
        init(input);
        seekTo(offset);
        var result = supplier.get();
        if (result.isFailure()) {
            var errorLoc = furthestFailure.or(location());
            var expected = furthestExpected.filter(s -> !s.isEmpty()).or(result.expected.or("valid input"));
            return Result.failure(new ParseError(errorLoc, "expected " + expected));
        }
        return Result.success(new PartialParse(TriviaPostPass.assignTrivia(input, result.node.unwrap(), offset), pos));
    }

    /**
     * Seek the parsing context to {@code offset}, computing
     * {@code line}/{@code column} from the prefix. Shared by
     * {@link #parseRuleAt(Class, String, int)}.
     */
    private void seekTo(int offset) {
        this.pos = 0;
        this.line = 1;
        this.column = 1;
        for (int i = 0; i < offset; i++) {
            if (input.charAt(i) == '\n') {
                line++;
                column = 1;
            } else {
                column++;
            }
        }
        this.pos = offset;
    }

    // === Rule Parsing Methods ===

    private CstParseResult parse_CompilationUnit() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_COMPILATION_UNIT;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '@':
                case 'm':
                case 'o':
                {
                    result = parse_CompilationUnit_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null || (!result.isSuccess() && !result.isCutFailure())) {
            this.pos = choiceStart0Pos;
            this.line = choiceStart0Line;
            this.column = choiceStart0Column;
            result = null;
            result = parse_CompilationUnit_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
            if (result != null && result.isCutFailure()) result = result.asRegularFailure();
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_COMPILATION_UNIT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_COMPILATION_UNIT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_CompilationUnit_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_COMPILATION_UNIT;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_ModuleDecl();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_CompilationUnit_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_COMPILATION_UNIT;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_OrdinaryUnit();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_OrdinaryUnit() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(1, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ORDINARY_UNIT;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_PackageDecl();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem0_0;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem0_0 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem0_0 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem0_0 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos3 = pos;
            int zomStartLine3 = line;
            int zomStartColumn3 = column;
            var savedChildrenZom3 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos3 = pos;
                int beforeLine3 = line;
                int beforeColumn3 = column;
                int zomIterPending3 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem3 = parse_ImportDecl();
                if (zomElem3.isSuccess() && zomElem3.node.isPresent()) {
                    children.add(zomElem3.node.unwrap());
                }
                if (zomElem3.isCutFailure()) {
                    elem0_1 = zomElem3;
                    break;
                }
                if (zomElem3.isFailure() || pos == beforePos3) {
                    restoreLocationRaw(beforePos3, beforeLine3, beforeColumn3);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom3);
                if (zomChildren3.size() == 1) {
                    children.add(zomChildren3.getFirst());
                } else if (!zomChildren3.isEmpty()) {
                    var zomSpan3 = new SourceSpan(zomStartLine3, zomStartColumn3, zomStartPos3, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan3, __ruleName, zomChildren3, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos3, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom3);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_2 = CstParseResult.successNoLoc(null, "");
            int zomStartPos5 = pos;
            int zomStartLine5 = line;
            int zomStartColumn5 = column;
            var savedChildrenZom5 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos5 = pos;
                int beforeLine5 = line;
                int beforeColumn5 = column;
                int zomIterPending5 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem5 = parse_TypeDecl();
                if (zomElem5.isSuccess() && zomElem5.node.isPresent()) {
                    children.add(zomElem5.node.unwrap());
                }
                if (zomElem5.isCutFailure()) {
                    elem0_2 = zomElem5;
                    break;
                }
                if (zomElem5.isFailure() || pos == beforePos5) {
                    restoreLocationRaw(beforePos5, beforeLine5, beforeColumn5);
                    break;
                }
            }
            if (!elem0_2.isCutFailure()) {
                var zomChildren5 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom5);
                if (zomChildren5.size() == 1) {
                    children.add(zomChildren5.getFirst());
                } else if (!zomChildren5.isEmpty()) {
                    var zomSpan5 = new SourceSpan(zomStartLine5, zomStartColumn5, zomStartPos5, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan5, __ruleName, zomChildren5, List.of(), List.of()));
                }
                elem0_2 = CstParseResult.successNoLoc(null, substring(zomStartPos5, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom5);
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ORDINARY_UNIT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ORDINARY_UNIT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_PackageDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(2, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PACKAGE_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_PackageDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_PackageDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PACKAGE_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PACKAGE_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_PackageDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PACKAGE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = matchLiteralCst("package", false);
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = CstParseResult.successNoLoc(null, "");
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        cut = true;
        return result;
    }

    private CstParseResult parse_PackageDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PACKAGE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_QualifiedName();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(";", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_ImportDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_IMPORT_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_ImportDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ImportDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_IMPORT_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_IMPORT_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ImportDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_IMPORT_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("import", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        return result;
    }

    private CstParseResult parse_ImportDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_IMPORT_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = parse_ImportDecl_choice0(children);
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_ImportDecl_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_IMPORT_DECL;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'm':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos1 = pos;
                    int seqStartLine1 = line;
                    int seqStartColumn1 = column;
                    int seqPending1 = 0;
                    var seqChildren1 = new ArrayList<>(children);
                    boolean cut1 = false;
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_0 = matchLiteralCst("module", false);
                        if (elem1_0.isSuccess() && elem1_0.node.isPresent()) {
                            children.add(elem1_0.node.unwrap());
                        }
                        if (elem1_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_0;
                        } else if (elem1_0.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_1 = parse_QualifiedName();
                        if (elem1_1.isSuccess() && elem1_1.node.isPresent()) {
                            children.add(elem1_1.node.unwrap());
                        }
                        if (elem1_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_1;
                        } else if (elem1_1.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_2 = matchLiteralCst(";", false);
                        if (elem1_2.isSuccess() && elem1_2.node.isPresent()) {
                            children.add(elem1_2.node.unwrap());
                        }
                        if (elem1_2.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_2;
                        } else if (elem1_2.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_2.asCutFailure() : elem1_2;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos5 = pos;
                    int seqStartLine5 = line;
                    int seqStartColumn5 = column;
                    int seqPending5 = 0;
                    var seqChildren5 = new ArrayList<>(children);
                    alt0_1 = parse_ImportDecl_seq1_chunk0(children, seqStartPos5, seqStartLine5, seqStartColumn5, seqPending5, seqChildren5);
                    if (alt0_1.isSuccess()) alt0_1 = parse_ImportDecl_seq1_chunk1(children, seqStartPos5, seqStartLine5, seqStartColumn5, seqPending5, seqChildren5);
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos5, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos6 = pos;
                    int seqStartLine6 = line;
                    int seqStartColumn6 = column;
                    int seqPending6 = 0;
                    var seqChildren6 = new ArrayList<>(children);
                    alt0_1 = parse_ImportDecl_seq2_chunk0(children, seqStartPos6, seqStartLine6, seqStartColumn6, seqPending6, seqChildren6);
                    if (alt0_1.isSuccess()) alt0_1 = parse_ImportDecl_seq2_chunk1(children, seqStartPos6, seqStartLine6, seqStartColumn6, seqPending6, seqChildren6);
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos6, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_ImportDecl_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_IMPORT_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = matchLiteralCst("static", false);
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_0;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_0 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_QualifiedName();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_ImportDecl_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_IMPORT_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst(".", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = matchLiteralCst("*", false);
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(";", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_ImportDecl_seq2_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_IMPORT_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = matchLiteralCst("static", false);
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_0;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_0 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_QualifiedName();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_ImportDecl_seq2_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_IMPORT_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst(".", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = matchLiteralCst("*", false);
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(";", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_ModuleDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(4, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_MODULE_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_ModuleDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ModuleDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ModuleDecl_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_MODULE_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_MODULE_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ModuleDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_MODULE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = matchLiteralCst("open", false);
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem_1;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_1 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem_1 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("module", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_ModuleDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_MODULE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = CstParseResult.successNoLoc(null, "");
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = parse_QualifiedName();
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = matchLiteralCst("{", false);
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_ModuleDecl_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_MODULE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_6 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_ModuleDirective();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_6 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_6.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_6 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_7 = matchLiteralCst("}", false);
            if (elem_7.isSuccess() && elem_7.node.isPresent()) {
                children.add(elem_7.node.unwrap());
            }
            if (elem_7.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_7;
            } else if (elem_7.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_7.asCutFailure() : elem_7;
            }
        }
        return result;
    }

    private CstParseResult parse_ModuleDirective() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_MODULE_DIRECTIVE;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'r':
                {
                    result = parse_ModuleDirective_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'e':
                {
                    result = parse_ModuleDirective_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'o':
                {
                    result = parse_ModuleDirective_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'u':
                {
                    result = parse_ModuleDirective_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'p':
                {
                    result = parse_ModuleDirective_alt4(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_MODULE_DIRECTIVE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_MODULE_DIRECTIVE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ModuleDirective_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MODULE_DIRECTIVE;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_RequiresDirective();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_ModuleDirective_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MODULE_DIRECTIVE;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_ExportsDirective();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_ModuleDirective_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MODULE_DIRECTIVE;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = parse_OpensDirective();
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_ModuleDirective_alt3(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MODULE_DIRECTIVE;
        children.clear();
        children.addAll(childrenState);
        var alt0_3 = parse_UsesDirective();
        if (alt0_3.isSuccess() && alt0_3.node.isPresent()) {
            children.add(alt0_3.node.unwrap());
        }
        if (alt0_3.isSuccess()) {
            return alt0_3;
        }
        if (alt0_3.isCutFailure()) {
            return alt0_3;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_3;
    }

    private CstParseResult parse_ModuleDirective_alt4(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MODULE_DIRECTIVE;
        children.clear();
        children.addAll(childrenState);
        var alt0_4 = parse_ProvidesDirective();
        if (alt0_4.isSuccess() && alt0_4.node.isPresent()) {
            children.add(alt0_4.node.unwrap());
        }
        if (alt0_4.isSuccess()) {
            return alt0_4;
        }
        if (alt0_4.isCutFailure()) {
            return alt0_4;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_4;
    }

    private CstParseResult parse_RequiresDirective() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(6, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_REQUIRES_DIRECTIVE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_RequiresDirective_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_RequiresDirective_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_RequiresDirective_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_REQUIRES_DIRECTIVE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_REQUIRES_DIRECTIVE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_RequiresDirective_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_REQUIRES_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("requires", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        return result;
    }

    private CstParseResult parse_RequiresDirective_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_REQUIRES_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = null;
                int choiceStart2Pos = pos;
                int choiceStart2Line = line;
                int choiceStart2Column = column;
                int choicePending2 = 0;
                var savedChildren2 = new ArrayList<>(children);
                if (pos < input.length()) {
                    char dispatchChar2 = input.charAt(pos);
                    switch (dispatchChar2) {
                        case 't':
                        {
                            children.clear();
                            children.addAll(savedChildren2);
                            var alt2_0 = matchLiteralCst("transitive", false);
                            if (alt2_0.isSuccess() && alt2_0.node.isPresent()) {
                                children.add(alt2_0.node.unwrap());
                            }
                            if (alt2_0.isSuccess()) {
                                zomElem0 = alt2_0;
                            } else if (alt2_0.isCutFailure()) {
                                zomElem0 = alt2_0.asRegularFailure();
                            } else {
                                restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                            }
                            break;
                        }
                        case 's':
                        {
                            children.clear();
                            children.addAll(savedChildren2);
                            var alt2_1 = matchLiteralCst("static", false);
                            if (alt2_1.isSuccess() && alt2_1.node.isPresent()) {
                                children.add(alt2_1.node.unwrap());
                            }
                            if (alt2_1.isSuccess()) {
                                zomElem0 = alt2_1;
                            } else if (alt2_1.isCutFailure()) {
                                zomElem0 = alt2_1.asRegularFailure();
                            } else {
                                restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                            }
                            break;
                        }
                    }
                }
                if (zomElem0 == null) {
                    children.clear();
                    children.addAll(savedChildren2);
                    zomElem0 = CstParseResult.failure("one of alternatives");
                }
                if (zomElem0.isCutFailure()) {
                    elem_2 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_2.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_2 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_RequiresDirective_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_REQUIRES_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_QualifiedName();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(";", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_ExportsDirective() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(7, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_EXPORTS_DIRECTIVE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_ExportsDirective_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ExportsDirective_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ExportsDirective_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_EXPORTS_DIRECTIVE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_EXPORTS_DIRECTIVE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ExportsDirective_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_EXPORTS_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("exports", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_QualifiedName();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_ExportsDirective_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_EXPORTS_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("to", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = parse_QualifiedName();
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult elem2_2 = CstParseResult.successNoLoc(null, "");
                int zomStartPos5 = pos;
                int zomStartLine5 = line;
                int zomStartColumn5 = column;
                var savedChildrenZom5 = new ArrayList<>(children);
                children.clear();
                while (true) {
                    int beforePos5 = pos;
                    int beforeLine5 = line;
                    int beforeColumn5 = column;
                    int zomIterPending5 = 0;
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    CstParseResult zomElem5 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos7 = pos;
                    int seqStartLine7 = line;
                    int seqStartColumn7 = column;
                    int seqPending7 = 0;
                    var seqChildren7 = new ArrayList<>(children);
                    boolean cut7 = false;
                    if (zomElem5.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_0 = matchLiteralCst(",", false);
                        if (elem7_0.isSuccess() && elem7_0.node.isPresent()) {
                            children.add(elem7_0.node.unwrap());
                        }
                        if (elem7_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = elem7_0;
                        } else if (elem7_0.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = cut7 ? elem7_0.asCutFailure() : elem7_0;
                        }
                    }
                    if (zomElem5.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_1 = parse_QualifiedName();
                        if (elem7_1.isSuccess() && elem7_1.node.isPresent()) {
                            children.add(elem7_1.node.unwrap());
                        }
                        if (elem7_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = elem7_1;
                        } else if (elem7_1.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = cut7 ? elem7_1.asCutFailure() : elem7_1;
                        }
                    }
                    if (zomElem5.isSuccess()) {
                        zomElem5 = CstParseResult.successNoLoc(null, substring(seqStartPos7, pos));
                    }
                    if (zomElem5.isCutFailure()) {
                        elem2_2 = zomElem5;
                        break;
                    }
                    if (zomElem5.isFailure() || pos == beforePos5) {
                        restoreLocationRaw(beforePos5, beforeLine5, beforeColumn5);
                        break;
                    }
                }
                if (!elem2_2.isCutFailure()) {
                    var zomChildren5 = new ArrayList<>(children);
                    children.clear();
                    children.addAll(savedChildrenZom5);
                    if (zomChildren5.size() == 1) {
                        children.add(zomChildren5.getFirst());
                    } else if (!zomChildren5.isEmpty()) {
                        var zomSpan5 = new SourceSpan(zomStartLine5, zomStartColumn5, zomStartPos5, line, column, pos);
                        children.add(new CstNode.NonTerminal(idGen.next(), zomSpan5, __ruleName, zomChildren5, List.of(), List.of()));
                    }
                    elem2_2 = CstParseResult.successNoLoc(null, substring(zomStartPos5, pos));
                } else {
                    children.clear();
                    children.addAll(savedChildrenZom5);
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_ExportsDirective_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_EXPORTS_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(";", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_OpensDirective() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(8, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_OPENS_DIRECTIVE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_OpensDirective_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_OpensDirective_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_OpensDirective_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_OPENS_DIRECTIVE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_OPENS_DIRECTIVE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_OpensDirective_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_OPENS_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("opens", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_QualifiedName();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_OpensDirective_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_OPENS_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("to", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = parse_QualifiedName();
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult elem2_2 = CstParseResult.successNoLoc(null, "");
                int zomStartPos5 = pos;
                int zomStartLine5 = line;
                int zomStartColumn5 = column;
                var savedChildrenZom5 = new ArrayList<>(children);
                children.clear();
                while (true) {
                    int beforePos5 = pos;
                    int beforeLine5 = line;
                    int beforeColumn5 = column;
                    int zomIterPending5 = 0;
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    CstParseResult zomElem5 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos7 = pos;
                    int seqStartLine7 = line;
                    int seqStartColumn7 = column;
                    int seqPending7 = 0;
                    var seqChildren7 = new ArrayList<>(children);
                    boolean cut7 = false;
                    if (zomElem5.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_0 = matchLiteralCst(",", false);
                        if (elem7_0.isSuccess() && elem7_0.node.isPresent()) {
                            children.add(elem7_0.node.unwrap());
                        }
                        if (elem7_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = elem7_0;
                        } else if (elem7_0.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = cut7 ? elem7_0.asCutFailure() : elem7_0;
                        }
                    }
                    if (zomElem5.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_1 = parse_QualifiedName();
                        if (elem7_1.isSuccess() && elem7_1.node.isPresent()) {
                            children.add(elem7_1.node.unwrap());
                        }
                        if (elem7_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = elem7_1;
                        } else if (elem7_1.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = cut7 ? elem7_1.asCutFailure() : elem7_1;
                        }
                    }
                    if (zomElem5.isSuccess()) {
                        zomElem5 = CstParseResult.successNoLoc(null, substring(seqStartPos7, pos));
                    }
                    if (zomElem5.isCutFailure()) {
                        elem2_2 = zomElem5;
                        break;
                    }
                    if (zomElem5.isFailure() || pos == beforePos5) {
                        restoreLocationRaw(beforePos5, beforeLine5, beforeColumn5);
                        break;
                    }
                }
                if (!elem2_2.isCutFailure()) {
                    var zomChildren5 = new ArrayList<>(children);
                    children.clear();
                    children.addAll(savedChildrenZom5);
                    if (zomChildren5.size() == 1) {
                        children.add(zomChildren5.getFirst());
                    } else if (!zomChildren5.isEmpty()) {
                        var zomSpan5 = new SourceSpan(zomStartLine5, zomStartColumn5, zomStartPos5, line, column, pos);
                        children.add(new CstNode.NonTerminal(idGen.next(), zomSpan5, __ruleName, zomChildren5, List.of(), List.of()));
                    }
                    elem2_2 = CstParseResult.successNoLoc(null, substring(zomStartPos5, pos));
                } else {
                    children.clear();
                    children.addAll(savedChildrenZom5);
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_OpensDirective_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_OPENS_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(";", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_UsesDirective() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_USES_DIRECTIVE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("uses", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = CstParseResult.successNoLoc(null, "");
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        cut0 = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_QualifiedName();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_3 = matchLiteralCst(";", false);
            if (elem0_3.isSuccess() && elem0_3.node.isPresent()) {
                children.add(elem0_3.node.unwrap());
            }
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_USES_DIRECTIVE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_USES_DIRECTIVE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ProvidesDirective() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(10, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PROVIDES_DIRECTIVE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_ProvidesDirective_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ProvidesDirective_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ProvidesDirective_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PROVIDES_DIRECTIVE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PROVIDES_DIRECTIVE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ProvidesDirective_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PROVIDES_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("provides", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_QualifiedName();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_ProvidesDirective_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PROVIDES_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst("with", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = parse_QualifiedName();
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_5 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_QualifiedName();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem_5 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_5.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_5 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_ProvidesDirective_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PROVIDES_DIRECTIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_6 = matchLiteralCst(";", false);
            if (elem_6.isSuccess() && elem_6.node.isPresent()) {
                children.add(elem_6.node.unwrap());
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(11, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = parse_Annotation();
                if (zomElem1.isSuccess() && zomElem1.node.isPresent()) {
                    children.add(zomElem1.node.unwrap());
                }
                if (zomElem1.isCutFailure()) {
                    elem0_0 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem0_0.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem0_0 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos3 = pos;
            int zomStartLine3 = line;
            int zomStartColumn3 = column;
            var savedChildrenZom3 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos3 = pos;
                int beforeLine3 = line;
                int beforeColumn3 = column;
                int zomIterPending3 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem3 = parse_Modifier();
                if (zomElem3.isSuccess() && zomElem3.node.isPresent()) {
                    children.add(zomElem3.node.unwrap());
                }
                if (zomElem3.isCutFailure()) {
                    elem0_1 = zomElem3;
                    break;
                }
                if (zomElem3.isFailure() || pos == beforePos3) {
                    restoreLocationRaw(beforePos3, beforeLine3, beforeColumn3);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom3);
                if (zomChildren3.size() == 1) {
                    children.add(zomChildren3.getFirst());
                } else if (!zomChildren3.isEmpty()) {
                    var zomSpan3 = new SourceSpan(zomStartLine3, zomStartColumn3, zomStartPos3, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan3, __ruleName, zomChildren3, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos3, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom3);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_TypeKind();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_TypeKind() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(12, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_KIND;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'c':
                {
                    result = parse_TypeKind_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'i':
                {
                    result = parse_TypeKind_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'e':
                {
                    result = parse_TypeKind_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'r':
                {
                    result = parse_TypeKind_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '@':
                {
                    result = parse_TypeKind_alt4(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_KIND, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_KIND, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_TypeKind_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_KIND;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_ClassDecl();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_TypeKind_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_KIND;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_InterfaceDecl();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_TypeKind_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_KIND;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = parse_EnumDecl();
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_TypeKind_alt3(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_KIND;
        children.clear();
        children.addAll(childrenState);
        var alt0_3 = parse_RecordDecl();
        if (alt0_3.isSuccess() && alt0_3.node.isPresent()) {
            children.add(alt0_3.node.unwrap());
        }
        if (alt0_3.isSuccess()) {
            return alt0_3;
        }
        if (alt0_3.isCutFailure()) {
            return alt0_3;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_3;
    }

    private CstParseResult parse_TypeKind_alt4(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_KIND;
        children.clear();
        children.addAll(childrenState);
        var alt0_4 = parse_AnnotationDecl();
        if (alt0_4.isSuccess() && alt0_4.node.isPresent()) {
            children.add(alt0_4.node.unwrap());
        }
        if (alt0_4.isSuccess()) {
            return alt0_4;
        }
        if (alt0_4.isCutFailure()) {
            return alt0_4;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_4;
    }

    private CstParseResult parse_ClassDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CLASS_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_ClassDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ClassDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ClassDecl_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ClassDecl_seq0_chunk3(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CLASS_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CLASS_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ClassDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CLASS_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_ClassKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Identifier();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_ClassDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CLASS_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_TypeParams();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_ClassDecl_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CLASS_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("extends", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = parse_Type();
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_4;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_4 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_4 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_4 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_ClassDecl_seq0_chunk3(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CLASS_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_ImplementsClause();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_5;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_5 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_5 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_5 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = parse_PermitsClause();
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem_6;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_6 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem_6 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_6 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_7 = parse_ClassBody();
            if (elem_7.isSuccess() && elem_7.node.isPresent()) {
                children.add(elem_7.node.unwrap());
            }
            if (elem_7.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_7;
            } else if (elem_7.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_7.asCutFailure() : elem_7;
            }
        }
        return result;
    }

    private CstParseResult parse_InterfaceDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_INTERFACE_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_InterfaceDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_InterfaceDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_InterfaceDecl_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_InterfaceDecl_seq0_chunk3(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_INTERFACE_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_INTERFACE_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_InterfaceDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_INTERFACE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_InterfaceKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Identifier();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_InterfaceDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_INTERFACE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_TypeParams();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_InterfaceDecl_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_INTERFACE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("extends", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = parse_TypeList();
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_4;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_4 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_4 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_4 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_InterfaceDecl_seq0_chunk3(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_INTERFACE_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_PermitsClause();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_5;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_5 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_5 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_5 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_6 = parse_ClassBody();
            if (elem_6.isSuccess() && elem_6.node.isPresent()) {
                children.add(elem_6.node.unwrap());
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ANNOTATION_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_AnnotationDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_AnnotationDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ANNOTATION_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ANNOTATION_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_AnnotationDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("@", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_InterfaceKW();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = CstParseResult.successNoLoc(null, "");
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        cut = true;
        return result;
    }

    private CstParseResult parse_AnnotationDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Identifier();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = parse_AnnotationBody();
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_ClassKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CLASS_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("class", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CLASS_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CLASS_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_InterfaceKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(17, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_INTERFACE_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("interface", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_INTERFACE_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_INTERFACE_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_AnnotationBody() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(18, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ANNOTATION_BODY;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("{", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_AnnotationMember();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst("}", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ANNOTATION_BODY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ANNOTATION_BODY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_AnnotationMember() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(19, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ANNOTATION_MEMBER;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_AnnotationMember_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case ';':
                {
                    result = parse_AnnotationMember_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ANNOTATION_MEMBER, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ANNOTATION_MEMBER, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_AnnotationMember_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_ANNOTATION_MEMBER;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_AnnotationMember_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_AnnotationMember_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_AnnotationMember_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_ANNOTATION_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = matchLiteralCst(";", false);
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_AnnotationMember_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_MEMBER;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_Modifier();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationMember_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_MEMBER;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case '$':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case '_':
                    case 'a':
                    case 'b':
                    case 'd':
                    case 'f':
                    case 'g':
                    case 'h':
                    case 'j':
                    case 'k':
                    case 'l':
                    case 'm':
                    case 'n':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 's':
                    case 't':
                    case 'u':
                    case 'v':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = parse_AnnotationElemDecl();
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_2 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_2 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_FieldDecl();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_2 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_2 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                    case '@':
                    case 'c':
                    case 'e':
                    case 'i':
                    case 'r':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = parse_AnnotationElemDecl();
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_2 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_2 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_FieldDecl();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_2 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_2 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_2 = parse_TypeKind();
                        if (alt1_2.isSuccess() && alt1_2.node.isPresent()) {
                            children.add(alt1_2.node.unwrap());
                        }
                        if (alt1_2.isSuccess()) {
                            elem_2 = alt1_2;
                        } else if (alt1_2.isCutFailure()) {
                            elem_2 = alt1_2.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        }
                        break;
                    }
                }
            }
            if (elem_2 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_2 = CstParseResult.failure("one of alternatives");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationElemDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ANNOTATION_ELEM_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_AnnotationElemDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_AnnotationElemDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ANNOTATION_ELEM_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ANNOTATION_ELEM_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_AnnotationElemDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_ELEM_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Type();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Identifier();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("(", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationElemDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_ELEM_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(")", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem1 = CstParseResult.successNoLoc(null, "");
            int seqStartPos3 = pos;
            int seqStartLine3 = line;
            int seqStartColumn3 = column;
            int seqPending3 = 0;
            var seqChildren3 = new ArrayList<>(children);
            boolean cut3 = false;
            if (optElem1.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem3_0 = matchLiteralCst("default", false);
                if (elem3_0.isSuccess() && elem3_0.node.isPresent()) {
                    children.add(elem3_0.node.unwrap());
                }
                if (elem3_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                    children.clear();
                    children.addAll(seqChildren3);
                    optElem1 = elem3_0;
                } else if (elem3_0.isFailure()) {
                    restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                    children.clear();
                    children.addAll(seqChildren3);
                    optElem1 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                }
            }
            if (optElem1.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem3_1 = parse_AnnotationElem();
                if (elem3_1.isSuccess() && elem3_1.node.isPresent()) {
                    children.add(elem3_1.node.unwrap());
                }
                if (elem3_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                    children.clear();
                    children.addAll(seqChildren3);
                    optElem1 = elem3_1;
                } else if (elem3_1.isFailure()) {
                    restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                    children.clear();
                    children.addAll(seqChildren3);
                    optElem1 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                }
            }
            if (optElem1.isSuccess()) {
                optElem1 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
            }
            CstParseResult elem_4;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_4 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_4 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_4 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = matchLiteralCst(";", false);
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ENUM_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_EnumDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_EnumDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ENUM_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ENUM_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_EnumDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_EnumKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Identifier();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_ImplementsClause();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = parse_EnumBody();
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_RecordDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RECORD_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_RecordDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_RecordDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_RecordDecl_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_RecordDecl_seq0_chunk3(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_RecordDecl_seq0_chunk4(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RECORD_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RECORD_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_RecordDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RECORD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_RecordKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_RecordDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RECORD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int andStartPos0 = pos;
            int andStartLine0 = line;
            int andStartColumn0 = column;
            var savedChildrenAnd0 = new ArrayList<>(children);
            CstParseResult andElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            boolean cut2 = false;
            if (andElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = parse_Identifier();
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (andElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                int optStartPos4 = pos;
                int optStartLine4 = line;
                int optStartColumn4 = column;
                int optPending4 = 0;
                var optElem4 = parse_TypeParams();
                CstParseResult elem2_1;
                if (optElem4.isCutFailure()) {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    elem2_1 = optElem4;
                } else if (optElem4.isSuccess()) {
                    elem2_1 = optElem4;
                } else {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    elem2_1 = CstParseResult.successNoLoc(null, "");
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (andElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_2 = matchLiteralCst("(", false);
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (andElem0.isSuccess()) {
                andElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            restoreLocationRaw(andStartPos0, andStartLine0, andStartColumn0);
            children.clear();
            children.addAll(savedChildrenAnd0);
            var elem_1 = andElem0.isSuccess() ? CstParseResult.successNoLoc(null, "") : andElem0;
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_RecordDecl_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RECORD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Identifier();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = CstParseResult.successNoLoc(null, "");
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = parse_TypeParams();
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem_4;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_4 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem_4 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_4 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_RecordDecl_seq0_chunk3(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RECORD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = matchLiteralCst("(", false);
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_RecordComponents();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_6;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_6 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_6 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_6 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_7 = matchLiteralCst(")", false);
            if (elem_7.isSuccess() && elem_7.node.isPresent()) {
                children.add(elem_7.node.unwrap());
            }
            if (elem_7.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_7;
            } else if (elem_7.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_7.asCutFailure() : elem_7;
            }
        }
        return result;
    }

    private CstParseResult parse_RecordDecl_seq0_chunk4(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RECORD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_ImplementsClause();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_8;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_8 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_8 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_8 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_8.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_8;
            } else if (elem_8.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_8.asCutFailure() : elem_8;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_9 = parse_RecordBody();
            if (elem_9.isSuccess() && elem_9.node.isPresent()) {
                children.add(elem_9.node.unwrap());
            }
            if (elem_9.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_9;
            } else if (elem_9.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_9.asCutFailure() : elem_9;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ENUM_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("enum", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ENUM_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ENUM_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_RecordKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RECORD_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("record", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RECORD_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RECORD_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ImplementsClause() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(25, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_IMPLEMENTS_CLAUSE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("implements", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = CstParseResult.successNoLoc(null, "");
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        cut0 = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_TypeList();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_IMPLEMENTS_CLAUSE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_IMPLEMENTS_CLAUSE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_PermitsClause() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(26, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PERMITS_CLAUSE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("permits", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = CstParseResult.successNoLoc(null, "");
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        cut0 = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_TypeList();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PERMITS_CLAUSE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PERMITS_CLAUSE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_TypeList() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(27, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_LIST;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Type();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_Type();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_LIST, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_LIST, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_TypeParams() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(28, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_PARAMS;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_TypeParams_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_TypeParams_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_PARAMS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_PARAMS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_TypeParams_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_PARAMS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("<", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_TypeParam();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_TypeParam();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem_2 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_2.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_2 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeParams_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_PARAMS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(">", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeParam() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(29, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_PARAM;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_TypeParam_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_TypeParam_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_PARAM, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_PARAM, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_TypeParam_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Identifier();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeParam_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("extends", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = parse_Type();
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult elem2_2 = CstParseResult.successNoLoc(null, "");
                int zomStartPos5 = pos;
                int zomStartLine5 = line;
                int zomStartColumn5 = column;
                var savedChildrenZom5 = new ArrayList<>(children);
                children.clear();
                while (true) {
                    int beforePos5 = pos;
                    int beforeLine5 = line;
                    int beforeColumn5 = column;
                    int zomIterPending5 = 0;
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    CstParseResult zomElem5 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos7 = pos;
                    int seqStartLine7 = line;
                    int seqStartColumn7 = column;
                    int seqPending7 = 0;
                    var seqChildren7 = new ArrayList<>(children);
                    boolean cut7 = false;
                    if (zomElem5.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_0 = matchLiteralCst("&", false);
                        if (elem7_0.isSuccess() && elem7_0.node.isPresent()) {
                            children.add(elem7_0.node.unwrap());
                        }
                        if (elem7_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = elem7_0;
                        } else if (elem7_0.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = cut7 ? elem7_0.asCutFailure() : elem7_0;
                        }
                    }
                    if (zomElem5.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_1 = parse_Type();
                        if (elem7_1.isSuccess() && elem7_1.node.isPresent()) {
                            children.add(elem7_1.node.unwrap());
                        }
                        if (elem7_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = elem7_1;
                        } else if (elem7_1.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            zomElem5 = cut7 ? elem7_1.asCutFailure() : elem7_1;
                        }
                    }
                    if (zomElem5.isSuccess()) {
                        zomElem5 = CstParseResult.successNoLoc(null, substring(seqStartPos7, pos));
                    }
                    if (zomElem5.isCutFailure()) {
                        elem2_2 = zomElem5;
                        break;
                    }
                    if (zomElem5.isFailure() || pos == beforePos5) {
                        restoreLocationRaw(beforePos5, beforeLine5, beforeColumn5);
                        break;
                    }
                }
                if (!elem2_2.isCutFailure()) {
                    var zomChildren5 = new ArrayList<>(children);
                    children.clear();
                    children.addAll(savedChildrenZom5);
                    if (zomChildren5.size() == 1) {
                        children.add(zomChildren5.getFirst());
                    } else if (!zomChildren5.isEmpty()) {
                        var zomSpan5 = new SourceSpan(zomStartLine5, zomStartColumn5, zomStartPos5, line, column, pos);
                        children.add(new CstNode.NonTerminal(idGen.next(), zomSpan5, __ruleName, zomChildren5, List.of(), List.of()));
                    }
                    elem2_2 = CstParseResult.successNoLoc(null, substring(zomStartPos5, pos));
                } else {
                    children.clear();
                    children.addAll(savedChildrenZom5);
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_1;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_1 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_ClassBody() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(30, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CLASS_BODY;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("{", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_ClassMember();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst("}", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CLASS_BODY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CLASS_BODY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ClassMember() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(31, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CLASS_MEMBER;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case '<':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_ClassMember_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 's':
                {
                    result = parse_ClassMember_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_ClassMember_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '{':
                {
                    result = parse_ClassMember_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case ';':
                {
                    result = parse_ClassMember_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CLASS_MEMBER, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CLASS_MEMBER, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ClassMember_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_CLASS_MEMBER;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = parse_Annotation();
                if (zomElem1.isSuccess() && zomElem1.node.isPresent()) {
                    children.add(zomElem1.node.unwrap());
                }
                if (zomElem1.isCutFailure()) {
                    elem0_0 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem0_0.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem0_0 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos3 = pos;
            int zomStartLine3 = line;
            int zomStartColumn3 = column;
            var savedChildrenZom3 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos3 = pos;
                int beforeLine3 = line;
                int beforeColumn3 = column;
                int zomIterPending3 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem3 = parse_Modifier();
                if (zomElem3.isSuccess() && zomElem3.node.isPresent()) {
                    children.add(zomElem3.node.unwrap());
                }
                if (zomElem3.isCutFailure()) {
                    elem0_1 = zomElem3;
                    break;
                }
                if (zomElem3.isFailure() || pos == beforePos3) {
                    restoreLocationRaw(beforePos3, beforeLine3, beforeColumn3);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom3);
                if (zomChildren3.size() == 1) {
                    children.add(zomChildren3.getFirst());
                } else if (!zomChildren3.isEmpty()) {
                    var zomSpan3 = new SourceSpan(zomStartLine3, zomStartColumn3, zomStartPos3, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan3, __ruleName, zomChildren3, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos3, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom3);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_Member();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_ClassMember_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_CLASS_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_InitializerBlock();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_ClassMember_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_CLASS_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = matchLiteralCst(";", false);
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_Member() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_MEMBER;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'd':
                case 'f':
                case 'g':
                case 'h':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_Member_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Member_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Member_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '<':
                {
                    result = parse_Member_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Member_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'c':
                case 'e':
                case 'i':
                case 'r':
                {
                    result = parse_Member_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Member_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Member_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Member_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '@':
                {
                    result = parse_Member_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Member_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Member_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_MEMBER, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_MEMBER, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_Member_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_ConstructorDecl();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_Member_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_TypeKind();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_Member_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = parse_MethodDecl();
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_Member_alt3(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_3 = parse_FieldDecl();
        if (alt0_3.isSuccess() && alt0_3.node.isPresent()) {
            children.add(alt0_3.node.unwrap());
        }
        if (alt0_3.isSuccess()) {
            return alt0_3;
        }
        if (alt0_3.isCutFailure()) {
            return alt0_3;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_3;
    }

    private CstParseResult parse_InitializerBlock() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_INITIALIZER_BLOCK;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = matchLiteralCst("static", false);
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem0_0;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem0_0 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem0_0 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem0_0 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Block();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_INITIALIZER_BLOCK, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_INITIALIZER_BLOCK, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_EnumBody() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(34, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ENUM_BODY;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_EnumBody_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_EnumBody_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_EnumBody_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ENUM_BODY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ENUM_BODY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_EnumBody_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_BODY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("{", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_EnumConsts();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_1;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_1 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumBody_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_BODY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst(";", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult elem2_1 = CstParseResult.successNoLoc(null, "");
                int zomStartPos4 = pos;
                int zomStartLine4 = line;
                int zomStartColumn4 = column;
                var savedChildrenZom4 = new ArrayList<>(children);
                children.clear();
                while (true) {
                    int beforePos4 = pos;
                    int beforeLine4 = line;
                    int beforeColumn4 = column;
                    int zomIterPending4 = 0;
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var zomElem4 = parse_ClassMember();
                    if (zomElem4.isSuccess() && zomElem4.node.isPresent()) {
                        children.add(zomElem4.node.unwrap());
                    }
                    if (zomElem4.isCutFailure()) {
                        elem2_1 = zomElem4;
                        break;
                    }
                    if (zomElem4.isFailure() || pos == beforePos4) {
                        restoreLocationRaw(beforePos4, beforeLine4, beforeColumn4);
                        break;
                    }
                }
                if (!elem2_1.isCutFailure()) {
                    var zomChildren4 = new ArrayList<>(children);
                    children.clear();
                    children.addAll(savedChildrenZom4);
                    if (zomChildren4.size() == 1) {
                        children.add(zomChildren4.getFirst());
                    } else if (!zomChildren4.isEmpty()) {
                        var zomSpan4 = new SourceSpan(zomStartLine4, zomStartColumn4, zomStartPos4, line, column, pos);
                        children.add(new CstNode.NonTerminal(idGen.next(), zomSpan4, __ruleName, zomChildren4, List.of(), List.of()));
                    }
                    elem2_1 = CstParseResult.successNoLoc(null, substring(zomStartPos4, pos));
                } else {
                    children.clear();
                    children.addAll(savedChildrenZom4);
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumBody_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_BODY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst("}", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumConsts() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(35, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ENUM_CONSTS;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_EnumConsts_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_EnumConsts_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ENUM_CONSTS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ENUM_CONSTS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_EnumConsts_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_CONSTS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_EnumConst();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem1 = CstParseResult.successNoLoc(null, "");
                int seqStartPos3 = pos;
                int seqStartLine3 = line;
                int seqStartColumn3 = column;
                int seqPending3 = 0;
                var seqChildren3 = new ArrayList<>(children);
                boolean cut3 = false;
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_0 = matchLiteralCst(",", false);
                    if (elem3_0.isSuccess() && elem3_0.node.isPresent()) {
                        children.add(elem3_0.node.unwrap());
                    }
                    if (elem3_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_0;
                    } else if (elem3_0.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                    }
                }
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_1 = parse_EnumConst();
                    if (elem3_1.isSuccess() && elem3_1.node.isPresent()) {
                        children.add(elem3_1.node.unwrap());
                    }
                    if (elem3_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_1;
                    } else if (elem3_1.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                    }
                }
                if (zomElem1.isSuccess()) {
                    zomElem1 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
                }
                if (zomElem1.isCutFailure()) {
                    elem_1 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumConsts_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_CONSTS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = matchLiteralCst(",", false);
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumConst() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(36, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ENUM_CONST;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_EnumConst_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_EnumConst_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_EnumConst_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ENUM_CONST, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ENUM_CONST, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_EnumConst_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_CONST;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Identifier();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumConst_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_CONST;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("(", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                int optStartPos4 = pos;
                int optStartLine4 = line;
                int optStartColumn4 = column;
                int optPending4 = 0;
                var savedChildrenOpt4 = new ArrayList<>(children);
                children.clear();
                var optElem4 = parse_Args();
                if (optElem4.isSuccess() && optElem4.node.isPresent()) {
                    children.add(optElem4.node.unwrap());
                }
                CstParseResult elem2_1;
                if (optElem4.isCutFailure()) {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    elem2_1 = optElem4;
                } else if (optElem4.isSuccess()) {
                    var optChildren4 = new ArrayList<>(children);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    children.addAll(optChildren4);
                    elem2_1 = optElem4;
                } else {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    elem2_1 = CstParseResult.successNoLoc(null, "");
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_2 = matchLiteralCst(")", false);
                if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                    children.add(elem2_2.node.unwrap());
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_EnumConst_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ENUM_CONST;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_ClassBody();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_RecordComponents() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(37, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RECORD_COMPONENTS;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_RecordComp();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_RecordComp();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RECORD_COMPONENTS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RECORD_COMPONENTS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_RecordComp() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(38, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RECORD_COMP;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = parse_Annotation();
                if (zomElem1.isSuccess() && zomElem1.node.isPresent()) {
                    children.add(zomElem1.node.unwrap());
                }
                if (zomElem1.isCutFailure()) {
                    elem0_0 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem0_0.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem0_0 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Type();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_Identifier();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RECORD_COMP, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RECORD_COMP, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_RecordBody() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(39, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RECORD_BODY;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("{", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_RecordMember();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst("}", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RECORD_BODY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RECORD_BODY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_RecordMember() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RECORD_MEMBER;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_RecordMember_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_RecordMember_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case ';':
                case '<':
                case '{':
                {
                    result = parse_RecordMember_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RECORD_MEMBER, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RECORD_MEMBER, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_RecordMember_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_RECORD_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_CompactConstructor();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_RecordMember_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_RECORD_MEMBER;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_ClassMember();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_CompactConstructor() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(41, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_COMPACT_CONSTRUCTOR;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = parse_Annotation();
                if (zomElem1.isSuccess() && zomElem1.node.isPresent()) {
                    children.add(zomElem1.node.unwrap());
                }
                if (zomElem1.isCutFailure()) {
                    elem0_0 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem0_0.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem0_0 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos3 = pos;
            int zomStartLine3 = line;
            int zomStartColumn3 = column;
            var savedChildrenZom3 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos3 = pos;
                int beforeLine3 = line;
                int beforeColumn3 = column;
                int zomIterPending3 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem3 = parse_Modifier();
                if (zomElem3.isSuccess() && zomElem3.node.isPresent()) {
                    children.add(zomElem3.node.unwrap());
                }
                if (zomElem3.isCutFailure()) {
                    elem0_1 = zomElem3;
                    break;
                }
                if (zomElem3.isFailure() || pos == beforePos3) {
                    restoreLocationRaw(beforePos3, beforeLine3, beforeColumn3);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom3);
                if (zomChildren3.size() == 1) {
                    children.add(zomChildren3.getFirst());
                } else if (!zomChildren3.isEmpty()) {
                    var zomSpan3 = new SourceSpan(zomStartLine3, zomStartColumn3, zomStartPos3, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan3, __ruleName, zomChildren3, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos3, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom3);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_Identifier();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_3 = parse_Block();
            if (elem0_3.isSuccess() && elem0_3.node.isPresent()) {
                children.add(elem0_3.node.unwrap());
            }
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_COMPACT_CONSTRUCTOR, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_COMPACT_CONSTRUCTOR, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_FieldDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(42, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_FIELD_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Type();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_VarDecls();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(";", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_FIELD_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_FIELD_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_VarDecls() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(43, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_VAR_DECLS;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_VarDecl();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_VarDecl();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_VAR_DECLS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_VAR_DECLS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_VarDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(44, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_VAR_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_VarDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_VarDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_VAR_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_VAR_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_VarDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_VAR_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Identifier();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_Dims();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_1;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_1 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_VarDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_VAR_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("=", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = parse_VarInit();
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_VarInit() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(45, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_VAR_INIT;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '{':
                {
                    result = parse_VarInit_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '!':
                case '"':
                case '$':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                case '~':
                {
                    result = parse_VarInit_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_VAR_INIT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_VAR_INIT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_VarInit_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_VAR_INIT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_VarInit_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_VarInit_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_VarInit_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_VarInit_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_VAR_INIT;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_Expr();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_VarInit_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_VAR_INIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("{", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_VarInit_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_VAR_INIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            optElem0 = parse_VarInit_seq1_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) optElem0 = parse_VarInit_seq1_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_1;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_1 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_VarInit_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_VAR_INIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_VarInit();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem1 = CstParseResult.successNoLoc(null, "");
                int seqStartPos3 = pos;
                int seqStartLine3 = line;
                int seqStartColumn3 = column;
                int seqPending3 = 0;
                var seqChildren3 = new ArrayList<>(children);
                boolean cut3 = false;
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_0 = matchLiteralCst(",", false);
                    if (elem3_0.isSuccess() && elem3_0.node.isPresent()) {
                        children.add(elem3_0.node.unwrap());
                    }
                    if (elem3_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_0;
                    } else if (elem3_0.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                    }
                }
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_1 = parse_VarInit();
                    if (elem3_1.isSuccess() && elem3_1.node.isPresent()) {
                        children.add(elem3_1.node.unwrap());
                    }
                    if (elem3_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_1;
                    } else if (elem3_1.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                    }
                }
                if (zomElem1.isSuccess()) {
                    zomElem1 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
                }
                if (zomElem1.isCutFailure()) {
                    elem_1 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_VarInit_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_VAR_INIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = matchLiteralCst(",", false);
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_VarInit_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_VAR_INIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("}", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_MethodDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_METHOD_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_MethodDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_MethodDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_MethodDecl_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_MethodDecl_seq0_chunk3(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_METHOD_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_METHOD_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_MethodDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_METHOD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_TypeParams();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_0;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_0 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Type();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Identifier();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_MethodDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_METHOD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst("(", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = CstParseResult.successNoLoc(null, "");
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = parse_Params();
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem_5;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_5 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem_5 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_5 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_MethodDecl_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_METHOD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_6 = matchLiteralCst(")", false);
            if (elem_6.isSuccess() && elem_6.node.isPresent()) {
                children.add(elem_6.node.unwrap());
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_Dims();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_7;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_7 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_7 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_7 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_7.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_7;
            } else if (elem_7.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_7.asCutFailure() : elem_7;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos3 = pos;
            int optStartLine3 = line;
            int optStartColumn3 = column;
            int optPending3 = 0;
            var savedChildrenOpt3 = new ArrayList<>(children);
            children.clear();
            var optElem3 = parse_Throws();
            if (optElem3.isSuccess() && optElem3.node.isPresent()) {
                children.add(optElem3.node.unwrap());
            }
            CstParseResult elem_8;
            if (optElem3.isCutFailure()) {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem_8 = optElem3;
            } else if (optElem3.isSuccess()) {
                var optChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt3);
                children.addAll(optChildren3);
                elem_8 = optElem3;
            } else {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem_8 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_8.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_8;
            } else if (elem_8.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_8.asCutFailure() : elem_8;
            }
        }
        return result;
    }

    private CstParseResult parse_MethodDecl_seq0_chunk3(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_METHOD_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_9 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case '{':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = parse_Block();
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_9 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_9 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                    case ';':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = matchLiteralCst(";", false);
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_9 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_9 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                }
            }
            if (elem_9 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_9 = CstParseResult.failure("one of alternatives");
            }
            if (elem_9.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_9;
            } else if (elem_9.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_9.asCutFailure() : elem_9;
            }
        }
        return result;
    }

    private CstParseResult parse_Params() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(47, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PARAMS;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Param();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_Param();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PARAMS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PARAMS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Param() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(48, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PARAM;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Param_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Param_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PARAM, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PARAM, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Param_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_Modifier();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Type();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Param_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = matchLiteralCst("...", false);
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = parse_Identifier();
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos3 = pos;
            int optStartLine3 = line;
            int optStartColumn3 = column;
            int optPending3 = 0;
            var savedChildrenOpt3 = new ArrayList<>(children);
            children.clear();
            var optElem3 = parse_Dims();
            if (optElem3.isSuccess() && optElem3.node.isPresent()) {
                children.add(optElem3.node.unwrap());
            }
            CstParseResult elem_5;
            if (optElem3.isCutFailure()) {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem_5 = optElem3;
            } else if (optElem3.isSuccess()) {
                var optChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt3);
                children.addAll(optChildren3);
                elem_5 = optElem3;
            } else {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem_5 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_Throws() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(49, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_THROWS;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("throws", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = CstParseResult.successNoLoc(null, "");
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        cut0 = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_TypeList();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_THROWS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_THROWS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ConstructorDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CONSTRUCTOR_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_ConstructorDecl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ConstructorDecl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ConstructorDecl_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CONSTRUCTOR_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CONSTRUCTOR_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ConstructorDecl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CONSTRUCTOR_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_TypeParams();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_0;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_0 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Identifier();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("(", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_ConstructorDecl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CONSTRUCTOR_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = CstParseResult.successNoLoc(null, "");
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_Params();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_4;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_4 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_4 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_4 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = matchLiteralCst(")", false);
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_ConstructorDecl_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CONSTRUCTOR_DECL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_Throws();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_6;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_6 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_6 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_6 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_7 = parse_Block();
            if (elem_7.isSuccess() && elem_7.node.isPresent()) {
                children.add(elem_7.node.unwrap());
            }
            if (elem_7.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_7;
            } else if (elem_7.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_7.asCutFailure() : elem_7;
            }
        }
        return result;
    }

    private CstParseResult parse_Block() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(51, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_BLOCK;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("{", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_BlockStmt();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst("}", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_BLOCK, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_BLOCK, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_BlockStmt() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(52, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_BLOCK_STMT;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'b':
                case 'g':
                case 'h':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'o':
                case 'q':
                case 'u':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_BlockStmt_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_BlockStmt_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '@':
                case 'a':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'i':
                case 'n':
                case 'p':
                case 'r':
                case 's':
                case 't':
                case 'v':
                {
                    result = parse_BlockStmt_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_BlockStmt_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_BlockStmt_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '!':
                case '"':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case ';':
                case '{':
                case '~':
                {
                    result = parse_BlockStmt_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_BLOCK_STMT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_BLOCK_STMT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_BlockStmt_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_BLOCK_STMT;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_LocalVar();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_BlockStmt_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_BLOCK_STMT;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_LocalTypeDecl();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_BlockStmt_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_BLOCK_STMT;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = parse_Stmt();
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_LocalTypeDecl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(53, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LOCAL_TYPE_DECL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = parse_Annotation();
                if (zomElem1.isSuccess() && zomElem1.node.isPresent()) {
                    children.add(zomElem1.node.unwrap());
                }
                if (zomElem1.isCutFailure()) {
                    elem0_0 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem0_0.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem0_0 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos3 = pos;
            int zomStartLine3 = line;
            int zomStartColumn3 = column;
            var savedChildrenZom3 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos3 = pos;
                int beforeLine3 = line;
                int beforeColumn3 = column;
                int zomIterPending3 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem3 = parse_Modifier();
                if (zomElem3.isSuccess() && zomElem3.node.isPresent()) {
                    children.add(zomElem3.node.unwrap());
                }
                if (zomElem3.isCutFailure()) {
                    elem0_1 = zomElem3;
                    break;
                }
                if (zomElem3.isFailure() || pos == beforePos3) {
                    restoreLocationRaw(beforePos3, beforeLine3, beforeColumn3);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom3);
                if (zomChildren3.size() == 1) {
                    children.add(zomChildren3.getFirst());
                } else if (!zomChildren3.isEmpty()) {
                    var zomSpan3 = new SourceSpan(zomStartLine3, zomStartColumn3, zomStartPos3, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan3, __ruleName, zomChildren3, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos3, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom3);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_TypeKind();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LOCAL_TYPE_DECL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LOCAL_TYPE_DECL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_LocalVar() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(54, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LOCAL_VAR;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_LocalVar_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_LocalVar_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LOCAL_VAR, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LOCAL_VAR, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_LocalVar_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LOCAL_VAR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_Modifier();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_LocalVarType();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_LocalVar_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LOCAL_VAR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_VarDecls();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(";", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_LocalVarType() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(55, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LOCAL_VAR_TYPE;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'v':
                {
                    result = parse_LocalVarType_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_LocalVarType_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '$':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_LocalVarType_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LOCAL_VAR_TYPE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LOCAL_VAR_TYPE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_LocalVarType_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LOCAL_VAR_TYPE;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("var", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_0;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_0 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_0 = tbElem0;
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_LocalVarType_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LOCAL_VAR_TYPE;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_Type();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_Stmt() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(56, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_STMT;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '{':
                {
                    result = parse_Stmt_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'i':
                {
                    result = parse_Stmt_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'w':
                {
                    result = parse_Stmt_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'f':
                {
                    result = parse_Stmt_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'd':
                {
                    result = parse_Stmt_alt4(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 't':
                {
                    result = parse_Stmt_alt5(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt8(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 's':
                {
                    result = parse_Stmt_alt6(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt12(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'r':
                {
                    result = parse_Stmt_alt7(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'b':
                {
                    result = parse_Stmt_alt9(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'c':
                {
                    result = parse_Stmt_alt10(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'a':
                {
                    result = parse_Stmt_alt11(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'y':
                {
                    result = parse_Stmt_alt13(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'e':
                case 'g':
                case 'h':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'u':
                case 'v':
                case 'x':
                case 'z':
                {
                    result = parse_Stmt_alt14(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '!':
                case '"':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '@':
                case '~':
                {
                    result = parse_Stmt_alt15(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case ';':
                {
                    result = parse_Stmt_alt16(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_STMT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_STMT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Stmt_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_Block();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_Stmt_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_1 = parse_Stmt_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) alt0_1 = parse_Stmt_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) alt0_1 = parse_Stmt_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_Stmt_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_2 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_2 = parse_Stmt_seq1_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_2.isSuccess()) alt0_2 = parse_Stmt_seq1_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_2.isSuccess()) {
            alt0_2 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_Stmt_alt3(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_3 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_3 = parse_Stmt_seq2_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_3.isSuccess()) alt0_3 = parse_Stmt_seq2_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_3.isSuccess()) {
            alt0_3 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_3.isSuccess()) {
            return alt0_3;
        }
        if (alt0_3.isCutFailure()) {
            return alt0_3;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_3;
    }

    private CstParseResult parse_Stmt_alt4(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_4 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_4 = parse_Stmt_seq3_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_4.isSuccess()) alt0_4 = parse_Stmt_seq3_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_4.isSuccess()) alt0_4 = parse_Stmt_seq3_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_4.isSuccess()) {
            alt0_4 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_4.isSuccess()) {
            return alt0_4;
        }
        if (alt0_4.isCutFailure()) {
            return alt0_4;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_4;
    }

    private CstParseResult parse_Stmt_alt5(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_5 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_5 = parse_Stmt_seq4_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_5.isSuccess()) alt0_5 = parse_Stmt_seq4_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_5.isSuccess()) {
            alt0_5 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_5.isSuccess()) {
            return alt0_5;
        }
        if (alt0_5.isCutFailure()) {
            return alt0_5;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_5;
    }

    private CstParseResult parse_Stmt_alt6(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_6 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_6 = parse_Stmt_seq5_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_6.isSuccess()) alt0_6 = parse_Stmt_seq5_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_6.isSuccess()) {
            alt0_6 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_6.isSuccess()) {
            return alt0_6;
        }
        if (alt0_6.isCutFailure()) {
            return alt0_6;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_6;
    }

    private CstParseResult parse_Stmt_alt7(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_7 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_7.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_ReturnKW();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_7 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_7 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_7.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = parse_Expr();
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem0_1;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem0_1 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem0_1 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem0_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_7 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_7 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_7.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(";", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_7 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_7 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_7.isSuccess()) {
            alt0_7 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_7.isSuccess()) {
            return alt0_7;
        }
        if (alt0_7.isCutFailure()) {
            return alt0_7;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_7;
    }

    private CstParseResult parse_Stmt_alt8(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_8 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_8.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_ThrowKW();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_8 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_8 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_8.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Expr();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_8 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_8 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_8.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(";", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_8 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_8 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_8.isSuccess()) {
            alt0_8 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_8.isSuccess()) {
            return alt0_8;
        }
        if (alt0_8.isCutFailure()) {
            return alt0_8;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_8;
    }

    private CstParseResult parse_Stmt_alt9(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_9 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_9.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_BreakKW();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_9 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_9 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_9.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = parse_Identifier();
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem0_1;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem0_1 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem0_1 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem0_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_9 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_9 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_9.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(";", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_9 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_9 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_9.isSuccess()) {
            alt0_9 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_9.isSuccess()) {
            return alt0_9;
        }
        if (alt0_9.isCutFailure()) {
            return alt0_9;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_9;
    }

    private CstParseResult parse_Stmt_alt10(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_10 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_10.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_ContinueKW();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_10 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_10 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_10.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = parse_Identifier();
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem0_1;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem0_1 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem0_1 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem0_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_10 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_10 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_10.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(";", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_10 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_10 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_10.isSuccess()) {
            alt0_10 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_10.isSuccess()) {
            return alt0_10;
        }
        if (alt0_10.isCutFailure()) {
            return alt0_10;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_10;
    }

    private CstParseResult parse_Stmt_alt11(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_11 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_11.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_AssertKW();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_11 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_11 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_11.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Expr();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_11 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_11 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_11.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos3 = pos;
            int optStartLine3 = line;
            int optStartColumn3 = column;
            int optPending3 = 0;
            var savedChildrenOpt3 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem3 = CstParseResult.successNoLoc(null, "");
            int seqStartPos5 = pos;
            int seqStartLine5 = line;
            int seqStartColumn5 = column;
            int seqPending5 = 0;
            var seqChildren5 = new ArrayList<>(children);
            boolean cut5 = false;
            if (optElem3.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem5_0 = matchLiteralCst(":", false);
                if (elem5_0.isSuccess() && elem5_0.node.isPresent()) {
                    children.add(elem5_0.node.unwrap());
                }
                if (elem5_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                    children.clear();
                    children.addAll(seqChildren5);
                    optElem3 = elem5_0;
                } else if (elem5_0.isFailure()) {
                    restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                    children.clear();
                    children.addAll(seqChildren5);
                    optElem3 = cut5 ? elem5_0.asCutFailure() : elem5_0;
                }
            }
            if (optElem3.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem5_1 = parse_Expr();
                if (elem5_1.isSuccess() && elem5_1.node.isPresent()) {
                    children.add(elem5_1.node.unwrap());
                }
                if (elem5_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                    children.clear();
                    children.addAll(seqChildren5);
                    optElem3 = elem5_1;
                } else if (elem5_1.isFailure()) {
                    restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                    children.clear();
                    children.addAll(seqChildren5);
                    optElem3 = cut5 ? elem5_1.asCutFailure() : elem5_1;
                }
            }
            if (optElem3.isSuccess()) {
                optElem3 = CstParseResult.successNoLoc(null, substring(seqStartPos5, pos));
            }
            CstParseResult elem0_2;
            if (optElem3.isCutFailure()) {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem0_2 = optElem3;
            } else if (optElem3.isSuccess()) {
                var optChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt3);
                children.addAll(optChildren3);
                elem0_2 = optElem3;
            } else {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem0_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_11 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_11 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_11.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_3 = matchLiteralCst(";", false);
            if (elem0_3.isSuccess() && elem0_3.node.isPresent()) {
                children.add(elem0_3.node.unwrap());
            }
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_11 = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_11 = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (alt0_11.isSuccess()) {
            alt0_11 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_11.isSuccess()) {
            return alt0_11;
        }
        if (alt0_11.isCutFailure()) {
            return alt0_11;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_11;
    }

    private CstParseResult parse_Stmt_alt12(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_12 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_12 = parse_Stmt_seq6_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_12.isSuccess()) alt0_12 = parse_Stmt_seq6_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_12.isSuccess()) {
            alt0_12 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_12.isSuccess()) {
            return alt0_12;
        }
        if (alt0_12.isCutFailure()) {
            return alt0_12;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_12;
    }

    private CstParseResult parse_Stmt_alt13(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_13 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_13.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_YieldKW();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_13 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_13 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_13.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Expr();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_13 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_13 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_13.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(";", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_13 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_13 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_13.isSuccess()) {
            alt0_13 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_13.isSuccess()) {
            return alt0_13;
        }
        if (alt0_13.isCutFailure()) {
            return alt0_13;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_13;
    }

    private CstParseResult parse_Stmt_alt14(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_14 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_14.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Identifier();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_14 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_14 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_14.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst(":", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_14 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_14 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_14.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_Stmt();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_14 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_14 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_14.isSuccess()) {
            alt0_14 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_14.isSuccess()) {
            return alt0_14;
        }
        if (alt0_14.isCutFailure()) {
            return alt0_14;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_14;
    }

    private CstParseResult parse_Stmt_alt15(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_15 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_15.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Expr();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_15 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_15 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_15.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst(";", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_15 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_15 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_15.isSuccess()) {
            alt0_15 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_15.isSuccess()) {
            return alt0_15;
        }
        if (alt0_15.isCutFailure()) {
            return alt0_15;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_15;
    }

    private CstParseResult parse_Stmt_alt16(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STMT;
        children.clear();
        children.addAll(childrenState);
        var alt0_16 = matchLiteralCst(";", false);
        if (alt0_16.isSuccess() && alt0_16.node.isPresent()) {
            children.add(alt0_16.node.unwrap());
        }
        if (alt0_16.isSuccess()) {
            return alt0_16;
        }
        if (alt0_16.isCutFailure()) {
            return alt0_16;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_16;
    }

    private CstParseResult parse_Stmt_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_IfKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("(", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Expr();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(")", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = parse_Stmt();
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("else", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = parse_Stmt();
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_6;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_6 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_6 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_6 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_WhileKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("(", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Expr();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(")", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = parse_Stmt();
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq2_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_ForKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("(", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq2_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_ForCtrl();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(")", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = parse_Stmt();
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq3_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_DoKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Stmt();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq3_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst("while", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst("(", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = parse_Expr();
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq3_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_6 = matchLiteralCst(")", false);
            if (elem_6.isSuccess() && elem_6.node.isPresent()) {
                children.add(elem_6.node.unwrap());
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_7 = matchLiteralCst(";", false);
            if (elem_7.isSuccess() && elem_7.node.isPresent()) {
                children.add(elem_7.node.unwrap());
            }
            if (elem_7.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_7;
            } else if (elem_7.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_7.asCutFailure() : elem_7;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq4_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_TryKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = parse_ResourceSpec();
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem_2;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_2 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem_2 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq4_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Block();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_4 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = parse_Catch();
                if (zomElem1.isSuccess() && zomElem1.node.isPresent()) {
                    children.add(zomElem1.node.unwrap());
                }
                if (zomElem1.isCutFailure()) {
                    elem_4 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem_4.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem_4 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos3 = pos;
            int optStartLine3 = line;
            int optStartColumn3 = column;
            int optPending3 = 0;
            var savedChildrenOpt3 = new ArrayList<>(children);
            children.clear();
            var optElem3 = parse_Finally();
            if (optElem3.isSuccess() && optElem3.node.isPresent()) {
                children.add(optElem3.node.unwrap());
            }
            CstParseResult elem_5;
            if (optElem3.isCutFailure()) {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem_5 = optElem3;
            } else if (optElem3.isSuccess()) {
                var optChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt3);
                children.addAll(optChildren3);
                elem_5 = optElem3;
            } else {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem_5 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq5_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_SwitchKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("(", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq5_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Expr();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(")", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = parse_SwitchBlock();
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq6_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_SynchronizedKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("(", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Stmt_seq6_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_STMT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Expr();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(")", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = parse_Block();
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_IfKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_IF_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("if", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_IF_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_IF_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_WhileKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_WHILE_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("while", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_WHILE_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_WHILE_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ForKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_FOR_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("for", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_FOR_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_FOR_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_DoKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_DO_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("do", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_DO_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_DO_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_TryKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TRY_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("try", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TRY_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TRY_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_SwitchKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(62, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_SWITCH_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("switch", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_SWITCH_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_SWITCH_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_SynchronizedKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_SYNCHRONIZED_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("synchronized", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_SYNCHRONIZED_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_SYNCHRONIZED_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ReturnKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RETURN_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("return", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RETURN_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RETURN_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ThrowKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(65, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_THROW_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("throw", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_THROW_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_THROW_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_BreakKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_BREAK_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("break", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_BREAK_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_BREAK_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ContinueKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CONTINUE_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("continue", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CONTINUE_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CONTINUE_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_AssertKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ASSERT_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("assert", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ASSERT_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ASSERT_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_YieldKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_YIELD_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("yield", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_YIELD_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_YIELD_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_CatchKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CATCH_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("catch", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CATCH_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CATCH_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_FinallyKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_FINALLY_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("finally", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_FINALLY_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_FINALLY_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_WhenKW() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_WHEN_K_W;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("when", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_WHEN_K_W, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_WHEN_K_W, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ForCtrl() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_FOR_CTRL;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '!':
                case '"':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case ';':
                case '~':
                {
                    result = parse_ForCtrl_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '$':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_ForCtrl_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_ForCtrl_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_FOR_CTRL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_FOR_CTRL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ForCtrl_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_FOR_CTRL;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_ForCtrl_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_ForCtrl_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_ForCtrl_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_FOR_CTRL;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_LocalVarType();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Identifier();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(":", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_3 = parse_Expr();
            if (elem0_3.isSuccess() && elem0_3.node.isPresent()) {
                children.add(elem0_3.node.unwrap());
            }
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_ForCtrl_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_FOR_CTRL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_ForInit();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_0;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_0 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_0 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = matchLiteralCst(";", false);
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos3 = pos;
            int optStartLine3 = line;
            int optStartColumn3 = column;
            int optPending3 = 0;
            var savedChildrenOpt3 = new ArrayList<>(children);
            children.clear();
            var optElem3 = parse_Expr();
            if (optElem3.isSuccess() && optElem3.node.isPresent()) {
                children.add(optElem3.node.unwrap());
            }
            CstParseResult elem_2;
            if (optElem3.isCutFailure()) {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem_2 = optElem3;
            } else if (optElem3.isSuccess()) {
                var optChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt3);
                children.addAll(optChildren3);
                elem_2 = optElem3;
            } else {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_ForCtrl_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_FOR_CTRL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(";", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_ExprList();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_4;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_4 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_4 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_4 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_ForInit() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_FOR_INIT;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_ForInit_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_ForInit_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '!':
                case '"':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '~':
                {
                    result = parse_ForInit_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_FOR_INIT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_FOR_INIT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_ForInit_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_FOR_INIT;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_LocalVarNoSemi();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_ForInit_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_FOR_INIT;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_ExprList();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_LocalVarNoSemi() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(75, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LOCAL_VAR_NO_SEMI;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = parse_Annotation();
                if (zomElem1.isSuccess() && zomElem1.node.isPresent()) {
                    children.add(zomElem1.node.unwrap());
                }
                if (zomElem1.isCutFailure()) {
                    elem0_0 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem0_0.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem0_0 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos3 = pos;
            int zomStartLine3 = line;
            int zomStartColumn3 = column;
            var savedChildrenZom3 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos3 = pos;
                int beforeLine3 = line;
                int beforeColumn3 = column;
                int zomIterPending3 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem3 = parse_Modifier();
                if (zomElem3.isSuccess() && zomElem3.node.isPresent()) {
                    children.add(zomElem3.node.unwrap());
                }
                if (zomElem3.isCutFailure()) {
                    elem0_1 = zomElem3;
                    break;
                }
                if (zomElem3.isFailure() || pos == beforePos3) {
                    restoreLocationRaw(beforePos3, beforeLine3, beforeColumn3);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom3);
                if (zomChildren3.size() == 1) {
                    children.add(zomChildren3.getFirst());
                } else if (!zomChildren3.isEmpty()) {
                    var zomSpan3 = new SourceSpan(zomStartLine3, zomStartColumn3, zomStartPos3, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan3, __ruleName, zomChildren3, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos3, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom3);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_LocalVarType();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_3 = parse_VarDecls();
            if (elem0_3.isSuccess() && elem0_3.node.isPresent()) {
                children.add(elem0_3.node.unwrap());
            }
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LOCAL_VAR_NO_SEMI, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LOCAL_VAR_NO_SEMI, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ResourceSpec() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(76, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RESOURCE_SPEC;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_ResourceSpec_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ResourceSpec_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RESOURCE_SPEC, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RESOURCE_SPEC, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ResourceSpec_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RESOURCE_SPEC;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("(", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Resource();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(";", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_Resource();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem_2 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_2.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_2 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_ResourceSpec_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RESOURCE_SPEC;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = matchLiteralCst(";", false);
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst(")", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_Resource() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(77, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RESOURCE;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_Resource_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Resource_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '@':
                {
                    result = parse_Resource_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RESOURCE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RESOURCE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Resource_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_RESOURCE;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_Resource_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_Resource_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_Resource_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_RESOURCE;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_QualifiedName();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_Resource_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RESOURCE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_Modifier();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_LocalVarType();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Resource_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RESOURCE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Identifier();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst("=", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_5 = parse_Expr();
            if (elem_5.isSuccess() && elem_5.node.isPresent()) {
                children.add(elem_5.node.unwrap());
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        return result;
    }

    private CstParseResult parse_Catch() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(78, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CATCH;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Catch_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Catch_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Catch_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Catch_seq0_chunk3(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CATCH, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CATCH, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Catch_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CATCH;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_CatchKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("(", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Catch_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CATCH;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_3 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Modifier();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_3 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_3.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_3 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = parse_Type();
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_Catch_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CATCH;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_5 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_0 = matchLiteralCst("|", false);
                    if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                        children.add(elem2_0.node.unwrap());
                    }
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_1 = parse_Type();
                    if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                        children.add(elem2_1.node.unwrap());
                    }
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_5 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_5.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_5 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_5.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_5;
            } else if (elem_5.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_5.asCutFailure() : elem_5;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_6 = parse_Identifier();
            if (elem_6.isSuccess() && elem_6.node.isPresent()) {
                children.add(elem_6.node.unwrap());
            }
            if (elem_6.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_6;
            } else if (elem_6.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_6.asCutFailure() : elem_6;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_7 = matchLiteralCst(")", false);
            if (elem_7.isSuccess() && elem_7.node.isPresent()) {
                children.add(elem_7.node.unwrap());
            }
            if (elem_7.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_7;
            } else if (elem_7.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_7.asCutFailure() : elem_7;
            }
        }
        return result;
    }

    private CstParseResult parse_Catch_seq0_chunk3(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CATCH;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_8 = parse_Block();
            if (elem_8.isSuccess() && elem_8.node.isPresent()) {
                children.add(elem_8.node.unwrap());
            }
            if (elem_8.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_8;
            } else if (elem_8.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_8.asCutFailure() : elem_8;
            }
        }
        return result;
    }

    private CstParseResult parse_Finally() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_FINALLY;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_FinallyKW();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = CstParseResult.successNoLoc(null, "");
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        cut0 = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_Block();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_FINALLY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_FINALLY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_SwitchBlock() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(80, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_SWITCH_BLOCK;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("{", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_SwitchRule();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst("}", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_SWITCH_BLOCK, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_SWITCH_BLOCK, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_SwitchRule() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(81, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_SWITCH_RULE;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'c':
                case 'd':
                {
                    result = parse_SwitchRule_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_SwitchRule_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_SWITCH_RULE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_SWITCH_RULE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_SwitchRule_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_SWITCH_RULE;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_SwitchRule_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_SwitchRule_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_SwitchRule_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_SWITCH_RULE;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_SwitchLabel();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst(":", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_2 = CstParseResult.successNoLoc(null, "");
            int zomStartPos3 = pos;
            int zomStartLine3 = line;
            int zomStartColumn3 = column;
            var savedChildrenZom3 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos3 = pos;
                int beforeLine3 = line;
                int beforeColumn3 = column;
                int zomIterPending3 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem3 = parse_BlockStmt();
                if (zomElem3.isSuccess() && zomElem3.node.isPresent()) {
                    children.add(zomElem3.node.unwrap());
                }
                if (zomElem3.isCutFailure()) {
                    elem0_2 = zomElem3;
                    break;
                }
                if (zomElem3.isFailure() || pos == beforePos3) {
                    restoreLocationRaw(beforePos3, beforeLine3, beforeColumn3);
                    break;
                }
            }
            if (!elem0_2.isCutFailure()) {
                var zomChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom3);
                if (zomChildren3.size() == 1) {
                    children.add(zomChildren3.getFirst());
                } else if (!zomChildren3.isEmpty()) {
                    var zomSpan3 = new SourceSpan(zomStartLine3, zomStartColumn3, zomStartPos3, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan3, __ruleName, zomChildren3, List.of(), List.of()));
                }
                elem0_2 = CstParseResult.successNoLoc(null, substring(zomStartPos3, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom3);
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_SwitchRule_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SWITCH_RULE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_SwitchLabel();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = matchLiteralCst("->", false);
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_SwitchRule_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SWITCH_RULE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = parse_SwitchRule_choice0(children);
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_SwitchRule_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_SWITCH_RULE;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '!':
                case '"':
                case '$':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                case '~':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos1 = pos;
                    int seqStartLine1 = line;
                    int seqStartColumn1 = column;
                    int seqPending1 = 0;
                    var seqChildren1 = new ArrayList<>(children);
                    boolean cut1 = false;
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_0 = parse_Expr();
                        if (elem1_0.isSuccess() && elem1_0.node.isPresent()) {
                            children.add(elem1_0.node.unwrap());
                        }
                        if (elem1_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_0;
                        } else if (elem1_0.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_1 = matchLiteralCst(";", false);
                        if (elem1_1.isSuccess() && elem1_1.node.isPresent()) {
                            children.add(elem1_1.node.unwrap());
                        }
                        if (elem1_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_1;
                        } else if (elem1_1.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 't':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos4 = pos;
                    int seqStartLine4 = line;
                    int seqStartColumn4 = column;
                    int seqPending4 = 0;
                    var seqChildren4 = new ArrayList<>(children);
                    boolean cut4 = false;
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem4_0 = parse_Expr();
                        if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                            children.add(elem4_0.node.unwrap());
                        }
                        if (elem4_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                            children.clear();
                            children.addAll(seqChildren4);
                            alt0_0 = elem4_0;
                        } else if (elem4_0.isFailure()) {
                            restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                            children.clear();
                            children.addAll(seqChildren4);
                            alt0_0 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem4_1 = matchLiteralCst(";", false);
                        if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                            children.add(elem4_1.node.unwrap());
                        }
                        if (elem4_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                            children.clear();
                            children.addAll(seqChildren4);
                            alt0_0 = elem4_1;
                        } else if (elem4_1.isFailure()) {
                            restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                            children.clear();
                            children.addAll(seqChildren4);
                            alt0_0 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_2 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos7 = pos;
                    int seqStartLine7 = line;
                    int seqStartColumn7 = column;
                    int seqPending7 = 0;
                    var seqChildren7 = new ArrayList<>(children);
                    boolean cut7 = false;
                    if (alt0_2.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_0 = parse_ThrowKW();
                        if (elem7_0.isSuccess() && elem7_0.node.isPresent()) {
                            children.add(elem7_0.node.unwrap());
                        }
                        if (elem7_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            alt0_2 = elem7_0;
                        } else if (elem7_0.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            alt0_2 = cut7 ? elem7_0.asCutFailure() : elem7_0;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_1 = parse_Expr();
                        if (elem7_1.isSuccess() && elem7_1.node.isPresent()) {
                            children.add(elem7_1.node.unwrap());
                        }
                        if (elem7_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            alt0_2 = elem7_1;
                        } else if (elem7_1.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            alt0_2 = cut7 ? elem7_1.asCutFailure() : elem7_1;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem7_2 = matchLiteralCst(";", false);
                        if (elem7_2.isSuccess() && elem7_2.node.isPresent()) {
                            children.add(elem7_2.node.unwrap());
                        }
                        if (elem7_2.isCutFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            alt0_2 = elem7_2;
                        } else if (elem7_2.isFailure()) {
                            restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                            children.clear();
                            children.addAll(seqChildren7);
                            alt0_2 = cut7 ? elem7_2.asCutFailure() : elem7_2;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        alt0_2 = CstParseResult.successNoLoc(null, substring(seqStartPos7, pos));
                    }
                    if (alt0_2.isSuccess()) {
                        result = alt0_2;
                    } else if (alt0_2.isCutFailure()) {
                        result = alt0_2.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case '{':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_1 = parse_Block();
                    if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
                        children.add(alt0_1.node.unwrap());
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_SwitchLabel() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(82, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_SWITCH_LABEL;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'c':
                {
                    result = parse_SwitchLabel_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'd':
                {
                    result = parse_SwitchLabel_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_SWITCH_LABEL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_SWITCH_LABEL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_SwitchLabel_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_SWITCH_LABEL;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_SwitchLabel_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_SwitchLabel_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_SwitchLabel_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_SWITCH_LABEL;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = matchLiteralCst("default", false);
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_SwitchLabel_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SWITCH_LABEL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("case", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        cut = true;
        return result;
    }

    private CstParseResult parse_SwitchLabel_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SWITCH_LABEL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = true;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = parse_SwitchLabel_choice0(children);
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_SwitchLabel_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_SWITCH_LABEL;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'n':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos1 = pos;
                    int seqStartLine1 = line;
                    int seqStartColumn1 = column;
                    int seqPending1 = 0;
                    var seqChildren1 = new ArrayList<>(children);
                    boolean cut1 = false;
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_0 = matchLiteralCst("null", false);
                        if (elem1_0.isSuccess() && elem1_0.node.isPresent()) {
                            children.add(elem1_0.node.unwrap());
                        }
                        if (elem1_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_0;
                        } else if (elem1_0.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        int optStartPos3 = pos;
                        int optStartLine3 = line;
                        int optStartColumn3 = column;
                        int optPending3 = 0;
                        var savedChildrenOpt3 = new ArrayList<>(children);
                        children.clear();
                        CstParseResult optElem3 = CstParseResult.successNoLoc(null, "");
                        int seqStartPos5 = pos;
                        int seqStartLine5 = line;
                        int seqStartColumn5 = column;
                        int seqPending5 = 0;
                        var seqChildren5 = new ArrayList<>(children);
                        boolean cut5 = false;
                        if (optElem3.isSuccess()) {
                            if (tokenBoundaryDepth == 0) skipWhitespace();
                            var elem5_0 = matchLiteralCst(",", false);
                            if (elem5_0.isSuccess() && elem5_0.node.isPresent()) {
                                children.add(elem5_0.node.unwrap());
                            }
                            if (elem5_0.isCutFailure()) {
                                restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                                children.clear();
                                children.addAll(seqChildren5);
                                optElem3 = elem5_0;
                            } else if (elem5_0.isFailure()) {
                                restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                                children.clear();
                                children.addAll(seqChildren5);
                                optElem3 = cut5 ? elem5_0.asCutFailure() : elem5_0;
                            }
                        }
                        if (optElem3.isSuccess()) {
                            if (tokenBoundaryDepth == 0) skipWhitespace();
                            var elem5_1 = matchLiteralCst("default", false);
                            if (elem5_1.isSuccess() && elem5_1.node.isPresent()) {
                                children.add(elem5_1.node.unwrap());
                            }
                            if (elem5_1.isCutFailure()) {
                                restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                                children.clear();
                                children.addAll(seqChildren5);
                                optElem3 = elem5_1;
                            } else if (elem5_1.isFailure()) {
                                restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                                children.clear();
                                children.addAll(seqChildren5);
                                optElem3 = cut5 ? elem5_1.asCutFailure() : elem5_1;
                            }
                        }
                        if (optElem3.isSuccess()) {
                            optElem3 = CstParseResult.successNoLoc(null, substring(seqStartPos5, pos));
                        }
                        CstParseResult elem1_1;
                        if (optElem3.isCutFailure()) {
                            restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                            children.clear();
                            children.addAll(savedChildrenOpt3);
                            elem1_1 = optElem3;
                        } else if (optElem3.isSuccess()) {
                            var optChildren3 = new ArrayList<>(children);
                            children.clear();
                            children.addAll(savedChildrenOpt3);
                            children.addAll(optChildren3);
                            elem1_1 = optElem3;
                        } else {
                            restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                            children.clear();
                            children.addAll(savedChildrenOpt3);
                            elem1_1 = CstParseResult.successNoLoc(null, "");
                        }
                        if (elem1_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_1;
                        } else if (elem1_1.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos8 = pos;
                    int seqStartLine8 = line;
                    int seqStartColumn8 = column;
                    int seqPending8 = 0;
                    var seqChildren8 = new ArrayList<>(children);
                    alt0_1 = parse_SwitchLabel_seq1_chunk0(children, seqStartPos8, seqStartLine8, seqStartColumn8, seqPending8, seqChildren8);
                    if (alt0_1.isSuccess()) alt0_1 = parse_SwitchLabel_seq1_chunk1(children, seqStartPos8, seqStartLine8, seqStartColumn8, seqPending8, seqChildren8);
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos8, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case '!':
                case '"':
                case '$':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                case '~':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos9 = pos;
                    int seqStartLine9 = line;
                    int seqStartColumn9 = column;
                    int seqPending9 = 0;
                    var seqChildren9 = new ArrayList<>(children);
                    alt0_1 = parse_SwitchLabel_seq2_chunk0(children, seqStartPos9, seqStartLine9, seqStartColumn9, seqPending9, seqChildren9);
                    if (alt0_1.isSuccess()) alt0_1 = parse_SwitchLabel_seq2_chunk1(children, seqStartPos9, seqStartLine9, seqStartColumn9, seqPending9, seqChildren9);
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos9, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_SwitchLabel_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SWITCH_LABEL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_CaseItem();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem1 = CstParseResult.successNoLoc(null, "");
                int seqStartPos3 = pos;
                int seqStartLine3 = line;
                int seqStartColumn3 = column;
                int seqPending3 = 0;
                var seqChildren3 = new ArrayList<>(children);
                boolean cut3 = false;
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_0 = matchLiteralCst(",", false);
                    if (elem3_0.isSuccess() && elem3_0.node.isPresent()) {
                        children.add(elem3_0.node.unwrap());
                    }
                    if (elem3_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_0;
                    } else if (elem3_0.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                    }
                }
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_1 = parse_CaseItem();
                    if (elem3_1.isSuccess() && elem3_1.node.isPresent()) {
                        children.add(elem3_1.node.unwrap());
                    }
                    if (elem3_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_1;
                    } else if (elem3_1.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                    }
                }
                if (zomElem1.isSuccess()) {
                    zomElem1 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
                }
                if (zomElem1.isCutFailure()) {
                    elem_1 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_SwitchLabel_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SWITCH_LABEL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_Guard();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_SwitchLabel_seq2_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SWITCH_LABEL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_CaseItem();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem1 = CstParseResult.successNoLoc(null, "");
                int seqStartPos3 = pos;
                int seqStartLine3 = line;
                int seqStartColumn3 = column;
                int seqPending3 = 0;
                var seqChildren3 = new ArrayList<>(children);
                boolean cut3 = false;
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_0 = matchLiteralCst(",", false);
                    if (elem3_0.isSuccess() && elem3_0.node.isPresent()) {
                        children.add(elem3_0.node.unwrap());
                    }
                    if (elem3_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_0;
                    } else if (elem3_0.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                    }
                }
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_1 = parse_CaseItem();
                    if (elem3_1.isSuccess() && elem3_1.node.isPresent()) {
                        children.add(elem3_1.node.unwrap());
                    }
                    if (elem3_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_1;
                    } else if (elem3_1.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                    }
                }
                if (zomElem1.isSuccess()) {
                    zomElem1 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
                }
                if (zomElem1.isCutFailure()) {
                    elem_1 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_SwitchLabel_seq2_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SWITCH_LABEL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_Guard();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_CaseItem() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(83, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CASE_ITEM;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_CaseItem_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_CaseItem_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_CaseItem_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '@':
                {
                    result = parse_CaseItem_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_CaseItem_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '!':
                case '"':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '~':
                {
                    result = parse_CaseItem_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CASE_ITEM, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CASE_ITEM, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_CaseItem_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_CASE_ITEM;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_Pattern();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_CaseItem_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_CASE_ITEM;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_1 = parse_CaseItem_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) alt0_1 = parse_CaseItem_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_CaseItem_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_CASE_ITEM;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = parse_Expr();
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_CaseItem_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CASE_ITEM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_QualifiedName();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_CaseItem_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_CASE_ITEM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int andStartPos0 = pos;
            int andStartLine0 = line;
            int andStartColumn0 = column;
            var savedChildrenAnd0 = new ArrayList<>(children);
            CstParseResult andElem0 = null;
            int choiceStart2Pos = pos;
            int choiceStart2Line = line;
            int choiceStart2Column = column;
            int choicePending2 = 0;
            if (pos < input.length()) {
                char dispatchChar2 = input.charAt(pos);
                switch (dispatchChar2) {
                    case '-':
                    {
                        var alt2_0 = matchLiteralCst("->", false);
                        if (alt2_0.isSuccess()) {
                            andElem0 = alt2_0;
                        } else if (alt2_0.isCutFailure()) {
                            andElem0 = alt2_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                        }
                        break;
                    }
                    case ',':
                    {
                        var alt2_1 = matchLiteralCst(",", false);
                        if (alt2_1.isSuccess()) {
                            andElem0 = alt2_1;
                        } else if (alt2_1.isCutFailure()) {
                            andElem0 = alt2_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                        }
                        break;
                    }
                    case ':':
                    {
                        var alt2_2 = matchLiteralCst(":", false);
                        if (alt2_2.isSuccess()) {
                            andElem0 = alt2_2;
                        } else if (alt2_2.isCutFailure()) {
                            andElem0 = alt2_2.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                        }
                        break;
                    }
                    case 'w':
                    {
                        var alt2_3 = matchLiteralCst("when", false);
                        if (alt2_3.isSuccess()) {
                            andElem0 = alt2_3;
                        } else if (alt2_3.isCutFailure()) {
                            andElem0 = alt2_3.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                        }
                        break;
                    }
                }
            }
            if (andElem0 == null) {
                andElem0 = CstParseResult.failure("one of alternatives");
            }
            restoreLocationRaw(andStartPos0, andStartLine0, andStartColumn0);
            children.clear();
            children.addAll(savedChildrenAnd0);
            var elem_1 = andElem0.isSuccess() ? CstParseResult.successNoLoc(null, "") : andElem0;
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Pattern() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(84, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PATTERN;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_Pattern_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Pattern_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PATTERN, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PATTERN, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Pattern_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PATTERN;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_RecordPattern();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_Pattern_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PATTERN;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_TypePattern();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_TypePattern() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_PATTERN;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_TypePattern_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '_':
                {
                    result = parse_TypePattern_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_TypePattern_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_PATTERN, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_PATTERN, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_TypePattern_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_PATTERN;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_0.isSuccess()) {
            int andStartPos1 = pos;
            int andStartLine1 = line;
            int andStartColumn1 = column;
            var savedChildrenAnd1 = new ArrayList<>(children);
            CstParseResult andElem1 = CstParseResult.successNoLoc(null, "");
            int seqStartPos3 = pos;
            int seqStartLine3 = line;
            int seqStartColumn3 = column;
            int seqPending3 = 0;
            boolean cut3 = false;
            if (andElem1.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem3_0 = parse_LocalVarType();
                if (elem3_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                    andElem1 = elem3_0;
                } else if (elem3_0.isFailure()) {
                    restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                    andElem1 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                }
            }
            if (andElem1.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem3_1 = parse_Identifier();
                if (elem3_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                    andElem1 = elem3_1;
                } else if (elem3_1.isFailure()) {
                    restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                    andElem1 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                }
            }
            if (andElem1.isSuccess()) {
                andElem1 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
            }
            restoreLocationRaw(andStartPos1, andStartLine1, andStartColumn1);
            children.clear();
            children.addAll(savedChildrenAnd1);
            var elem0_0 = andElem1.isSuccess() ? CstParseResult.successNoLoc(null, "") : andElem1;
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_LocalVarType();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = parse_Identifier();
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_TypePattern_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_PATTERN;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = matchLiteralCst("_", false);
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_RecordPattern() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RECORD_PATTERN;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_RefType();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst("(", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos3 = pos;
            int optStartLine3 = line;
            int optStartColumn3 = column;
            int optPending3 = 0;
            var savedChildrenOpt3 = new ArrayList<>(children);
            children.clear();
            var optElem3 = parse_PatternList();
            if (optElem3.isSuccess() && optElem3.node.isPresent()) {
                children.add(optElem3.node.unwrap());
            }
            CstParseResult elem0_2;
            if (optElem3.isCutFailure()) {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem0_2 = optElem3;
            } else if (optElem3.isSuccess()) {
                var optChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt3);
                children.addAll(optChildren3);
                elem0_2 = optElem3;
            } else {
                restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                children.clear();
                children.addAll(savedChildrenOpt3);
                elem0_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_3 = matchLiteralCst(")", false);
            if (elem0_3.isSuccess() && elem0_3.node.isPresent()) {
                children.add(elem0_3.node.unwrap());
            }
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RECORD_PATTERN, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RECORD_PATTERN, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_PatternList() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(87, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PATTERN_LIST;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Pattern();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_Pattern();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PATTERN_LIST, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PATTERN_LIST, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Guard() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_GUARD;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_WhenKW();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Expr();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_GUARD, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_GUARD, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_Expr() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_EXPR;
        
        var result = parse_Assignment();
        if (result.isSuccess() && result.node.isPresent()) {
            children.add(result.node.unwrap());
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_EXPR, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_EXPR, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_Assignment() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ASSIGNMENT;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Assignment_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Assignment_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ASSIGNMENT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ASSIGNMENT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_Assignment_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ASSIGNMENT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Ternary();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Assignment_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ASSIGNMENT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            optElem0 = parse_Assignment_seq1_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) optElem0 = parse_Assignment_seq1_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_1;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_1 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Assignment_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ASSIGNMENT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = parse_Assignment_choice0(children);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Assignment_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_ASSIGNMENT;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '>':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_0 = parse_URShiftAssign();
                    if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
                        children.add(alt0_0.node.unwrap());
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_1 = parse_RShiftAssign();
                    if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
                        children.add(alt0_1.node.unwrap());
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case '<':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_2 = parse_LShiftAssign();
                    if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
                        children.add(alt0_2.node.unwrap());
                    }
                    if (alt0_2.isSuccess()) {
                        result = alt0_2;
                    } else if (alt0_2.isCutFailure()) {
                        result = alt0_2.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '=':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_3 = matchLiteralCst("=", false);
                    if (alt0_3.isSuccess() && alt0_3.node.isPresent()) {
                        children.add(alt0_3.node.unwrap());
                    }
                    if (alt0_3.isSuccess()) {
                        result = alt0_3;
                    } else if (alt0_3.isCutFailure()) {
                        result = alt0_3.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '+':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_4 = matchLiteralCst("+=", false);
                    if (alt0_4.isSuccess() && alt0_4.node.isPresent()) {
                        children.add(alt0_4.node.unwrap());
                    }
                    if (alt0_4.isSuccess()) {
                        result = alt0_4;
                    } else if (alt0_4.isCutFailure()) {
                        result = alt0_4.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '-':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_5 = matchLiteralCst("-=", false);
                    if (alt0_5.isSuccess() && alt0_5.node.isPresent()) {
                        children.add(alt0_5.node.unwrap());
                    }
                    if (alt0_5.isSuccess()) {
                        result = alt0_5;
                    } else if (alt0_5.isCutFailure()) {
                        result = alt0_5.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '*':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_6 = matchLiteralCst("*=", false);
                    if (alt0_6.isSuccess() && alt0_6.node.isPresent()) {
                        children.add(alt0_6.node.unwrap());
                    }
                    if (alt0_6.isSuccess()) {
                        result = alt0_6;
                    } else if (alt0_6.isCutFailure()) {
                        result = alt0_6.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '/':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_7 = matchLiteralCst("/=", false);
                    if (alt0_7.isSuccess() && alt0_7.node.isPresent()) {
                        children.add(alt0_7.node.unwrap());
                    }
                    if (alt0_7.isSuccess()) {
                        result = alt0_7;
                    } else if (alt0_7.isCutFailure()) {
                        result = alt0_7.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '%':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_8 = matchLiteralCst("%=", false);
                    if (alt0_8.isSuccess() && alt0_8.node.isPresent()) {
                        children.add(alt0_8.node.unwrap());
                    }
                    if (alt0_8.isSuccess()) {
                        result = alt0_8;
                    } else if (alt0_8.isCutFailure()) {
                        result = alt0_8.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '&':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_9 = matchLiteralCst("&=", false);
                    if (alt0_9.isSuccess() && alt0_9.node.isPresent()) {
                        children.add(alt0_9.node.unwrap());
                    }
                    if (alt0_9.isSuccess()) {
                        result = alt0_9;
                    } else if (alt0_9.isCutFailure()) {
                        result = alt0_9.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '|':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_10 = matchLiteralCst("|=", false);
                    if (alt0_10.isSuccess() && alt0_10.node.isPresent()) {
                        children.add(alt0_10.node.unwrap());
                    }
                    if (alt0_10.isSuccess()) {
                        result = alt0_10;
                    } else if (alt0_10.isCutFailure()) {
                        result = alt0_10.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '^':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_11 = matchLiteralCst("^=", false);
                    if (alt0_11.isSuccess() && alt0_11.node.isPresent()) {
                        children.add(alt0_11.node.unwrap());
                    }
                    if (alt0_11.isSuccess()) {
                        result = alt0_11;
                    } else if (alt0_11.isCutFailure()) {
                        result = alt0_11.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_Assignment_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ASSIGNMENT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Assignment();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Ternary() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(91, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TERNARY;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Ternary_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Ternary_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TERNARY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TERNARY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Ternary_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TERNARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_LogOr();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Ternary_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TERNARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("?", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_1 = parse_Expr();
                if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                    children.add(elem2_1.node.unwrap());
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_2 = matchLiteralCst(":", false);
                if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                    children.add(elem2_2.node.unwrap());
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_3 = parse_Ternary();
                if (elem2_3.isSuccess() && elem2_3.node.isPresent()) {
                    children.add(elem2_3.node.unwrap());
                }
                if (elem2_3.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_3;
                } else if (elem2_3.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_3.asCutFailure() : elem2_3;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_1;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_1 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_LogOr() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(92, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LOG_OR;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_LogAnd();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst("||", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_LogAnd();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LOG_OR, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LOG_OR, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_LogAnd() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(93, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LOG_AND;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_BitOr();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst("&&", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_BitOr();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LOG_AND, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LOG_AND, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_BitOr() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(94, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_BIT_OR;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_BitOr_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_BitOr_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_BIT_OR, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_BIT_OR, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_BitOr_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_BIT_OR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_BitXor();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_BitOr_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_BIT_OR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    int notStartPos3 = pos;
                    int notStartLine3 = line;
                    int notStartColumn3 = column;
                    var savedChildrenNot3 = new ArrayList<>(children);
                    var notElem3 = matchLiteralCst("||", false);
                    restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
                    children.clear();
                    children.addAll(savedChildrenNot3);
                    var elem2_0 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    int notStartPos5 = pos;
                    int notStartLine5 = line;
                    int notStartColumn5 = column;
                    var savedChildrenNot5 = new ArrayList<>(children);
                    var notElem5 = matchLiteralCst("|=", false);
                    restoreLocationRaw(notStartPos5, notStartLine5, notStartColumn5);
                    children.clear();
                    children.addAll(savedChildrenNot5);
                    var elem2_1 = notElem5.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_2 = matchLiteralCst("|", false);
                    if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                        children.add(elem2_2.node.unwrap());
                    }
                    if (elem2_2.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_2;
                    } else if (elem2_2.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_3 = parse_BitXor();
                    if (elem2_3.isSuccess() && elem2_3.node.isPresent()) {
                        children.add(elem2_3.node.unwrap());
                    }
                    if (elem2_3.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_3;
                    } else if (elem2_3.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_3.asCutFailure() : elem2_3;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_BitXor() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(95, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_BIT_XOR;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_BitXor_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_BitXor_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_BIT_XOR, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_BIT_XOR, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_BitXor_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_BIT_XOR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_BitAnd();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_BitXor_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_BIT_XOR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    int notStartPos3 = pos;
                    int notStartLine3 = line;
                    int notStartColumn3 = column;
                    var savedChildrenNot3 = new ArrayList<>(children);
                    var notElem3 = matchLiteralCst("^=", false);
                    restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
                    children.clear();
                    children.addAll(savedChildrenNot3);
                    var elem2_0 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_1 = matchLiteralCst("^", false);
                    if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                        children.add(elem2_1.node.unwrap());
                    }
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_2 = parse_BitAnd();
                    if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                        children.add(elem2_2.node.unwrap());
                    }
                    if (elem2_2.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_2;
                    } else if (elem2_2.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_BitAnd() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(96, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_BIT_AND;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_BitAnd_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_BitAnd_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_BIT_AND, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_BIT_AND, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_BitAnd_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_BIT_AND;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Equality();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_BitAnd_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_BIT_AND;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    int notStartPos3 = pos;
                    int notStartLine3 = line;
                    int notStartColumn3 = column;
                    var savedChildrenNot3 = new ArrayList<>(children);
                    var notElem3 = matchLiteralCst("&&", false);
                    restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
                    children.clear();
                    children.addAll(savedChildrenNot3);
                    var elem2_0 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    int notStartPos5 = pos;
                    int notStartLine5 = line;
                    int notStartColumn5 = column;
                    var savedChildrenNot5 = new ArrayList<>(children);
                    var notElem5 = matchLiteralCst("&=", false);
                    restoreLocationRaw(notStartPos5, notStartLine5, notStartColumn5);
                    children.clear();
                    children.addAll(savedChildrenNot5);
                    var elem2_1 = notElem5.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_2 = matchLiteralCst("&", false);
                    if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                        children.add(elem2_2.node.unwrap());
                    }
                    if (elem2_2.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_2;
                    } else if (elem2_2.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_3 = parse_Equality();
                    if (elem2_3.isSuccess() && elem2_3.node.isPresent()) {
                        children.add(elem2_3.node.unwrap());
                    }
                    if (elem2_3.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_3;
                    } else if (elem2_3.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_3.asCutFailure() : elem2_3;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Equality() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(97, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_EQUALITY;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Equality_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Equality_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_EQUALITY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_EQUALITY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Equality_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_EQUALITY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Relational();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Equality_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_EQUALITY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    CstParseResult elem2_0 = null;
                    int choiceStart4Pos = pos;
                    int choiceStart4Line = line;
                    int choiceStart4Column = column;
                    int choicePending4 = 0;
                    var savedChildren4 = new ArrayList<>(children);
                    if (pos < input.length()) {
                        char dispatchChar4 = input.charAt(pos);
                        switch (dispatchChar4) {
                            case '=':
                            {
                                children.clear();
                                children.addAll(savedChildren4);
                                var alt4_0 = matchLiteralCst("==", false);
                                if (alt4_0.isSuccess() && alt4_0.node.isPresent()) {
                                    children.add(alt4_0.node.unwrap());
                                }
                                if (alt4_0.isSuccess()) {
                                    elem2_0 = alt4_0;
                                } else if (alt4_0.isCutFailure()) {
                                    elem2_0 = alt4_0.asRegularFailure();
                                } else {
                                    restoreLocationRaw(choiceStart4Pos, choiceStart4Line, choiceStart4Column);
                                }
                                break;
                            }
                            case '!':
                            {
                                children.clear();
                                children.addAll(savedChildren4);
                                var alt4_1 = matchLiteralCst("!=", false);
                                if (alt4_1.isSuccess() && alt4_1.node.isPresent()) {
                                    children.add(alt4_1.node.unwrap());
                                }
                                if (alt4_1.isSuccess()) {
                                    elem2_0 = alt4_1;
                                } else if (alt4_1.isCutFailure()) {
                                    elem2_0 = alt4_1.asRegularFailure();
                                } else {
                                    restoreLocationRaw(choiceStart4Pos, choiceStart4Line, choiceStart4Column);
                                }
                                break;
                            }
                        }
                    }
                    if (elem2_0 == null) {
                        children.clear();
                        children.addAll(savedChildren4);
                        elem2_0 = CstParseResult.failure("one of alternatives");
                    }
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_1 = parse_Relational();
                    if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                        children.add(elem2_1.node.unwrap());
                    }
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Relational() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(98, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_RELATIONAL;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Relational_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Relational_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_RELATIONAL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_RELATIONAL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Relational_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RELATIONAL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Shift();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Relational_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RELATIONAL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = parse_Relational_choice0(children);
            CstParseResult elem_1;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_1 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Relational_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_RELATIONAL;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '<':
                case '>':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos1 = pos;
                    int seqStartLine1 = line;
                    int seqStartColumn1 = column;
                    int seqPending1 = 0;
                    var seqChildren1 = new ArrayList<>(children);
                    alt0_0 = parse_Relational_seq1_chunk0(children, seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1, seqChildren1);
                    if (alt0_0.isSuccess()) alt0_0 = parse_Relational_seq1_chunk1(children, seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1, seqChildren1);
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'i':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos2 = pos;
                    int seqStartLine2 = line;
                    int seqStartColumn2 = column;
                    int seqPending2 = 0;
                    var seqChildren2 = new ArrayList<>(children);
                    boolean cut2 = false;
                    if (alt0_1.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem2_0 = matchLiteralCst("instanceof", false);
                        if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                            children.add(elem2_0.node.unwrap());
                        }
                        if (elem2_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                            children.clear();
                            children.addAll(seqChildren2);
                            alt0_1 = elem2_0;
                        } else if (elem2_0.isFailure()) {
                            restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                            children.clear();
                            children.addAll(seqChildren2);
                            alt0_1 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        CstParseResult elem2_1 = null;
                        int choiceStart5Pos = pos;
                        int choiceStart5Line = line;
                        int choiceStart5Column = column;
                        int choicePending5 = 0;
                        var savedChildren5 = new ArrayList<>(children);
                        if (pos < input.length()) {
                            char dispatchChar5 = input.charAt(pos);
                            switch (dispatchChar5) {
                                case '$':
                                case '@':
                                case 'A':
                                case 'B':
                                case 'C':
                                case 'D':
                                case 'E':
                                case 'F':
                                case 'G':
                                case 'H':
                                case 'I':
                                case 'J':
                                case 'K':
                                case 'L':
                                case 'M':
                                case 'N':
                                case 'O':
                                case 'P':
                                case 'Q':
                                case 'R':
                                case 'S':
                                case 'T':
                                case 'U':
                                case 'V':
                                case 'W':
                                case 'X':
                                case 'Y':
                                case 'Z':
                                case '_':
                                case 'a':
                                case 'b':
                                case 'c':
                                case 'd':
                                case 'e':
                                case 'f':
                                case 'g':
                                case 'h':
                                case 'i':
                                case 'j':
                                case 'k':
                                case 'l':
                                case 'm':
                                case 'n':
                                case 'o':
                                case 'p':
                                case 'q':
                                case 'r':
                                case 's':
                                case 't':
                                case 'u':
                                case 'v':
                                case 'w':
                                case 'x':
                                case 'y':
                                case 'z':
                                {
                                    children.clear();
                                    children.addAll(savedChildren5);
                                    var alt5_0 = parse_Pattern();
                                    if (alt5_0.isSuccess() && alt5_0.node.isPresent()) {
                                        children.add(alt5_0.node.unwrap());
                                    }
                                    if (alt5_0.isSuccess()) {
                                        elem2_1 = alt5_0;
                                    } else if (alt5_0.isCutFailure()) {
                                        elem2_1 = alt5_0.asRegularFailure();
                                    } else {
                                        restoreLocationRaw(choiceStart5Pos, choiceStart5Line, choiceStart5Column);
                                    children.clear();
                                    children.addAll(savedChildren5);
                                    var alt5_1 = parse_Type();
                                    if (alt5_1.isSuccess() && alt5_1.node.isPresent()) {
                                        children.add(alt5_1.node.unwrap());
                                    }
                                    if (alt5_1.isSuccess()) {
                                        elem2_1 = alt5_1;
                                    } else if (alt5_1.isCutFailure()) {
                                        elem2_1 = alt5_1.asRegularFailure();
                                    } else {
                                        restoreLocationRaw(choiceStart5Pos, choiceStart5Line, choiceStart5Column);
                                    }
                                    }
                                    break;
                                }
                            }
                        }
                        if (elem2_1 == null) {
                            children.clear();
                            children.addAll(savedChildren5);
                            elem2_1 = CstParseResult.failure("one of alternatives");
                        }
                        if (elem2_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                            children.clear();
                            children.addAll(seqChildren2);
                            alt0_1 = elem2_1;
                        } else if (elem2_1.isFailure()) {
                            restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                            children.clear();
                            children.addAll(seqChildren2);
                            alt0_1 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_Relational_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RELATIONAL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case '<':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = matchLiteralCst("<=", false);
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_0 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_0 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_2 = matchLiteralCst("<", false);
                        if (alt1_2.isSuccess() && alt1_2.node.isPresent()) {
                            children.add(alt1_2.node.unwrap());
                        }
                        if (alt1_2.isSuccess()) {
                            elem_0 = alt1_2;
                        } else if (alt1_2.isCutFailure()) {
                            elem_0 = alt1_2.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                    case '>':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = matchLiteralCst(">=", false);
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_0 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_0 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_3 = matchLiteralCst(">", false);
                        if (alt1_3.isSuccess() && alt1_3.node.isPresent()) {
                            children.add(alt1_3.node.unwrap());
                        }
                        if (alt1_3.isSuccess()) {
                            elem_0 = alt1_3;
                        } else if (alt1_3.isCutFailure()) {
                            elem_0 = alt1_3.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                }
            }
            if (elem_0 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_0 = CstParseResult.failure("one of alternatives");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Relational_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_RELATIONAL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Shift();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Shift() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(99, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_SHIFT;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Shift_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Shift_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_SHIFT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_SHIFT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Shift_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SHIFT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Additive();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Shift_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_SHIFT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    CstParseResult elem2_0 = null;
                    int choiceStart4Pos = pos;
                    int choiceStart4Line = line;
                    int choiceStart4Column = column;
                    int choicePending4 = 0;
                    var savedChildren4 = new ArrayList<>(children);
                    if (pos < input.length()) {
                        char dispatchChar4 = input.charAt(pos);
                        switch (dispatchChar4) {
                            case '>':
                            {
                                children.clear();
                                children.addAll(savedChildren4);
                                var alt4_0 = parse_URShift();
                                if (alt4_0.isSuccess() && alt4_0.node.isPresent()) {
                                    children.add(alt4_0.node.unwrap());
                                }
                                if (alt4_0.isSuccess()) {
                                    elem2_0 = alt4_0;
                                } else if (alt4_0.isCutFailure()) {
                                    elem2_0 = alt4_0.asRegularFailure();
                                } else {
                                    restoreLocationRaw(choiceStart4Pos, choiceStart4Line, choiceStart4Column);
                                children.clear();
                                children.addAll(savedChildren4);
                                var alt4_2 = parse_RShift();
                                if (alt4_2.isSuccess() && alt4_2.node.isPresent()) {
                                    children.add(alt4_2.node.unwrap());
                                }
                                if (alt4_2.isSuccess()) {
                                    elem2_0 = alt4_2;
                                } else if (alt4_2.isCutFailure()) {
                                    elem2_0 = alt4_2.asRegularFailure();
                                } else {
                                    restoreLocationRaw(choiceStart4Pos, choiceStart4Line, choiceStart4Column);
                                }
                                }
                                break;
                            }
                            case '<':
                            {
                                children.clear();
                                children.addAll(savedChildren4);
                                var alt4_1 = parse_LShift();
                                if (alt4_1.isSuccess() && alt4_1.node.isPresent()) {
                                    children.add(alt4_1.node.unwrap());
                                }
                                if (alt4_1.isSuccess()) {
                                    elem2_0 = alt4_1;
                                } else if (alt4_1.isCutFailure()) {
                                    elem2_0 = alt4_1.asRegularFailure();
                                } else {
                                    restoreLocationRaw(choiceStart4Pos, choiceStart4Line, choiceStart4Column);
                                }
                                break;
                            }
                        }
                    }
                    if (elem2_0 == null) {
                        children.clear();
                        children.addAll(savedChildren4);
                        elem2_0 = CstParseResult.failure("one of alternatives");
                    }
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_1 = parse_Additive();
                    if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                        children.add(elem2_1.node.unwrap());
                    }
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_URShift() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_U_R_SHIFT;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst(">", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst(">", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(">", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            int notStartPos4 = pos;
            int notStartLine4 = line;
            int notStartColumn4 = column;
            var savedChildrenNot4 = new ArrayList<>(children);
            var notElem4 = matchLiteralCst("=", false);
            restoreLocationRaw(notStartPos4, notStartLine4, notStartColumn4);
            children.clear();
            children.addAll(savedChildrenNot4);
            var elem0_3 = notElem4.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_U_R_SHIFT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_U_R_SHIFT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_RShift() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_R_SHIFT;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst(">", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst(">", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var savedChildrenNot3 = new ArrayList<>(children);
            var notElem3 = matchLiteralCst(">", false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            children.clear();
            children.addAll(savedChildrenNot3);
            var elem0_2 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            int notStartPos5 = pos;
            int notStartLine5 = line;
            int notStartColumn5 = column;
            var savedChildrenNot5 = new ArrayList<>(children);
            var notElem5 = matchLiteralCst("=", false);
            restoreLocationRaw(notStartPos5, notStartLine5, notStartColumn5);
            children.clear();
            children.addAll(savedChildrenNot5);
            var elem0_3 = notElem5.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_R_SHIFT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_R_SHIFT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_LShift() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_L_SHIFT;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("<", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst("<", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var savedChildrenNot3 = new ArrayList<>(children);
            var notElem3 = matchLiteralCst("=", false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            children.clear();
            children.addAll(savedChildrenNot3);
            var elem0_2 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_L_SHIFT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_L_SHIFT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_URShiftAssign() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_U_R_SHIFT_ASSIGN;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst(">", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst(">", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(">", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_3 = matchLiteralCst("=", false);
            if (elem0_3.isSuccess() && elem0_3.node.isPresent()) {
                children.add(elem0_3.node.unwrap());
            }
            if (elem0_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_3;
            } else if (elem0_3.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_3.asCutFailure() : elem0_3;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_U_R_SHIFT_ASSIGN, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_U_R_SHIFT_ASSIGN, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_RShiftAssign() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_R_SHIFT_ASSIGN;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst(">", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst(">", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst("=", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_R_SHIFT_ASSIGN, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_R_SHIFT_ASSIGN, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_LShiftAssign() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_L_SHIFT_ASSIGN;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("<", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst("<", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst("=", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_L_SHIFT_ASSIGN, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_L_SHIFT_ASSIGN, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_Additive() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(106, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ADDITIVE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Additive_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Additive_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ADDITIVE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ADDITIVE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Additive_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ADDITIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Multiplicative();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Additive_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ADDITIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                zomElem0 = parse_Additive_seq1_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
                if (zomElem0.isSuccess()) zomElem0 = parse_Additive_seq1_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Additive_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ADDITIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = parse_Additive_choice0(children);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Additive_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_ADDITIVE;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '+':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos1 = pos;
                    int seqStartLine1 = line;
                    int seqStartColumn1 = column;
                    int seqPending1 = 0;
                    var seqChildren1 = new ArrayList<>(children);
                    boolean cut1 = false;
                    if (alt0_0.isSuccess()) {
                        int notStartPos2 = pos;
                        int notStartLine2 = line;
                        int notStartColumn2 = column;
                        var savedChildrenNot2 = new ArrayList<>(children);
                        var notElem2 = matchLiteralCst("+=", false);
                        restoreLocationRaw(notStartPos2, notStartLine2, notStartColumn2);
                        children.clear();
                        children.addAll(savedChildrenNot2);
                        var elem1_0 = notElem2.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                        if (elem1_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_0;
                        } else if (elem1_0.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_1 = matchLiteralCst("+", false);
                        if (elem1_1.isSuccess() && elem1_1.node.isPresent()) {
                            children.add(elem1_1.node.unwrap());
                        }
                        if (elem1_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_1;
                        } else if (elem1_1.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '-':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos5 = pos;
                    int seqStartLine5 = line;
                    int seqStartColumn5 = column;
                    int seqPending5 = 0;
                    var seqChildren5 = new ArrayList<>(children);
                    boolean cut5 = false;
                    if (alt0_1.isSuccess()) {
                        int notStartPos6 = pos;
                        int notStartLine6 = line;
                        int notStartColumn6 = column;
                        var savedChildrenNot6 = new ArrayList<>(children);
                        var notElem6 = matchLiteralCst("-=", false);
                        restoreLocationRaw(notStartPos6, notStartLine6, notStartColumn6);
                        children.clear();
                        children.addAll(savedChildrenNot6);
                        var elem5_0 = notElem6.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                        if (elem5_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = elem5_0;
                        } else if (elem5_0.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = cut5 ? elem5_0.asCutFailure() : elem5_0;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        int notStartPos8 = pos;
                        int notStartLine8 = line;
                        int notStartColumn8 = column;
                        var savedChildrenNot8 = new ArrayList<>(children);
                        var notElem8 = matchLiteralCst("->", false);
                        restoreLocationRaw(notStartPos8, notStartLine8, notStartColumn8);
                        children.clear();
                        children.addAll(savedChildrenNot8);
                        var elem5_1 = notElem8.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                        if (elem5_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = elem5_1;
                        } else if (elem5_1.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = cut5 ? elem5_1.asCutFailure() : elem5_1;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem5_2 = matchLiteralCst("-", false);
                        if (elem5_2.isSuccess() && elem5_2.node.isPresent()) {
                            children.add(elem5_2.node.unwrap());
                        }
                        if (elem5_2.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = elem5_2;
                        } else if (elem5_2.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = cut5 ? elem5_2.asCutFailure() : elem5_2;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos5, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_Additive_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ADDITIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Multiplicative();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Multiplicative() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(107, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_MULTIPLICATIVE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Multiplicative_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Multiplicative_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_MULTIPLICATIVE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_MULTIPLICATIVE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Multiplicative_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_MULTIPLICATIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Unary();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Multiplicative_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_MULTIPLICATIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                zomElem0 = parse_Multiplicative_seq1_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
                if (zomElem0.isSuccess()) zomElem0 = parse_Multiplicative_seq1_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Multiplicative_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_MULTIPLICATIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = parse_Multiplicative_choice0(children);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Multiplicative_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_MULTIPLICATIVE;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '*':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos1 = pos;
                    int seqStartLine1 = line;
                    int seqStartColumn1 = column;
                    int seqPending1 = 0;
                    var seqChildren1 = new ArrayList<>(children);
                    boolean cut1 = false;
                    if (alt0_0.isSuccess()) {
                        int notStartPos2 = pos;
                        int notStartLine2 = line;
                        int notStartColumn2 = column;
                        var savedChildrenNot2 = new ArrayList<>(children);
                        var notElem2 = matchLiteralCst("*=", false);
                        restoreLocationRaw(notStartPos2, notStartLine2, notStartColumn2);
                        children.clear();
                        children.addAll(savedChildrenNot2);
                        var elem1_0 = notElem2.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                        if (elem1_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_0;
                        } else if (elem1_0.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_1 = matchLiteralCst("*", false);
                        if (elem1_1.isSuccess() && elem1_1.node.isPresent()) {
                            children.add(elem1_1.node.unwrap());
                        }
                        if (elem1_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_1;
                        } else if (elem1_1.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '/':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos5 = pos;
                    int seqStartLine5 = line;
                    int seqStartColumn5 = column;
                    int seqPending5 = 0;
                    var seqChildren5 = new ArrayList<>(children);
                    boolean cut5 = false;
                    if (alt0_1.isSuccess()) {
                        int notStartPos6 = pos;
                        int notStartLine6 = line;
                        int notStartColumn6 = column;
                        var savedChildrenNot6 = new ArrayList<>(children);
                        var notElem6 = matchLiteralCst("/=", false);
                        restoreLocationRaw(notStartPos6, notStartLine6, notStartColumn6);
                        children.clear();
                        children.addAll(savedChildrenNot6);
                        var elem5_0 = notElem6.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                        if (elem5_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = elem5_0;
                        } else if (elem5_0.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = cut5 ? elem5_0.asCutFailure() : elem5_0;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem5_1 = matchLiteralCst("/", false);
                        if (elem5_1.isSuccess() && elem5_1.node.isPresent()) {
                            children.add(elem5_1.node.unwrap());
                        }
                        if (elem5_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = elem5_1;
                        } else if (elem5_1.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = cut5 ? elem5_1.asCutFailure() : elem5_1;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos5, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case '%':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_2 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos9 = pos;
                    int seqStartLine9 = line;
                    int seqStartColumn9 = column;
                    int seqPending9 = 0;
                    var seqChildren9 = new ArrayList<>(children);
                    boolean cut9 = false;
                    if (alt0_2.isSuccess()) {
                        int notStartPos10 = pos;
                        int notStartLine10 = line;
                        int notStartColumn10 = column;
                        var savedChildrenNot10 = new ArrayList<>(children);
                        var notElem10 = matchLiteralCst("%=", false);
                        restoreLocationRaw(notStartPos10, notStartLine10, notStartColumn10);
                        children.clear();
                        children.addAll(savedChildrenNot10);
                        var elem9_0 = notElem10.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                        if (elem9_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos9, seqStartLine9, seqStartColumn9);
                            children.clear();
                            children.addAll(seqChildren9);
                            alt0_2 = elem9_0;
                        } else if (elem9_0.isFailure()) {
                            restoreLocationRaw(seqStartPos9, seqStartLine9, seqStartColumn9);
                            children.clear();
                            children.addAll(seqChildren9);
                            alt0_2 = cut9 ? elem9_0.asCutFailure() : elem9_0;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem9_1 = matchLiteralCst("%", false);
                        if (elem9_1.isSuccess() && elem9_1.node.isPresent()) {
                            children.add(elem9_1.node.unwrap());
                        }
                        if (elem9_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos9, seqStartLine9, seqStartColumn9);
                            children.clear();
                            children.addAll(seqChildren9);
                            alt0_2 = elem9_1;
                        } else if (elem9_1.isFailure()) {
                            restoreLocationRaw(seqStartPos9, seqStartLine9, seqStartColumn9);
                            children.clear();
                            children.addAll(seqChildren9);
                            alt0_2 = cut9 ? elem9_1.asCutFailure() : elem9_1;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        alt0_2 = CstParseResult.successNoLoc(null, substring(seqStartPos9, pos));
                    }
                    if (alt0_2.isSuccess()) {
                        result = alt0_2;
                    } else if (alt0_2.isCutFailure()) {
                        result = alt0_2.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_Multiplicative_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_MULTIPLICATIVE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Unary();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Unary() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(108, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_UNARY;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '!':
                case '+':
                case '-':
                case '~':
                {
                    result = parse_Unary_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '(':
                {
                    result = parse_Unary_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Unary_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '"':
                case '$':
                case '\'':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_Unary_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_UNARY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_UNARY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Unary_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_UNARY;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_Unary_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_Unary_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_Unary_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_UNARY;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_1 = parse_Unary_seq1_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) alt0_1 = parse_Unary_seq1_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_Unary_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_UNARY;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = parse_Postfix();
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_Unary_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_UNARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case '+':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = matchLiteralCst("++", false);
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_0 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_0 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_2 = matchLiteralCst("+", false);
                        if (alt1_2.isSuccess() && alt1_2.node.isPresent()) {
                            children.add(alt1_2.node.unwrap());
                        }
                        if (alt1_2.isSuccess()) {
                            elem_0 = alt1_2;
                        } else if (alt1_2.isCutFailure()) {
                            elem_0 = alt1_2.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                    case '-':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = matchLiteralCst("--", false);
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_0 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_0 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_3 = matchLiteralCst("-", false);
                        if (alt1_3.isSuccess() && alt1_3.node.isPresent()) {
                            children.add(alt1_3.node.unwrap());
                        }
                        if (alt1_3.isSuccess()) {
                            elem_0 = alt1_3;
                        } else if (alt1_3.isCutFailure()) {
                            elem_0 = alt1_3.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                    case '!':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_4 = matchLiteralCst("!", false);
                        if (alt1_4.isSuccess() && alt1_4.node.isPresent()) {
                            children.add(alt1_4.node.unwrap());
                        }
                        if (alt1_4.isSuccess()) {
                            elem_0 = alt1_4;
                        } else if (alt1_4.isCutFailure()) {
                            elem_0 = alt1_4.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                    case '~':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_5 = matchLiteralCst("~", false);
                        if (alt1_5.isSuccess() && alt1_5.node.isPresent()) {
                            children.add(alt1_5.node.unwrap());
                        }
                        if (alt1_5.isSuccess()) {
                            elem_0 = alt1_5;
                        } else if (alt1_5.isCutFailure()) {
                            elem_0 = alt1_5.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                }
            }
            if (elem_0 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_0 = CstParseResult.failure("one of alternatives");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Unary_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_UNARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Unary();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Unary_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_UNARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("(", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_Type();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst("&", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_Type();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem_2 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_2.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_2 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Unary_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_UNARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(")", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = parse_Unary();
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_Postfix() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(109, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_POSTFIX;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Primary();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_PostOp();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_POSTFIX, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_POSTFIX, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_PostOp() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_POST_OP;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '.':
                {
                    result = parse_PostOp_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_PostOp_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_PostOp_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '[':
                {
                    result = parse_PostOp_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '(':
                {
                    result = parse_PostOp_alt4(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '+':
                {
                    result = parse_PostOp_alt5(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '-':
                {
                    result = parse_PostOp_alt6(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case ':':
                {
                    result = parse_PostOp_alt7(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_POST_OP, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_POST_OP, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_PostOp_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_POST_OP;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_PostOp_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_PostOp_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_PostOp_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_POST_OP;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst(".", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_1.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst("class", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_1 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_PostOp_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_POST_OP;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_2 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_2.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst(".", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_2 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_2 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_2.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst("this", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_2 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_2 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_2.isSuccess()) {
            alt0_2 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_PostOp_alt3(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_POST_OP;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_3 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_3.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("[", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_3 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_3 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_3.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Expr();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_3 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_3 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_3.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst("]", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_3 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_3 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_3.isSuccess()) {
            alt0_3 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_3.isSuccess()) {
            return alt0_3;
        }
        if (alt0_3.isCutFailure()) {
            return alt0_3;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_3;
    }

    private CstParseResult parse_PostOp_alt4(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_POST_OP;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_4 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_4.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("(", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_4 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_4 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_4.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos2 = pos;
            int optStartLine2 = line;
            int optStartColumn2 = column;
            int optPending2 = 0;
            var savedChildrenOpt2 = new ArrayList<>(children);
            children.clear();
            var optElem2 = parse_Args();
            if (optElem2.isSuccess() && optElem2.node.isPresent()) {
                children.add(optElem2.node.unwrap());
            }
            CstParseResult elem0_1;
            if (optElem2.isCutFailure()) {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem0_1 = optElem2;
            } else if (optElem2.isSuccess()) {
                var optChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt2);
                children.addAll(optChildren2);
                elem0_1 = optElem2;
            } else {
                restoreLocationRaw(optStartPos2, optStartLine2, optStartColumn2);
                children.clear();
                children.addAll(savedChildrenOpt2);
                elem0_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_4 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_4 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_4.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(")", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_4 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_4 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_4.isSuccess()) {
            alt0_4 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_4.isSuccess()) {
            return alt0_4;
        }
        if (alt0_4.isCutFailure()) {
            return alt0_4;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_4;
    }

    private CstParseResult parse_PostOp_alt5(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_POST_OP;
        children.clear();
        children.addAll(childrenState);
        var alt0_5 = matchLiteralCst("++", false);
        if (alt0_5.isSuccess() && alt0_5.node.isPresent()) {
            children.add(alt0_5.node.unwrap());
        }
        if (alt0_5.isSuccess()) {
            return alt0_5;
        }
        if (alt0_5.isCutFailure()) {
            return alt0_5;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_5;
    }

    private CstParseResult parse_PostOp_alt6(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_POST_OP;
        children.clear();
        children.addAll(childrenState);
        var alt0_6 = matchLiteralCst("--", false);
        if (alt0_6.isSuccess() && alt0_6.node.isPresent()) {
            children.add(alt0_6.node.unwrap());
        }
        if (alt0_6.isSuccess()) {
            return alt0_6;
        }
        if (alt0_6.isCutFailure()) {
            return alt0_6;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_6;
    }

    private CstParseResult parse_PostOp_alt7(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_POST_OP;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_7 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_7 = parse_PostOp_seq1_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_7.isSuccess()) alt0_7 = parse_PostOp_seq1_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_7.isSuccess()) {
            alt0_7 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_7.isSuccess()) {
            return alt0_7;
        }
        if (alt0_7.isCutFailure()) {
            return alt0_7;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_7;
    }

    private CstParseResult parse_PostOp_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_POST_OP;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst(".", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_TypeArgs();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_1;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_1 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Identifier();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_PostOp_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_POST_OP;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("(", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                int optStartPos4 = pos;
                int optStartLine4 = line;
                int optStartColumn4 = column;
                int optPending4 = 0;
                var savedChildrenOpt4 = new ArrayList<>(children);
                children.clear();
                var optElem4 = parse_Args();
                if (optElem4.isSuccess() && optElem4.node.isPresent()) {
                    children.add(optElem4.node.unwrap());
                }
                CstParseResult elem2_1;
                if (optElem4.isCutFailure()) {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    elem2_1 = optElem4;
                } else if (optElem4.isSuccess()) {
                    var optChildren4 = new ArrayList<>(children);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    children.addAll(optChildren4);
                    elem2_1 = optElem4;
                } else {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    elem2_1 = CstParseResult.successNoLoc(null, "");
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_2 = matchLiteralCst(")", false);
                if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                    children.add(elem2_2.node.unwrap());
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_PostOp_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_POST_OP;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("::", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_TypeArgs();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_1;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_1 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_PostOp_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_POST_OP;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case '$':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case '_':
                    case 'a':
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'e':
                    case 'f':
                    case 'g':
                    case 'h':
                    case 'i':
                    case 'j':
                    case 'k':
                    case 'l':
                    case 'm':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 's':
                    case 't':
                    case 'u':
                    case 'v':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = parse_Identifier();
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_2 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_2 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                    case 'n':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = parse_Identifier();
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_2 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_2 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = matchLiteralCst("new", false);
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_2 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_2 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                }
            }
            if (elem_2 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_2 = CstParseResult.failure("one of alternatives");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Primary() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PRIMARY;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '"':
                case '\'':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                {
                    result = parse_Primary_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'f':
                {
                    result = parse_Primary_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt5(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt7(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt8(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 'n':
                {
                    result = parse_Primary_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt5(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt7(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt8(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 't':
                {
                    result = parse_Primary_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt5(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt7(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt8(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case 's':
                {
                    result = parse_Primary_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt4(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt5(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt7(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt8(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_Primary_alt5(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt7(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt8(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '(':
                {
                    result = parse_Primary_alt5(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_Primary_alt6(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '@':
                {
                    result = parse_Primary_alt7(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PRIMARY, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PRIMARY, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_Primary_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_Literal();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_Primary_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("this", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_1;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_1 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_1 = tbElem0;
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_Primary_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("super", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            int notStartPos3 = pos;
            int notStartLine3 = line;
            int notStartColumn3 = column;
            var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
            var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_2;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_2 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_2 = tbElem0;
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_Primary_alt3(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_3 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_3 = parse_Primary_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_3.isSuccess()) alt0_3 = parse_Primary_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_3.isSuccess()) alt0_3 = parse_Primary_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_3.isSuccess()) {
            alt0_3 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_3.isSuccess()) {
            return alt0_3;
        }
        if (alt0_3.isCutFailure()) {
            return alt0_3;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_3;
    }

    private CstParseResult parse_Primary_alt4(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_4 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_4 = parse_Primary_seq1_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_4.isSuccess()) alt0_4 = parse_Primary_seq1_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_4.isSuccess()) {
            alt0_4 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_4.isSuccess()) {
            return alt0_4;
        }
        if (alt0_4.isCutFailure()) {
            return alt0_4;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_4;
    }

    private CstParseResult parse_Primary_alt5(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        var alt0_5 = parse_Lambda();
        if (alt0_5.isSuccess() && alt0_5.node.isPresent()) {
            children.add(alt0_5.node.unwrap());
        }
        if (alt0_5.isSuccess()) {
            return alt0_5;
        }
        if (alt0_5.isCutFailure()) {
            return alt0_5;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_5;
    }

    private CstParseResult parse_Primary_alt6(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_6 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_6.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("(", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_6 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_6 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_6.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Expr();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_6 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_6 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_6.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_2 = matchLiteralCst(")", false);
            if (elem0_2.isSuccess() && elem0_2.node.isPresent()) {
                children.add(elem0_2.node.unwrap());
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_6 = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_6 = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (alt0_6.isSuccess()) {
            alt0_6 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_6.isSuccess()) {
            return alt0_6;
        }
        if (alt0_6.isCutFailure()) {
            return alt0_6;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_6;
    }

    private CstParseResult parse_Primary_alt7(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        var alt0_7 = parse_TypeExpr();
        if (alt0_7.isSuccess() && alt0_7.node.isPresent()) {
            children.add(alt0_7.node.unwrap());
        }
        if (alt0_7.isSuccess()) {
            return alt0_7;
        }
        if (alt0_7.isCutFailure()) {
            return alt0_7;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_7;
    }

    private CstParseResult parse_Primary_alt8(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_PRIMARY;
        children.clear();
        children.addAll(childrenState);
        var alt0_8 = parse_QualifiedName();
        if (alt0_8.isSuccess() && alt0_8.node.isPresent()) {
            children.add(alt0_8.node.unwrap());
        }
        if (alt0_8.isSuccess()) {
            return alt0_8;
        }
        if (alt0_8.isCutFailure()) {
            return alt0_8;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_8;
    }

    private CstParseResult parse_Primary_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PRIMARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int tbStartPos0 = pos;
            int tbStartLine0 = line;
            int tbStartColumn0 = column;
            tokenBoundaryDepth++;
            var savedChildrenTb0 = new ArrayList<>(children);
            CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos1 = pos;
            int seqStartLine1 = line;
            int seqStartColumn1 = column;
            int seqPending1 = 0;
            boolean cut1 = false;
            if (tbElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem1_0 = matchLiteralCst("new", false);
                if (elem1_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                    tbElem0 = elem1_0;
                } else if (elem1_0.isFailure()) {
                    restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                    tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
                }
            }
            if (tbElem0.isSuccess()) {
                int notStartPos3 = pos;
                int notStartLine3 = line;
                int notStartColumn3 = column;
                var notElem3 = matchCharClassCst("a-zA-Z0-9_$", false, false);
                restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
                var elem1_1 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                if (elem1_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                    tbElem0 = elem1_1;
                } else if (elem1_1.isFailure()) {
                    restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                    tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
                }
            }
            if (tbElem0.isSuccess()) {
                tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
            }
            tokenBoundaryDepth--;
            children.clear();
            children.addAll(savedChildrenTb0);
            CstParseResult elem_0;
            if (tbElem0.isSuccess()) {
                var tbText0 = substringSpan(tbStartPos0, pos);
                var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
                var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
                children.add(tbNode0);
                elem_0 = CstParseResult.successNoLoc(tbNode0, tbText0);
            } else {
                elem_0 = tbElem0;
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Primary_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PRIMARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = parse_TypeArgs();
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_1;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_1 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_ArrayType();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Primary_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PRIMARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_3 = parse_Primary_choice0(children);
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_Primary_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_PRIMARY;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '@':
                case '[':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos1 = pos;
                    int seqStartLine1 = line;
                    int seqStartColumn1 = column;
                    int seqPending1 = 0;
                    var seqChildren1 = new ArrayList<>(children);
                    boolean cut1 = false;
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_0 = parse_DimExprs();
                        if (elem1_0.isSuccess() && elem1_0.node.isPresent()) {
                            children.add(elem1_0.node.unwrap());
                        }
                        if (elem1_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_0;
                        } else if (elem1_0.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        int optStartPos3 = pos;
                        int optStartLine3 = line;
                        int optStartColumn3 = column;
                        int optPending3 = 0;
                        var savedChildrenOpt3 = new ArrayList<>(children);
                        children.clear();
                        var optElem3 = parse_Dims();
                        if (optElem3.isSuccess() && optElem3.node.isPresent()) {
                            children.add(optElem3.node.unwrap());
                        }
                        CstParseResult elem1_1;
                        if (optElem3.isCutFailure()) {
                            restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                            children.clear();
                            children.addAll(savedChildrenOpt3);
                            elem1_1 = optElem3;
                        } else if (optElem3.isSuccess()) {
                            var optChildren3 = new ArrayList<>(children);
                            children.clear();
                            children.addAll(savedChildrenOpt3);
                            children.addAll(optChildren3);
                            elem1_1 = optElem3;
                        } else {
                            restoreLocationRaw(optStartPos3, optStartLine3, optStartColumn3);
                            children.clear();
                            children.addAll(savedChildrenOpt3);
                            elem1_1 = CstParseResult.successNoLoc(null, "");
                        }
                        if (elem1_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_1;
                        } else if (elem1_1.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos5 = pos;
                    int seqStartLine5 = line;
                    int seqStartColumn5 = column;
                    int seqPending5 = 0;
                    var seqChildren5 = new ArrayList<>(children);
                    boolean cut5 = false;
                    if (alt0_1.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem5_0 = parse_Dims();
                        if (elem5_0.isSuccess() && elem5_0.node.isPresent()) {
                            children.add(elem5_0.node.unwrap());
                        }
                        if (elem5_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = elem5_0;
                        } else if (elem5_0.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = cut5 ? elem5_0.asCutFailure() : elem5_0;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem5_1 = parse_VarInit();
                        if (elem5_1.isSuccess() && elem5_1.node.isPresent()) {
                            children.add(elem5_1.node.unwrap());
                        }
                        if (elem5_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = elem5_1;
                        } else if (elem5_1.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            children.clear();
                            children.addAll(seqChildren5);
                            alt0_1 = cut5 ? elem5_1.asCutFailure() : elem5_1;
                        }
                    }
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos5, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case '(':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_2 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos8 = pos;
                    int seqStartLine8 = line;
                    int seqStartColumn8 = column;
                    int seqPending8 = 0;
                    var seqChildren8 = new ArrayList<>(children);
                    boolean cut8 = false;
                    if (alt0_2.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem8_0 = matchLiteralCst("(", false);
                        if (elem8_0.isSuccess() && elem8_0.node.isPresent()) {
                            children.add(elem8_0.node.unwrap());
                        }
                        if (elem8_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                            children.clear();
                            children.addAll(seqChildren8);
                            alt0_2 = elem8_0;
                        } else if (elem8_0.isFailure()) {
                            restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                            children.clear();
                            children.addAll(seqChildren8);
                            alt0_2 = cut8 ? elem8_0.asCutFailure() : elem8_0;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        int optStartPos10 = pos;
                        int optStartLine10 = line;
                        int optStartColumn10 = column;
                        int optPending10 = 0;
                        var savedChildrenOpt10 = new ArrayList<>(children);
                        children.clear();
                        var optElem10 = parse_Args();
                        if (optElem10.isSuccess() && optElem10.node.isPresent()) {
                            children.add(optElem10.node.unwrap());
                        }
                        CstParseResult elem8_1;
                        if (optElem10.isCutFailure()) {
                            restoreLocationRaw(optStartPos10, optStartLine10, optStartColumn10);
                            children.clear();
                            children.addAll(savedChildrenOpt10);
                            elem8_1 = optElem10;
                        } else if (optElem10.isSuccess()) {
                            var optChildren10 = new ArrayList<>(children);
                            children.clear();
                            children.addAll(savedChildrenOpt10);
                            children.addAll(optChildren10);
                            elem8_1 = optElem10;
                        } else {
                            restoreLocationRaw(optStartPos10, optStartLine10, optStartColumn10);
                            children.clear();
                            children.addAll(savedChildrenOpt10);
                            elem8_1 = CstParseResult.successNoLoc(null, "");
                        }
                        if (elem8_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                            children.clear();
                            children.addAll(seqChildren8);
                            alt0_2 = elem8_1;
                        } else if (elem8_1.isFailure()) {
                            restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                            children.clear();
                            children.addAll(seqChildren8);
                            alt0_2 = cut8 ? elem8_1.asCutFailure() : elem8_1;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem8_2 = matchLiteralCst(")", false);
                        if (elem8_2.isSuccess() && elem8_2.node.isPresent()) {
                            children.add(elem8_2.node.unwrap());
                        }
                        if (elem8_2.isCutFailure()) {
                            restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                            children.clear();
                            children.addAll(seqChildren8);
                            alt0_2 = elem8_2;
                        } else if (elem8_2.isFailure()) {
                            restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                            children.clear();
                            children.addAll(seqChildren8);
                            alt0_2 = cut8 ? elem8_2.asCutFailure() : elem8_2;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        int optStartPos13 = pos;
                        int optStartLine13 = line;
                        int optStartColumn13 = column;
                        int optPending13 = 0;
                        var savedChildrenOpt13 = new ArrayList<>(children);
                        children.clear();
                        var optElem13 = parse_ClassBody();
                        if (optElem13.isSuccess() && optElem13.node.isPresent()) {
                            children.add(optElem13.node.unwrap());
                        }
                        CstParseResult elem8_3;
                        if (optElem13.isCutFailure()) {
                            restoreLocationRaw(optStartPos13, optStartLine13, optStartColumn13);
                            children.clear();
                            children.addAll(savedChildrenOpt13);
                            elem8_3 = optElem13;
                        } else if (optElem13.isSuccess()) {
                            var optChildren13 = new ArrayList<>(children);
                            children.clear();
                            children.addAll(savedChildrenOpt13);
                            children.addAll(optChildren13);
                            elem8_3 = optElem13;
                        } else {
                            restoreLocationRaw(optStartPos13, optStartLine13, optStartColumn13);
                            children.clear();
                            children.addAll(savedChildrenOpt13);
                            elem8_3 = CstParseResult.successNoLoc(null, "");
                        }
                        if (elem8_3.isCutFailure()) {
                            restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                            children.clear();
                            children.addAll(seqChildren8);
                            alt0_2 = elem8_3;
                        } else if (elem8_3.isFailure()) {
                            restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                            children.clear();
                            children.addAll(seqChildren8);
                            alt0_2 = cut8 ? elem8_3.asCutFailure() : elem8_3;
                        }
                    }
                    if (alt0_2.isSuccess()) {
                        alt0_2 = CstParseResult.successNoLoc(null, substring(seqStartPos8, pos));
                    }
                    if (alt0_2.isSuccess()) {
                        result = alt0_2;
                    } else if (alt0_2.isCutFailure()) {
                        result = alt0_2.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_Primary_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PRIMARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_SwitchKW();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = matchLiteralCst("(", false);
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Expr();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Primary_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_PRIMARY;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(")", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = parse_SwitchBlock();
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeExpr() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_EXPR;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_TypeExpr_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_TypeExpr_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_EXPR, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_EXPR, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_TypeExpr_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_EXPR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Type();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeExpr_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_EXPR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = parse_TypeExpr_choice0(children);
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeExpr_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_TYPE_EXPR;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '.':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos1 = pos;
                    int seqStartLine1 = line;
                    int seqStartColumn1 = column;
                    int seqPending1 = 0;
                    var seqChildren1 = new ArrayList<>(children);
                    boolean cut1 = false;
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem1_0 = matchLiteralCst(".", false);
                        if (elem1_0.isSuccess() && elem1_0.node.isPresent()) {
                            children.add(elem1_0.node.unwrap());
                        }
                        if (elem1_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_0;
                        } else if (elem1_0.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        int tbStartPos3 = pos;
                        int tbStartLine3 = line;
                        int tbStartColumn3 = column;
                        tokenBoundaryDepth++;
                        var savedChildrenTb3 = new ArrayList<>(children);
                        var tbElem3 = matchLiteralCst("class", false);
                        tokenBoundaryDepth--;
                        children.clear();
                        children.addAll(savedChildrenTb3);
                        CstParseResult elem1_1;
                        if (tbElem3.isSuccess()) {
                            var tbText3 = substringSpan(tbStartPos3, pos);
                            var tbSpan3 = new SourceSpan(tbStartLine3, tbStartColumn3, tbStartPos3, line, column, pos);
                            var tbNode3 = new CstNode.Token(idGen.next(), tbSpan3, __ruleName, tbText3, List.<Trivia>of(), List.of());
                            children.add(tbNode3);
                            elem1_1 = CstParseResult.successNoLoc(tbNode3, tbText3);
                        } else {
                            elem1_1 = tbElem3;
                        }
                        if (elem1_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = elem1_1;
                        } else if (elem1_1.isFailure()) {
                            restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                            children.clear();
                            children.addAll(seqChildren1);
                            alt0_0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
                        }
                    }
                    if (alt0_0.isSuccess()) {
                        alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case ':':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos5 = pos;
                    int seqStartLine5 = line;
                    int seqStartColumn5 = column;
                    int seqPending5 = 0;
                    var seqChildren5 = new ArrayList<>(children);
                    alt0_1 = parse_TypeExpr_seq1_chunk0(children, seqStartPos5, seqStartLine5, seqStartColumn5, seqPending5, seqChildren5);
                    if (alt0_1.isSuccess()) alt0_1 = parse_TypeExpr_seq1_chunk1(children, seqStartPos5, seqStartLine5, seqStartColumn5, seqPending5, seqChildren5);
                    if (alt0_1.isSuccess()) {
                        alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos5, pos));
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_TypeExpr_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_EXPR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("::", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_TypeArgs();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_1;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_1 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeExpr_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_EXPR;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case 'n':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        int tbStartPos2 = pos;
                        int tbStartLine2 = line;
                        int tbStartColumn2 = column;
                        tokenBoundaryDepth++;
                        var savedChildrenTb2 = new ArrayList<>(children);
                        var tbElem2 = matchLiteralCst("new", false);
                        tokenBoundaryDepth--;
                        children.clear();
                        children.addAll(savedChildrenTb2);
                        CstParseResult alt1_0;
                        if (tbElem2.isSuccess()) {
                            var tbText2 = substringSpan(tbStartPos2, pos);
                            var tbSpan2 = new SourceSpan(tbStartLine2, tbStartColumn2, tbStartPos2, line, column, pos);
                            var tbNode2 = new CstNode.Token(idGen.next(), tbSpan2, __ruleName, tbText2, List.<Trivia>of(), List.of());
                            children.add(tbNode2);
                            alt1_0 = CstParseResult.successNoLoc(tbNode2, tbText2);
                        } else {
                            alt1_0 = tbElem2;
                        }
                        if (alt1_0.isSuccess()) {
                            elem_2 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_2 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_Identifier();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_2 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_2 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                    case '$':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case '_':
                    case 'a':
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'e':
                    case 'f':
                    case 'g':
                    case 'h':
                    case 'i':
                    case 'j':
                    case 'k':
                    case 'l':
                    case 'm':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 's':
                    case 't':
                    case 'u':
                    case 'v':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_Identifier();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_2 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_2 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                }
            }
            if (elem_2 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_2 = CstParseResult.failure("one of alternatives");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Lambda() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LAMBDA;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_LambdaParams();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst("->", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_2 = null;
            int choiceStart4Pos = pos;
            int choiceStart4Line = line;
            int choiceStart4Column = column;
            int choicePending4 = 0;
            var savedChildren4 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar4 = input.charAt(pos);
                switch (dispatchChar4) {
                    case '!':
                    case '"':
                    case '$':
                    case '\'':
                    case '(':
                    case '+':
                    case '-':
                    case '.':
                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                    case '@':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case '_':
                    case 'a':
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'e':
                    case 'f':
                    case 'g':
                    case 'h':
                    case 'i':
                    case 'j':
                    case 'k':
                    case 'l':
                    case 'm':
                    case 'n':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 's':
                    case 't':
                    case 'u':
                    case 'v':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    case '~':
                    {
                        children.clear();
                        children.addAll(savedChildren4);
                        var alt4_0 = parse_Expr();
                        if (alt4_0.isSuccess() && alt4_0.node.isPresent()) {
                            children.add(alt4_0.node.unwrap());
                        }
                        if (alt4_0.isSuccess()) {
                            elem0_2 = alt4_0;
                        } else if (alt4_0.isCutFailure()) {
                            elem0_2 = alt4_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart4Pos, choiceStart4Line, choiceStart4Column);
                        }
                        break;
                    }
                    case '{':
                    {
                        children.clear();
                        children.addAll(savedChildren4);
                        var alt4_1 = parse_Block();
                        if (alt4_1.isSuccess() && alt4_1.node.isPresent()) {
                            children.add(alt4_1.node.unwrap());
                        }
                        if (alt4_1.isSuccess()) {
                            elem0_2 = alt4_1;
                        } else if (alt4_1.isCutFailure()) {
                            elem0_2 = alt4_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart4Pos, choiceStart4Line, choiceStart4Column);
                        }
                        break;
                    }
                }
            }
            if (elem0_2 == null) {
                children.clear();
                children.addAll(savedChildren4);
                elem0_2 = CstParseResult.failure("one of alternatives");
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LAMBDA, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LAMBDA, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_LambdaParams() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(114, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LAMBDA_PARAMS;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_LambdaParams_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '_':
                {
                    result = parse_LambdaParams_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_LambdaParams_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '(':
                {
                    result = parse_LambdaParams_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LAMBDA_PARAMS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LAMBDA_PARAMS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_LambdaParams_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LAMBDA_PARAMS;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_Identifier();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_LambdaParams_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LAMBDA_PARAMS;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = matchLiteralCst("_", false);
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_LambdaParams_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LAMBDA_PARAMS;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_2 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_2 = parse_LambdaParams_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_2.isSuccess()) alt0_2 = parse_LambdaParams_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_2.isSuccess()) {
            alt0_2 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_LambdaParams_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LAMBDA_PARAMS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("(", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos1 = pos;
            int optStartLine1 = line;
            int optStartColumn1 = column;
            int optPending1 = 0;
            var savedChildrenOpt1 = new ArrayList<>(children);
            children.clear();
            var optElem1 = parse_LambdaParam();
            if (optElem1.isSuccess() && optElem1.node.isPresent()) {
                children.add(optElem1.node.unwrap());
            }
            CstParseResult elem_1;
            if (optElem1.isCutFailure()) {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = optElem1;
            } else if (optElem1.isSuccess()) {
                var optChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt1);
                children.addAll(optChildren1);
                elem_1 = optElem1;
            } else {
                restoreLocationRaw(optStartPos1, optStartLine1, optStartColumn1);
                children.clear();
                children.addAll(savedChildrenOpt1);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_LambdaParams_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LAMBDA_PARAMS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_0 = matchLiteralCst(",", false);
                    if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                        children.add(elem2_0.node.unwrap());
                    }
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_1 = parse_LambdaParam();
                    if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                        children.add(elem2_1.node.unwrap());
                    }
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_2 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_2.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_2 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(")", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_LambdaParam() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(115, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LAMBDA_PARAM;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_LambdaParam_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_LambdaParam_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_LambdaParam_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LAMBDA_PARAM, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LAMBDA_PARAM, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_LambdaParam_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LAMBDA_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem2 = parse_Modifier();
                if (zomElem2.isSuccess() && zomElem2.node.isPresent()) {
                    children.add(zomElem2.node.unwrap());
                }
                if (zomElem2.isCutFailure()) {
                    elem_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_LambdaParam_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LAMBDA_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            optElem0 = parse_LambdaParam_seq1_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) optElem0 = parse_LambdaParam_seq1_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_LambdaParam_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LAMBDA_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case 'v':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        int tbStartPos2 = pos;
                        int tbStartLine2 = line;
                        int tbStartColumn2 = column;
                        tokenBoundaryDepth++;
                        var savedChildrenTb2 = new ArrayList<>(children);
                        CstParseResult tbElem2 = CstParseResult.successNoLoc(null, "");
                        int seqStartPos3 = pos;
                        int seqStartLine3 = line;
                        int seqStartColumn3 = column;
                        int seqPending3 = 0;
                        boolean cut3 = false;
                        if (tbElem2.isSuccess()) {
                            if (tokenBoundaryDepth == 0) skipWhitespace();
                            var elem3_0 = matchLiteralCst("var", false);
                            if (elem3_0.isCutFailure()) {
                                restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                                tbElem2 = elem3_0;
                            } else if (elem3_0.isFailure()) {
                                restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                                tbElem2 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                            }
                        }
                        if (tbElem2.isSuccess()) {
                            int notStartPos5 = pos;
                            int notStartLine5 = line;
                            int notStartColumn5 = column;
                            var notElem5 = matchCharClassCst("a-zA-Z0-9_$", false, false);
                            restoreLocationRaw(notStartPos5, notStartLine5, notStartColumn5);
                            var elem3_1 = notElem5.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                            if (elem3_1.isCutFailure()) {
                                restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                                tbElem2 = elem3_1;
                            } else if (elem3_1.isFailure()) {
                                restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                                tbElem2 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                            }
                        }
                        if (tbElem2.isSuccess()) {
                            tbElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
                        }
                        tokenBoundaryDepth--;
                        children.clear();
                        children.addAll(savedChildrenTb2);
                        CstParseResult alt1_0;
                        if (tbElem2.isSuccess()) {
                            var tbText2 = substringSpan(tbStartPos2, pos);
                            var tbSpan2 = new SourceSpan(tbStartLine2, tbStartColumn2, tbStartPos2, line, column, pos);
                            var tbNode2 = new CstNode.Token(idGen.next(), tbSpan2, __ruleName, tbText2, List.<Trivia>of(), List.of());
                            children.add(tbNode2);
                            alt1_0 = CstParseResult.successNoLoc(tbNode2, tbText2);
                        } else {
                            alt1_0 = tbElem2;
                        }
                        if (alt1_0.isSuccess()) {
                            elem_0 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_0 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_Type();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_0 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_0 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                    case '$':
                    case '@':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case '_':
                    case 'a':
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'e':
                    case 'f':
                    case 'g':
                    case 'h':
                    case 'i':
                    case 'j':
                    case 'k':
                    case 'l':
                    case 'm':
                    case 'n':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 's':
                    case 't':
                    case 'u':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_Type();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_0 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_0 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                }
            }
            if (elem_0 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_0 = CstParseResult.failure("one of alternatives");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_LambdaParam_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LAMBDA_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int andStartPos0 = pos;
            int andStartLine0 = line;
            int andStartColumn0 = column;
            var savedChildrenAnd0 = new ArrayList<>(children);
            CstParseResult andElem0 = null;
            int choiceStart2Pos = pos;
            int choiceStart2Line = line;
            int choiceStart2Column = column;
            int choicePending2 = 0;
            if (pos < input.length()) {
                char dispatchChar2 = input.charAt(pos);
                switch (dispatchChar2) {
                    case '.':
                    {
                        var alt2_0 = matchLiteralCst("...", false);
                        if (alt2_0.isSuccess()) {
                            andElem0 = alt2_0;
                        } else if (alt2_0.isCutFailure()) {
                            andElem0 = alt2_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                        }
                        break;
                    }
                    case '$':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case 'a':
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'e':
                    case 'f':
                    case 'g':
                    case 'h':
                    case 'i':
                    case 'j':
                    case 'k':
                    case 'l':
                    case 'm':
                    case 'n':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 's':
                    case 't':
                    case 'u':
                    case 'v':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    {
                        var alt2_1 = parse_Identifier();
                        if (alt2_1.isSuccess()) {
                            andElem0 = alt2_1;
                        } else if (alt2_1.isCutFailure()) {
                            andElem0 = alt2_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                        }
                        break;
                    }
                    case '_':
                    {
                        var alt2_1 = parse_Identifier();
                        if (alt2_1.isSuccess()) {
                            andElem0 = alt2_1;
                        } else if (alt2_1.isCutFailure()) {
                            andElem0 = alt2_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                        var alt2_2 = matchLiteralCst("_", false);
                        if (alt2_2.isSuccess()) {
                            andElem0 = alt2_2;
                        } else if (alt2_2.isCutFailure()) {
                            andElem0 = alt2_2.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                        }
                        }
                        break;
                    }
                }
            }
            if (andElem0 == null) {
                andElem0 = CstParseResult.failure("one of alternatives");
            }
            restoreLocationRaw(andStartPos0, andStartLine0, andStartColumn0);
            children.clear();
            children.addAll(savedChildrenAnd0);
            var elem_1 = andElem0.isSuccess() ? CstParseResult.successNoLoc(null, "") : andElem0;
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_LambdaParam_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_LAMBDA_PARAM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = matchLiteralCst("...", false);
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_4 = null;
            int choiceStart3Pos = pos;
            int choiceStart3Line = line;
            int choiceStart3Column = column;
            int choicePending3 = 0;
            var savedChildren3 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar3 = input.charAt(pos);
                switch (dispatchChar3) {
                    case '$':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case 'a':
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'e':
                    case 'f':
                    case 'g':
                    case 'h':
                    case 'i':
                    case 'j':
                    case 'k':
                    case 'l':
                    case 'm':
                    case 'n':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 's':
                    case 't':
                    case 'u':
                    case 'v':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    {
                        children.clear();
                        children.addAll(savedChildren3);
                        var alt3_0 = parse_Identifier();
                        if (alt3_0.isSuccess() && alt3_0.node.isPresent()) {
                            children.add(alt3_0.node.unwrap());
                        }
                        if (alt3_0.isSuccess()) {
                            elem_4 = alt3_0;
                        } else if (alt3_0.isCutFailure()) {
                            elem_4 = alt3_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart3Pos, choiceStart3Line, choiceStart3Column);
                        }
                        break;
                    }
                    case '_':
                    {
                        children.clear();
                        children.addAll(savedChildren3);
                        var alt3_0 = parse_Identifier();
                        if (alt3_0.isSuccess() && alt3_0.node.isPresent()) {
                            children.add(alt3_0.node.unwrap());
                        }
                        if (alt3_0.isSuccess()) {
                            elem_4 = alt3_0;
                        } else if (alt3_0.isCutFailure()) {
                            elem_4 = alt3_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart3Pos, choiceStart3Line, choiceStart3Column);
                        children.clear();
                        children.addAll(savedChildren3);
                        var alt3_1 = matchLiteralCst("_", false);
                        if (alt3_1.isSuccess() && alt3_1.node.isPresent()) {
                            children.add(alt3_1.node.unwrap());
                        }
                        if (alt3_1.isSuccess()) {
                            elem_4 = alt3_1;
                        } else if (alt3_1.isCutFailure()) {
                            elem_4 = alt3_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart3Pos, choiceStart3Line, choiceStart3Column);
                        }
                        }
                        break;
                    }
                }
            }
            if (elem_4 == null) {
                children.clear();
                children.addAll(savedChildren3);
                elem_4 = CstParseResult.failure("one of alternatives");
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_Args() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(116, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ARGS;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Expr();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_Expr();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ARGS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ARGS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ExprList() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(117, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_EXPR_LIST;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = parse_Expr();
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_Expr();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem0_1 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem0_1.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem0_1 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_EXPR_LIST, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_EXPR_LIST, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Type() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(118, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Type_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Type_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Type_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Type_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'f':
                    case 'i':
                    case 'l':
                    case 's':
                    case 'v':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = parse_PrimType();
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_1 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_1 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_RefType();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_1 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_1 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                    case '$':
                    case '@':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case '_':
                    case 'a':
                    case 'e':
                    case 'g':
                    case 'h':
                    case 'j':
                    case 'k':
                    case 'm':
                    case 'n':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 't':
                    case 'u':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_RefType();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_1 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_1 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                }
            }
            if (elem_1 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_1 = CstParseResult.failure("one of alternatives");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos5 = pos;
            int optStartLine5 = line;
            int optStartColumn5 = column;
            int optPending5 = 0;
            var savedChildrenOpt5 = new ArrayList<>(children);
            children.clear();
            var optElem5 = parse_Dims();
            if (optElem5.isSuccess() && optElem5.node.isPresent()) {
                children.add(optElem5.node.unwrap());
            }
            CstParseResult elem_2;
            if (optElem5.isCutFailure()) {
                restoreLocationRaw(optStartPos5, optStartLine5, optStartColumn5);
                children.clear();
                children.addAll(savedChildrenOpt5);
                elem_2 = optElem5;
            } else if (optElem5.isSuccess()) {
                var optChildren5 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt5);
                children.addAll(optChildren5);
                elem_2 = optElem5;
            } else {
                restoreLocationRaw(optStartPos5, optStartLine5, optStartColumn5);
                children.clear();
                children.addAll(savedChildrenOpt5);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_PrimType() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(119, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_PRIM_TYPE;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        tbElem0 = parse_PrimType_seq0_chunk0(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_PrimType_seq0_chunk1(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_PRIM_TYPE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_PRIM_TYPE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_PrimType_seq0_chunk0(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_PRIM_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = parse_PrimType_choice0();
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_PrimType_choice0() {
        var __ruleName = RULE_PRIM_TYPE;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'b':
                {
                    var alt0_0 = matchLiteralCst("boolean", false);
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    var alt0_1 = matchLiteralCst("byte", false);
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case 's':
                {
                    var alt0_2 = matchLiteralCst("short", false);
                    if (alt0_2.isSuccess()) {
                        result = alt0_2;
                    } else if (alt0_2.isCutFailure()) {
                        result = alt0_2.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'i':
                {
                    var alt0_3 = matchLiteralCst("int", false);
                    if (alt0_3.isSuccess()) {
                        result = alt0_3;
                    } else if (alt0_3.isCutFailure()) {
                        result = alt0_3.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'l':
                {
                    var alt0_4 = matchLiteralCst("long", false);
                    if (alt0_4.isSuccess()) {
                        result = alt0_4;
                    } else if (alt0_4.isCutFailure()) {
                        result = alt0_4.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'f':
                {
                    var alt0_5 = matchLiteralCst("float", false);
                    if (alt0_5.isSuccess()) {
                        result = alt0_5;
                    } else if (alt0_5.isCutFailure()) {
                        result = alt0_5.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'd':
                {
                    var alt0_6 = matchLiteralCst("double", false);
                    if (alt0_6.isSuccess()) {
                        result = alt0_6;
                    } else if (alt0_6.isCutFailure()) {
                        result = alt0_6.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'c':
                {
                    var alt0_7 = matchLiteralCst("char", false);
                    if (alt0_7.isSuccess()) {
                        result = alt0_7;
                    } else if (alt0_7.isCutFailure()) {
                        result = alt0_7.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'v':
                {
                    var alt0_8 = matchLiteralCst("void", false);
                    if (alt0_8.isSuccess()) {
                        result = alt0_8;
                    } else if (alt0_8.isCutFailure()) {
                        result = alt0_8.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_PrimType_seq0_chunk1(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_PRIM_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int notStartPos0 = pos;
            int notStartLine0 = line;
            int notStartColumn0 = column;
            var notElem0 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos0, notStartLine0, notStartColumn0);
            var elem_1 = notElem0.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_RefType() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(120, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_REF_TYPE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_RefType_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_RefType_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_REF_TYPE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_REF_TYPE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_RefType_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_REF_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_AnnotatedTypeName();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_RefType_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_REF_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                zomElem0 = parse_RefType_seq1_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
                if (zomElem0.isSuccess()) zomElem0 = parse_RefType_seq1_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_RefType_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_REF_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int andStartPos0 = pos;
            int andStartLine0 = line;
            int andStartColumn0 = column;
            var savedChildrenAnd0 = new ArrayList<>(children);
            CstParseResult andElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            boolean cut2 = false;
            if (andElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst(".", false);
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (andElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult elem2_1 = null;
                int choiceStart5Pos = pos;
                int choiceStart5Line = line;
                int choiceStart5Column = column;
                int choicePending5 = 0;
                if (pos < input.length()) {
                    char dispatchChar5 = input.charAt(pos);
                    switch (dispatchChar5) {
                        case '@':
                        {
                            var alt5_0 = matchLiteralCst("@", false);
                            if (alt5_0.isSuccess()) {
                                elem2_1 = alt5_0;
                            } else if (alt5_0.isCutFailure()) {
                                elem2_1 = alt5_0.asRegularFailure();
                            } else {
                                restoreLocationRaw(choiceStart5Pos, choiceStart5Line, choiceStart5Column);
                            }
                            break;
                        }
                        case '$':
                        case 'A':
                        case 'B':
                        case 'C':
                        case 'D':
                        case 'E':
                        case 'F':
                        case 'G':
                        case 'H':
                        case 'I':
                        case 'J':
                        case 'K':
                        case 'L':
                        case 'M':
                        case 'N':
                        case 'O':
                        case 'P':
                        case 'Q':
                        case 'R':
                        case 'S':
                        case 'T':
                        case 'U':
                        case 'V':
                        case 'W':
                        case 'X':
                        case 'Y':
                        case 'Z':
                        case '_':
                        case 'a':
                        case 'b':
                        case 'c':
                        case 'd':
                        case 'e':
                        case 'f':
                        case 'g':
                        case 'h':
                        case 'i':
                        case 'j':
                        case 'k':
                        case 'l':
                        case 'm':
                        case 'n':
                        case 'o':
                        case 'p':
                        case 'q':
                        case 'r':
                        case 's':
                        case 't':
                        case 'u':
                        case 'v':
                        case 'w':
                        case 'x':
                        case 'y':
                        case 'z':
                        {
                            var alt5_1 = parse_Identifier();
                            if (alt5_1.isSuccess()) {
                                elem2_1 = alt5_1;
                            } else if (alt5_1.isCutFailure()) {
                                elem2_1 = alt5_1.asRegularFailure();
                            } else {
                                restoreLocationRaw(choiceStart5Pos, choiceStart5Line, choiceStart5Column);
                            }
                            break;
                        }
                    }
                }
                if (elem2_1 == null) {
                    elem2_1 = CstParseResult.failure("one of alternatives");
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (andElem0.isSuccess()) {
                andElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            restoreLocationRaw(andStartPos0, andStartLine0, andStartColumn0);
            children.clear();
            children.addAll(savedChildrenAnd0);
            var elem_0 = andElem0.isSuccess() ? CstParseResult.successNoLoc(null, "") : andElem0;
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_RefType_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_REF_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = matchLiteralCst(".", false);
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_AnnotatedTypeName();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotatedTypeName() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(121, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ANNOTATED_TYPE_NAME;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem0_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = parse_Annotation();
                if (zomElem1.isSuccess() && zomElem1.node.isPresent()) {
                    children.add(zomElem1.node.unwrap());
                }
                if (zomElem1.isCutFailure()) {
                    elem0_0 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem0_0.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem0_0 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = parse_Identifier();
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos4 = pos;
            int optStartLine4 = line;
            int optStartColumn4 = column;
            int optPending4 = 0;
            var savedChildrenOpt4 = new ArrayList<>(children);
            children.clear();
            var optElem4 = parse_TypeArgs();
            if (optElem4.isSuccess() && optElem4.node.isPresent()) {
                children.add(optElem4.node.unwrap());
            }
            CstParseResult elem0_2;
            if (optElem4.isCutFailure()) {
                restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                children.clear();
                children.addAll(savedChildrenOpt4);
                elem0_2 = optElem4;
            } else if (optElem4.isSuccess()) {
                var optChildren4 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt4);
                children.addAll(optChildren4);
                elem0_2 = optElem4;
            } else {
                restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                children.clear();
                children.addAll(savedChildrenOpt4);
                elem0_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem0_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = elem0_2;
            } else if (elem0_2.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                result = cut0 ? elem0_2.asCutFailure() : elem0_2;
            }
        }
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ANNOTATED_TYPE_NAME, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ANNOTATED_TYPE_NAME, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Dims() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(122, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_DIMS;
        
        var savedChildrenOom0 = new ArrayList<>(children);
        children.clear();
        int oomEntryPending0 = 0;
        CstParseResult oomFirst0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos2 = pos;
        int seqStartLine2 = line;
        int seqStartColumn2 = column;
        int seqPending2 = 0;
        var seqChildren2 = new ArrayList<>(children);
        boolean cut2 = false;
        if (oomFirst0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem2_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos3 = pos;
            int zomStartLine3 = line;
            int zomStartColumn3 = column;
            var savedChildrenZom3 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos3 = pos;
                int beforeLine3 = line;
                int beforeColumn3 = column;
                int zomIterPending3 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem3 = parse_Annotation();
                if (zomElem3.isSuccess() && zomElem3.node.isPresent()) {
                    children.add(zomElem3.node.unwrap());
                }
                if (zomElem3.isCutFailure()) {
                    elem2_0 = zomElem3;
                    break;
                }
                if (zomElem3.isFailure() || pos == beforePos3) {
                    restoreLocationRaw(beforePos3, beforeLine3, beforeColumn3);
                    break;
                }
            }
            if (!elem2_0.isCutFailure()) {
                var zomChildren3 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom3);
                if (zomChildren3.size() == 1) {
                    children.add(zomChildren3.getFirst());
                } else if (!zomChildren3.isEmpty()) {
                    var zomSpan3 = new SourceSpan(zomStartLine3, zomStartColumn3, zomStartPos3, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan3, __ruleName, zomChildren3, List.of(), List.of()));
                }
                elem2_0 = CstParseResult.successNoLoc(null, substring(zomStartPos3, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom3);
            }
            if (elem2_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                children.clear();
                children.addAll(seqChildren2);
                oomFirst0 = elem2_0;
            } else if (elem2_0.isFailure()) {
                restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                children.clear();
                children.addAll(seqChildren2);
                oomFirst0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
            }
        }
        if (oomFirst0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem2_1 = matchLiteralCst("[", false);
            if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                children.add(elem2_1.node.unwrap());
            }
            if (elem2_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                children.clear();
                children.addAll(seqChildren2);
                oomFirst0 = elem2_1;
            } else if (elem2_1.isFailure()) {
                restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                children.clear();
                children.addAll(seqChildren2);
                oomFirst0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
            }
        }
        if (oomFirst0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem2_2 = matchLiteralCst("]", false);
            if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                children.add(elem2_2.node.unwrap());
            }
            if (elem2_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                children.clear();
                children.addAll(seqChildren2);
                oomFirst0 = elem2_2;
            } else if (elem2_2.isFailure()) {
                restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                children.clear();
                children.addAll(seqChildren2);
                oomFirst0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
            }
        }
        if (oomFirst0.isSuccess()) {
            oomFirst0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
        }
        CstParseResult result = oomFirst0;
        int oomStartPos0 = pos;
        int oomStartLine0 = line;
        int oomStartColumn0 = column;
        if (oomFirst0.isSuccess()) {
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int oomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult oomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos8 = pos;
                int seqStartLine8 = line;
                int seqStartColumn8 = column;
                int seqPending8 = 0;
                var seqChildren8 = new ArrayList<>(children);
                boolean cut8 = false;
                if (oomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    CstParseResult elem8_0 = CstParseResult.successNoLoc(null, "");
                    int zomStartPos9 = pos;
                    int zomStartLine9 = line;
                    int zomStartColumn9 = column;
                    var savedChildrenZom9 = new ArrayList<>(children);
                    children.clear();
                    while (true) {
                        int beforePos9 = pos;
                        int beforeLine9 = line;
                        int beforeColumn9 = column;
                        int zomIterPending9 = 0;
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var zomElem9 = parse_Annotation();
                        if (zomElem9.isSuccess() && zomElem9.node.isPresent()) {
                            children.add(zomElem9.node.unwrap());
                        }
                        if (zomElem9.isCutFailure()) {
                            elem8_0 = zomElem9;
                            break;
                        }
                        if (zomElem9.isFailure() || pos == beforePos9) {
                            restoreLocationRaw(beforePos9, beforeLine9, beforeColumn9);
                            break;
                        }
                    }
                    if (!elem8_0.isCutFailure()) {
                        var zomChildren9 = new ArrayList<>(children);
                        children.clear();
                        children.addAll(savedChildrenZom9);
                        if (zomChildren9.size() == 1) {
                            children.add(zomChildren9.getFirst());
                        } else if (!zomChildren9.isEmpty()) {
                            var zomSpan9 = new SourceSpan(zomStartLine9, zomStartColumn9, zomStartPos9, line, column, pos);
                            children.add(new CstNode.NonTerminal(idGen.next(), zomSpan9, __ruleName, zomChildren9, List.of(), List.of()));
                        }
                        elem8_0 = CstParseResult.successNoLoc(null, substring(zomStartPos9, pos));
                    } else {
                        children.clear();
                        children.addAll(savedChildrenZom9);
                    }
                    if (elem8_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                        children.clear();
                        children.addAll(seqChildren8);
                        oomElem0 = elem8_0;
                    } else if (elem8_0.isFailure()) {
                        restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                        children.clear();
                        children.addAll(seqChildren8);
                        oomElem0 = cut8 ? elem8_0.asCutFailure() : elem8_0;
                    }
                }
                if (oomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem8_1 = matchLiteralCst("[", false);
                    if (elem8_1.isSuccess() && elem8_1.node.isPresent()) {
                        children.add(elem8_1.node.unwrap());
                    }
                    if (elem8_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                        children.clear();
                        children.addAll(seqChildren8);
                        oomElem0 = elem8_1;
                    } else if (elem8_1.isFailure()) {
                        restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                        children.clear();
                        children.addAll(seqChildren8);
                        oomElem0 = cut8 ? elem8_1.asCutFailure() : elem8_1;
                    }
                }
                if (oomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem8_2 = matchLiteralCst("]", false);
                    if (elem8_2.isSuccess() && elem8_2.node.isPresent()) {
                        children.add(elem8_2.node.unwrap());
                    }
                    if (elem8_2.isCutFailure()) {
                        restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                        children.clear();
                        children.addAll(seqChildren8);
                        oomElem0 = elem8_2;
                    } else if (elem8_2.isFailure()) {
                        restoreLocationRaw(seqStartPos8, seqStartLine8, seqStartColumn8);
                        children.clear();
                        children.addAll(seqChildren8);
                        oomElem0 = cut8 ? elem8_2.asCutFailure() : elem8_2;
                    }
                }
                if (oomElem0.isSuccess()) {
                    oomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos8, pos));
                }
                if (oomElem0.isCutFailure()) {
                    result = oomElem0;
                    break;
                }
                if (oomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
        }
        if (result.isSuccess()) {
            var oomChildren0 = new ArrayList<>(children);
            children.clear();
            children.addAll(savedChildrenOom0);
            if (oomChildren0.size() == 1) {
                children.add(oomChildren0.getFirst());
            } else if (!oomChildren0.isEmpty()) {
                var oomSpan0 = new SourceSpan(oomStartLine0, oomStartColumn0, oomStartPos0, line, column, pos);
                children.add(new CstNode.NonTerminal(idGen.next(), oomSpan0, __ruleName, oomChildren0, List.of(), List.of()));
            }
        } else {
            children.clear();
            children.addAll(savedChildrenOom0);
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_DIMS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_DIMS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ArrayType() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(123, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ARRAY_TYPE;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_ArrayType_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_ArrayType_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ARRAY_TYPE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ARRAY_TYPE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_ArrayType_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ARRAY_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_ArrayType_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ARRAY_TYPE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'f':
                    case 'i':
                    case 'l':
                    case 's':
                    case 'v':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = parse_PrimType();
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_1 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_1 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_RefType();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_1 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_1 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                    case '$':
                    case '@':
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                    case 'G':
                    case 'H':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'L':
                    case 'M':
                    case 'N':
                    case 'O':
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S':
                    case 'T':
                    case 'U':
                    case 'V':
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case '_':
                    case 'a':
                    case 'e':
                    case 'g':
                    case 'h':
                    case 'j':
                    case 'k':
                    case 'm':
                    case 'n':
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 't':
                    case 'u':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = parse_RefType();
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_1 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_1 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                }
            }
            if (elem_1 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_1 = CstParseResult.failure("one of alternatives");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_DimExprs() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(124, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_DIM_EXPRS;
        
        var savedChildrenOom0 = new ArrayList<>(children);
        children.clear();
        int oomEntryPending0 = 0;
        CstParseResult oomFirst0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos2 = pos;
        int seqStartLine2 = line;
        int seqStartColumn2 = column;
        int seqPending2 = 0;
        var seqChildren2 = new ArrayList<>(children);
        oomFirst0 = parse_DimExprs_seq0_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
        if (oomFirst0.isSuccess()) oomFirst0 = parse_DimExprs_seq0_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
        if (oomFirst0.isSuccess()) oomFirst0 = parse_DimExprs_seq0_chunk2(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
        if (oomFirst0.isSuccess()) {
            oomFirst0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
        }
        CstParseResult result = oomFirst0;
        int oomStartPos0 = pos;
        int oomStartLine0 = line;
        int oomStartColumn0 = column;
        if (oomFirst0.isSuccess()) {
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int oomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult oomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                oomElem0 = parse_DimExprs_seq1_chunk0(children, seqStartPos4, seqStartLine4, seqStartColumn4, seqPending4, seqChildren4);
                if (oomElem0.isSuccess()) oomElem0 = parse_DimExprs_seq1_chunk1(children, seqStartPos4, seqStartLine4, seqStartColumn4, seqPending4, seqChildren4);
                if (oomElem0.isSuccess()) oomElem0 = parse_DimExprs_seq1_chunk2(children, seqStartPos4, seqStartLine4, seqStartColumn4, seqPending4, seqChildren4);
                if (oomElem0.isSuccess()) {
                    oomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (oomElem0.isCutFailure()) {
                    result = oomElem0;
                    break;
                }
                if (oomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
        }
        if (result.isSuccess()) {
            var oomChildren0 = new ArrayList<>(children);
            children.clear();
            children.addAll(savedChildrenOom0);
            if (oomChildren0.size() == 1) {
                children.add(oomChildren0.getFirst());
            } else if (!oomChildren0.isEmpty()) {
                var oomSpan0 = new SourceSpan(oomStartLine0, oomStartColumn0, oomStartPos0, line, column, pos);
                children.add(new CstNode.NonTerminal(idGen.next(), oomSpan0, __ruleName, oomChildren0, List.of(), List.of()));
            }
        } else {
            children.clear();
            children.addAll(savedChildrenOom0);
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_DIM_EXPRS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_DIM_EXPRS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_DimExprs_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_DIM_EXPRS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_DimExprs_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_DIM_EXPRS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int andStartPos0 = pos;
            int andStartLine0 = line;
            int andStartColumn0 = column;
            var savedChildrenAnd0 = new ArrayList<>(children);
            CstParseResult andElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            boolean cut2 = false;
            if (andElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("[", false);
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (andElem0.isSuccess()) {
                int notStartPos4 = pos;
                int notStartLine4 = line;
                int notStartColumn4 = column;
                var notElem4 = matchLiteralCst("]", false);
                restoreLocationRaw(notStartPos4, notStartLine4, notStartColumn4);
                var elem2_1 = notElem4.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (andElem0.isSuccess()) {
                andElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            restoreLocationRaw(andStartPos0, andStartLine0, andStartColumn0);
            children.clear();
            children.addAll(savedChildrenAnd0);
            var elem_1 = andElem0.isSuccess() ? CstParseResult.successNoLoc(null, "") : andElem0;
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("[", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_DimExprs_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_DIM_EXPRS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Expr();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst("]", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_DimExprs_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_DIM_EXPRS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_DimExprs_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_DIM_EXPRS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int andStartPos0 = pos;
            int andStartLine0 = line;
            int andStartColumn0 = column;
            var savedChildrenAnd0 = new ArrayList<>(children);
            CstParseResult andElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            boolean cut2 = false;
            if (andElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("[", false);
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (andElem0.isSuccess()) {
                int notStartPos4 = pos;
                int notStartLine4 = line;
                int notStartColumn4 = column;
                var notElem4 = matchLiteralCst("]", false);
                restoreLocationRaw(notStartPos4, notStartLine4, notStartColumn4);
                var elem2_1 = notElem4.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    andElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (andElem0.isSuccess()) {
                andElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            restoreLocationRaw(andStartPos0, andStartLine0, andStartColumn0);
            children.clear();
            children.addAll(savedChildrenAnd0);
            var elem_1 = andElem0.isSuccess() ? CstParseResult.successNoLoc(null, "") : andElem0;
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("[", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_DimExprs_seq1_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_DIM_EXPRS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = parse_Expr();
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_4 = matchLiteralCst("]", false);
            if (elem_4.isSuccess() && elem_4.node.isPresent()) {
                children.add(elem_4.node.unwrap());
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeArgs() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(125, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_ARGS;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '<':
                {
                    result = parse_TypeArgs_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_TypeArgs_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_ARGS, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_ARGS, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_TypeArgs_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_ARGS;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        boolean cut0 = false;
        if (alt0_0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_0 = matchLiteralCst("<", false);
            if (elem0_0.isSuccess() && elem0_0.node.isPresent()) {
                children.add(elem0_0.node.unwrap());
            }
            if (elem0_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = elem0_0;
            } else if (elem0_0.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = cut0 ? elem0_0.asCutFailure() : elem0_0;
            }
        }
        if (alt0_0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem0_1 = matchLiteralCst(">", false);
            if (elem0_1.isSuccess() && elem0_1.node.isPresent()) {
                children.add(elem0_1.node.unwrap());
            }
            if (elem0_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = elem0_1;
            } else if (elem0_1.isFailure()) {
                restoreLocationRaw(seqStartPos0, seqStartLine0, seqStartColumn0);
                children.clear();
                children.addAll(seqChildren0);
                alt0_0 = cut0 ? elem0_1.asCutFailure() : elem0_1;
            }
        }
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_TypeArgs_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_ARGS;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_1 = parse_TypeArgs_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) alt0_1 = parse_TypeArgs_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_TypeArgs_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_ARGS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("<", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = parse_TypeArg();
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_2 = CstParseResult.successNoLoc(null, "");
            int zomStartPos2 = pos;
            int zomStartLine2 = line;
            int zomStartColumn2 = column;
            var savedChildrenZom2 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos2 = pos;
                int beforeLine2 = line;
                int beforeColumn2 = column;
                int zomIterPending2 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem2 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                var seqChildren4 = new ArrayList<>(children);
                boolean cut4 = false;
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst(",", false);
                    if (elem4_0.isSuccess() && elem4_0.node.isPresent()) {
                        children.add(elem4_0.node.unwrap());
                    }
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (zomElem2.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = parse_TypeArg();
                    if (elem4_1.isSuccess() && elem4_1.node.isPresent()) {
                        children.add(elem4_1.node.unwrap());
                    }
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        children.clear();
                        children.addAll(seqChildren4);
                        zomElem2 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (zomElem2.isSuccess()) {
                    zomElem2 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (zomElem2.isCutFailure()) {
                    elem_2 = zomElem2;
                    break;
                }
                if (zomElem2.isFailure() || pos == beforePos2) {
                    restoreLocationRaw(beforePos2, beforeLine2, beforeColumn2);
                    break;
                }
            }
            if (!elem_2.isCutFailure()) {
                var zomChildren2 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom2);
                if (zomChildren2.size() == 1) {
                    children.add(zomChildren2.getFirst());
                } else if (!zomChildren2.isEmpty()) {
                    var zomSpan2 = new SourceSpan(zomStartLine2, zomStartColumn2, zomStartPos2, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan2, __ruleName, zomChildren2, List.of(), List.of()));
                }
                elem_2 = CstParseResult.successNoLoc(null, substring(zomStartPos2, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom2);
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeArgs_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_ARGS;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_3 = matchLiteralCst(">", false);
            if (elem_3.isSuccess() && elem_3.node.isPresent()) {
                children.add(elem_3.node.unwrap());
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeArg() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(126, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_TYPE_ARG;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case '@':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_TypeArg_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '?':
                {
                    result = parse_TypeArg_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_TYPE_ARG, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_TYPE_ARG, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_TypeArg_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_ARG;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_Type();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_TypeArg_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_TYPE_ARG;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_1 = parse_TypeArg_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) alt0_1 = parse_TypeArg_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_TypeArg_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_ARG;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("?", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeArg_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_ARG;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            optElem0 = parse_TypeArg_seq1_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) optElem0 = parse_TypeArg_seq1_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_1;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_1 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeArg_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_ARG;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem0 = parse_Annotation();
                if (zomElem0.isSuccess() && zomElem0.node.isPresent()) {
                    children.add(zomElem0.node.unwrap());
                }
                if (zomElem0.isCutFailure()) {
                    elem_0 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_0.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_0 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_TypeArg_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_TYPE_ARG;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            var savedChildren1 = new ArrayList<>(children);
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case 'e':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_0 = matchLiteralCst("extends", false);
                        if (alt1_0.isSuccess() && alt1_0.node.isPresent()) {
                            children.add(alt1_0.node.unwrap());
                        }
                        if (alt1_0.isSuccess()) {
                            elem_1 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_1 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                    case 's':
                    {
                        children.clear();
                        children.addAll(savedChildren1);
                        var alt1_1 = matchLiteralCst("super", false);
                        if (alt1_1.isSuccess() && alt1_1.node.isPresent()) {
                            children.add(alt1_1.node.unwrap());
                        }
                        if (alt1_1.isSuccess()) {
                            elem_1 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_1 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                }
            }
            if (elem_1 == null) {
                children.clear();
                children.addAll(savedChildren1);
                elem_1 = CstParseResult.failure("one of alternatives");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_Type();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_QualifiedName() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(127, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_QUALIFIED_NAME;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_QualifiedName_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_QualifiedName_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_QUALIFIED_NAME, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_QUALIFIED_NAME, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_QualifiedName_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_QUALIFIED_NAME;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Identifier();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_QualifiedName_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_QUALIFIED_NAME;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    int andStartPos3 = pos;
                    int andStartLine3 = line;
                    int andStartColumn3 = column;
                    var savedChildrenAnd3 = new ArrayList<>(children);
                    CstParseResult andElem3 = CstParseResult.successNoLoc(null, "");
                    int seqStartPos5 = pos;
                    int seqStartLine5 = line;
                    int seqStartColumn5 = column;
                    int seqPending5 = 0;
                    boolean cut5 = false;
                    if (andElem3.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem5_0 = matchLiteralCst(".", false);
                        if (elem5_0.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            andElem3 = elem5_0;
                        } else if (elem5_0.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            andElem3 = cut5 ? elem5_0.asCutFailure() : elem5_0;
                        }
                    }
                    if (andElem3.isSuccess()) {
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var elem5_1 = parse_Identifier();
                        if (elem5_1.isCutFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            andElem3 = elem5_1;
                        } else if (elem5_1.isFailure()) {
                            restoreLocationRaw(seqStartPos5, seqStartLine5, seqStartColumn5);
                            andElem3 = cut5 ? elem5_1.asCutFailure() : elem5_1;
                        }
                    }
                    if (andElem3.isSuccess()) {
                        andElem3 = CstParseResult.successNoLoc(null, substring(seqStartPos5, pos));
                    }
                    restoreLocationRaw(andStartPos3, andStartLine3, andStartColumn3);
                    children.clear();
                    children.addAll(savedChildrenAnd3);
                    var elem2_0 = andElem3.isSuccess() ? CstParseResult.successNoLoc(null, "") : andElem3;
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_1 = matchLiteralCst(".", false);
                    if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                        children.add(elem2_1.node.unwrap());
                    }
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_2 = parse_Identifier();
                    if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                        children.add(elem2_2.node.unwrap());
                    }
                    if (elem2_2.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_2;
                    } else if (elem2_2.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Identifier() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(128, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_IDENTIFIER;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Identifier_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Identifier_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_IDENTIFIER, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_IDENTIFIER, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Identifier_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_IDENTIFIER;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int notStartPos0 = pos;
            int notStartLine0 = line;
            int notStartColumn0 = column;
            var savedChildrenNot0 = new ArrayList<>(children);
            var notElem0 = parse_Keyword();
            restoreLocationRaw(notStartPos0, notStartLine0, notStartColumn0);
            children.clear();
            children.addAll(savedChildrenNot0);
            var elem_0 = notElem0.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Identifier_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_IDENTIFIER;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int tbStartPos0 = pos;
            int tbStartLine0 = line;
            int tbStartColumn0 = column;
            CstParseResult elem_1;
            if (pos >= input.length()) {
                trackFailure("[a-zA-Z_$]");
                elem_1 = CstParseResult.failure("character class");
            } else {
                String fpInput0 = input;
                char fpFirst0 = fpInput0.charAt(pos);
                if (!((fpFirst0 >= (char) 97 && fpFirst0 <= (char) 122) || (fpFirst0 >= (char) 65 && fpFirst0 <= (char) 90) || (fpFirst0 == (char) 95) || (fpFirst0 == (char) 36))) {
                    trackFailure("[a-zA-Z_$]");
                    elem_1 = CstParseResult.failure("character class");
                } else {
                    int fpEnd0 = pos + 1;
                    int fpLine0 = line;
                    int fpCol0 = column + 1;
                    int fpLen0 = fpInput0.length();
                    while (fpEnd0 < fpLen0) {
                        char fpC0 = fpInput0.charAt(fpEnd0);
                        if (!((fpC0 >= (char) 97 && fpC0 <= (char) 122) || (fpC0 >= (char) 65 && fpC0 <= (char) 90) || (fpC0 >= (char) 48 && fpC0 <= (char) 57) || (fpC0 == (char) 95) || (fpC0 == (char) 36))) break;
                        fpEnd0++;
                        fpCol0++;
                    }
                    pos = fpEnd0;
                    line = fpLine0;
                    column = fpCol0;
                    var tbText0 = substringSpan(tbStartPos0, fpEnd0);
                    var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
                    var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
                    children.add(tbNode0);
                    elem_1 = CstParseResult.successNoLoc(tbNode0, tbText0);
                }
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Modifier() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(129, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_MODIFIER;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        tbElem0 = parse_Modifier_seq0_chunk0(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_Modifier_seq0_chunk1(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_MODIFIER, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_MODIFIER, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Modifier_seq0_chunk0(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_MODIFIER;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = parse_Modifier_choice0();
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Modifier_choice0() {
        var __ruleName = RULE_MODIFIER;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'p':
                {
                    var alt0_0 = matchLiteralCst("public", false);
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    var alt0_1 = matchLiteralCst("protected", false);
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    var alt0_2 = matchLiteralCst("private", false);
                    if (alt0_2.isSuccess()) {
                        result = alt0_2;
                    } else if (alt0_2.isCutFailure()) {
                        result = alt0_2.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    break;
                }
                case 's':
                {
                    var alt0_3 = matchLiteralCst("static", false);
                    if (alt0_3.isSuccess()) {
                        result = alt0_3;
                    } else if (alt0_3.isCutFailure()) {
                        result = alt0_3.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    var alt0_7 = matchLiteralCst("synchronized", false);
                    if (alt0_7.isSuccess()) {
                        result = alt0_7;
                    } else if (alt0_7.isCutFailure()) {
                        result = alt0_7.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    var alt0_10 = matchLiteralCst("strictfp", false);
                    if (alt0_10.isSuccess()) {
                        result = alt0_10;
                    } else if (alt0_10.isCutFailure()) {
                        result = alt0_10.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    var alt0_12 = matchLiteralCst("sealed", false);
                    if (alt0_12.isSuccess()) {
                        result = alt0_12;
                    } else if (alt0_12.isCutFailure()) {
                        result = alt0_12.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    }
                    break;
                }
                case 'f':
                {
                    var alt0_4 = matchLiteralCst("final", false);
                    if (alt0_4.isSuccess()) {
                        result = alt0_4;
                    } else if (alt0_4.isCutFailure()) {
                        result = alt0_4.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'a':
                {
                    var alt0_5 = matchLiteralCst("abstract", false);
                    if (alt0_5.isSuccess()) {
                        result = alt0_5;
                    } else if (alt0_5.isCutFailure()) {
                        result = alt0_5.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'n':
                {
                    var alt0_6 = matchLiteralCst("native", false);
                    if (alt0_6.isSuccess()) {
                        result = alt0_6;
                    } else if (alt0_6.isCutFailure()) {
                        result = alt0_6.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    var alt0_13 = matchLiteralCst("non-sealed", false);
                    if (alt0_13.isSuccess()) {
                        result = alt0_13;
                    } else if (alt0_13.isCutFailure()) {
                        result = alt0_13.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case 't':
                {
                    var alt0_8 = matchLiteralCst("transient", false);
                    if (alt0_8.isSuccess()) {
                        result = alt0_8;
                    } else if (alt0_8.isCutFailure()) {
                        result = alt0_8.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'v':
                {
                    var alt0_9 = matchLiteralCst("volatile", false);
                    if (alt0_9.isSuccess()) {
                        result = alt0_9;
                    } else if (alt0_9.isCutFailure()) {
                        result = alt0_9.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'd':
                {
                    var alt0_11 = matchLiteralCst("default", false);
                    if (alt0_11.isSuccess()) {
                        result = alt0_11;
                    } else if (alt0_11.isCutFailure()) {
                        result = alt0_11.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_Modifier_seq0_chunk1(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_MODIFIER;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int notStartPos0 = pos;
            int notStartLine0 = line;
            int notStartColumn0 = column;
            var notElem0 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos0, notStartLine0, notStartColumn0);
            var elem_1 = notElem0.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_Annotation() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(130, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ANNOTATION;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Annotation_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Annotation_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ANNOTATION, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ANNOTATION, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_Annotation_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("@", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            int notStartPos1 = pos;
            int notStartLine1 = line;
            int notStartColumn1 = column;
            var savedChildrenNot1 = new ArrayList<>(children);
            var notElem1 = matchLiteralCst("interface", false);
            restoreLocationRaw(notStartPos1, notStartLine1, notStartColumn1);
            children.clear();
            children.addAll(savedChildrenNot1);
            var elem_1 = notElem1.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_QualifiedName();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Annotation_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst("(", false);
                if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                    children.add(elem2_0.node.unwrap());
                }
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                int optStartPos4 = pos;
                int optStartLine4 = line;
                int optStartColumn4 = column;
                int optPending4 = 0;
                var savedChildrenOpt4 = new ArrayList<>(children);
                children.clear();
                var optElem4 = parse_AnnotationValue();
                if (optElem4.isSuccess() && optElem4.node.isPresent()) {
                    children.add(optElem4.node.unwrap());
                }
                CstParseResult elem2_1;
                if (optElem4.isCutFailure()) {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    elem2_1 = optElem4;
                } else if (optElem4.isSuccess()) {
                    var optChildren4 = new ArrayList<>(children);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    children.addAll(optChildren4);
                    elem2_1 = optElem4;
                } else {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    children.clear();
                    children.addAll(savedChildrenOpt4);
                    elem2_1 = CstParseResult.successNoLoc(null, "");
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_2 = matchLiteralCst(")", false);
                if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                    children.add(elem2_2.node.unwrap());
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    children.clear();
                    children.addAll(seqChildren2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationValue() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(131, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ANNOTATION_VALUE;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '$':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                {
                    result = parse_AnnotationValue_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_AnnotationValue_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '!':
                case '"':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '@':
                case '{':
                case '~':
                {
                    result = parse_AnnotationValue_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ANNOTATION_VALUE, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ANNOTATION_VALUE, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_AnnotationValue_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_ANNOTATION_VALUE;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_0 = parse_AnnotationValue_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) alt0_0 = parse_AnnotationValue_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_0.isSuccess()) {
            alt0_0 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_AnnotationValue_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_ANNOTATION_VALUE;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_AnnotationElem();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_AnnotationValue_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_VALUE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_Identifier();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_1 = matchLiteralCst("=", false);
            if (elem_1.isSuccess() && elem_1.node.isPresent()) {
                children.add(elem_1.node.unwrap());
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = parse_AnnotationElem();
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationValue_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_VALUE;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_3 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            var savedChildrenZom0 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                var seqChildren2 = new ArrayList<>(children);
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_0 = matchLiteralCst(",", false);
                    if (elem2_0.isSuccess() && elem2_0.node.isPresent()) {
                        children.add(elem2_0.node.unwrap());
                    }
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_1 = parse_Identifier();
                    if (elem2_1.isSuccess() && elem2_1.node.isPresent()) {
                        children.add(elem2_1.node.unwrap());
                    }
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_2 = matchLiteralCst("=", false);
                    if (elem2_2.isSuccess() && elem2_2.node.isPresent()) {
                        children.add(elem2_2.node.unwrap());
                    }
                    if (elem2_2.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_2;
                    } else if (elem2_2.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_3 = parse_AnnotationElem();
                    if (elem2_3.isSuccess() && elem2_3.node.isPresent()) {
                        children.add(elem2_3.node.unwrap());
                    }
                    if (elem2_3.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = elem2_3;
                    } else if (elem2_3.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        children.clear();
                        children.addAll(seqChildren2);
                        zomElem0 = cut2 ? elem2_3.asCutFailure() : elem2_3;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_3 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_3.isCutFailure()) {
                var zomChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom0);
                if (zomChildren0.size() == 1) {
                    children.add(zomChildren0.getFirst());
                } else if (!zomChildren0.isEmpty()) {
                    var zomSpan0 = new SourceSpan(zomStartLine0, zomStartColumn0, zomStartPos0, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan0, __ruleName, zomChildren0, List.of(), List.of()));
                }
                elem_3 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom0);
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationElem() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(132, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_ANNOTATION_ELEM;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '@':
                {
                    result = parse_AnnotationElem_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_AnnotationElem_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '{':
                {
                    result = parse_AnnotationElem_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '!':
                case '"':
                case '$':
                case '\'':
                case '(':
                case '+':
                case '-':
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                case 'G':
                case 'H':
                case 'I':
                case 'J':
                case 'K':
                case 'L':
                case 'M':
                case 'N':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                case 'T':
                case 'U':
                case 'V':
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                case '_':
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'g':
                case 'h':
                case 'i':
                case 'j':
                case 'k':
                case 'l':
                case 'm':
                case 'n':
                case 'o':
                case 'p':
                case 'q':
                case 'r':
                case 's':
                case 't':
                case 'u':
                case 'v':
                case 'w':
                case 'x':
                case 'y':
                case 'z':
                case '~':
                {
                    result = parse_AnnotationElem_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_ANNOTATION_ELEM, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_ANNOTATION_ELEM, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_AnnotationElem_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_ANNOTATION_ELEM;
        children.clear();
        children.addAll(childrenState);
        var alt0_0 = parse_Annotation();
        if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
            children.add(alt0_0.node.unwrap());
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_AnnotationElem_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_ANNOTATION_ELEM;
        children.clear();
        children.addAll(childrenState);
        CstParseResult alt0_1 = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        alt0_1 = parse_AnnotationElem_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) alt0_1 = parse_AnnotationElem_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) alt0_1 = parse_AnnotationElem_seq0_chunk2(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (alt0_1.isSuccess()) {
            alt0_1 = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_AnnotationElem_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_ANNOTATION_ELEM;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = parse_Ternary();
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_AnnotationElem_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_ELEM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("{", false);
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationElem_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_ELEM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            var seqChildren2 = new ArrayList<>(children);
            optElem0 = parse_AnnotationElem_seq1_chunk0(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) optElem0 = parse_AnnotationElem_seq1_chunk1(children, seqStartPos2, seqStartLine2, seqStartColumn2, seqPending2, seqChildren2);
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_1;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_1 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_1 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationElem_seq1_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_ELEM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = parse_AnnotationElem();
            if (elem_0.isSuccess() && elem_0.node.isPresent()) {
                children.add(elem_0.node.unwrap());
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            var savedChildrenZom1 = new ArrayList<>(children);
            children.clear();
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem1 = CstParseResult.successNoLoc(null, "");
                int seqStartPos3 = pos;
                int seqStartLine3 = line;
                int seqStartColumn3 = column;
                int seqPending3 = 0;
                var seqChildren3 = new ArrayList<>(children);
                boolean cut3 = false;
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_0 = matchLiteralCst(",", false);
                    if (elem3_0.isSuccess() && elem3_0.node.isPresent()) {
                        children.add(elem3_0.node.unwrap());
                    }
                    if (elem3_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_0;
                    } else if (elem3_0.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                    }
                }
                if (zomElem1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem3_1 = parse_AnnotationElem();
                    if (elem3_1.isSuccess() && elem3_1.node.isPresent()) {
                        children.add(elem3_1.node.unwrap());
                    }
                    if (elem3_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = elem3_1;
                    } else if (elem3_1.isFailure()) {
                        restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                        children.clear();
                        children.addAll(seqChildren3);
                        zomElem1 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                    }
                }
                if (zomElem1.isSuccess()) {
                    zomElem1 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
                }
                if (zomElem1.isCutFailure()) {
                    elem_1 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                var zomChildren1 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenZom1);
                if (zomChildren1.size() == 1) {
                    children.add(zomChildren1.getFirst());
                } else if (!zomChildren1.isEmpty()) {
                    var zomSpan1 = new SourceSpan(zomStartLine1, zomStartColumn1, zomStartPos1, line, column, pos);
                    children.add(new CstNode.NonTerminal(idGen.next(), zomSpan1, __ruleName, zomChildren1, List.of(), List.of()));
                }
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            } else {
                children.clear();
                children.addAll(savedChildrenZom1);
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationElem_seq1_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_ELEM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var savedChildrenOpt0 = new ArrayList<>(children);
            children.clear();
            var optElem0 = matchLiteralCst(",", false);
            if (optElem0.isSuccess() && optElem0.node.isPresent()) {
                children.add(optElem0.node.unwrap());
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                var optChildren0 = new ArrayList<>(children);
                children.clear();
                children.addAll(savedChildrenOpt0);
                children.addAll(optChildren0);
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                children.clear();
                children.addAll(savedChildrenOpt0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_AnnotationElem_seq0_chunk2(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_ANNOTATION_ELEM;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("}", false);
            if (elem_2.isSuccess() && elem_2.node.isPresent()) {
                children.add(elem_2.node.unwrap());
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_Literal() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_LITERAL;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'f':
                case 'n':
                case 't':
                {
                    result = parse_Literal_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '\'':
                {
                    result = parse_Literal_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '"':
                {
                    result = parse_Literal_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '.':
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                {
                    result = parse_Literal_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_LITERAL, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_LITERAL, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_Literal_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LITERAL;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        tbElem0 = parse_Literal_seq0_chunk0(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_Literal_seq0_chunk1(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_0;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_0 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_0 = tbElem0;
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_Literal_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LITERAL;
        children.clear();
        children.addAll(childrenState);
        var alt0_1 = parse_CharLit();
        if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
            children.add(alt0_1.node.unwrap());
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_Literal_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LITERAL;
        children.clear();
        children.addAll(childrenState);
        var alt0_2 = parse_StringLit();
        if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
            children.add(alt0_2.node.unwrap());
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_Literal_alt3(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_LITERAL;
        children.clear();
        children.addAll(childrenState);
        var alt0_3 = parse_NumLit();
        if (alt0_3.isSuccess() && alt0_3.node.isPresent()) {
            children.add(alt0_3.node.unwrap());
        }
        if (alt0_3.isSuccess()) {
            return alt0_3;
        }
        if (alt0_3.isCutFailure()) {
            return alt0_3;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_3;
    }

    private CstParseResult parse_Literal_seq0_chunk0(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_LITERAL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case 'n':
                    {
                        var alt1_0 = matchLiteralCst("null", false);
                        if (alt1_0.isSuccess()) {
                            elem_0 = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            elem_0 = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                    case 't':
                    {
                        var alt1_1 = matchLiteralCst("true", false);
                        if (alt1_1.isSuccess()) {
                            elem_0 = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            elem_0 = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                    case 'f':
                    {
                        var alt1_2 = matchLiteralCst("false", false);
                        if (alt1_2.isSuccess()) {
                            elem_0 = alt1_2;
                        } else if (alt1_2.isCutFailure()) {
                            elem_0 = alt1_2.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                }
            }
            if (elem_0 == null) {
                elem_0 = CstParseResult.failure("one of alternatives");
            }
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Literal_seq0_chunk1(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_LITERAL;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int notStartPos0 = pos;
            int notStartLine0 = line;
            int notStartColumn0 = column;
            var notElem0 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos0, notStartLine0, notStartColumn0);
            var elem_1 = notElem0.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_CharLit() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Check cache at pre-whitespace position. Bug B fix:
        // on a settled-success cache hit we must reproduce the first-parse
        // trivia attribution   drain pending-leading, run skipWhitespace at
        // the same pre-WS position, then jump pos to the cached body-end and
        // attach the rebuilt leading trivia. Failure hits return as-is.
        long key = cacheKey(134, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_CHAR_LIT;
        
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        tbElem0 = parse_CharLit_seq0_chunk0(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_CharLit_seq0_chunk1(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_CharLit_seq0_chunk2(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult result;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            result = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            result = tbElem0;
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_CHAR_LIT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_CHAR_LIT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_CharLit_seq0_chunk0(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_CHAR_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("'", false);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_CharLit_seq0_chunk1(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_CHAR_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = null;
                int choiceStart2Pos = pos;
                int choiceStart2Line = line;
                int choiceStart2Column = column;
                int choicePending2 = 0;
                var alt2_0 = matchCharClassCst("'\\\\", true, false);
                if (alt2_0.isSuccess()) {
                    zomElem0 = alt2_0;
                } else if (alt2_0.isCutFailure()) {
                    zomElem0 = alt2_0.asRegularFailure();
                } else {
                    restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                CstParseResult alt2_1 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                boolean cut4 = false;
                if (alt2_1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst("\\", false);
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        alt2_1 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        alt2_1 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (alt2_1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = matchAnyCst();
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        alt2_1 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        alt2_1 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (alt2_1.isSuccess()) {
                    alt2_1 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (alt2_1.isSuccess()) {
                    zomElem0 = alt2_1;
                } else if (alt2_1.isCutFailure()) {
                    zomElem0 = alt2_1.asRegularFailure();
                } else {
                    restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                }
                }
                if (zomElem0 == null) {
                    zomElem0 = CstParseResult.failure("one of alternatives");
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_CharLit_seq0_chunk2(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_CHAR_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("'", false);
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_StringLit() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(135, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_STRING_LIT;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '"':
                {
                    result = parse_StringLit_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_StringLit_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_STRING_LIT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_STRING_LIT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_StringLit_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STRING_LIT;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        tbElem0 = parse_StringLit_seq0_chunk0(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_StringLit_seq0_chunk1(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_StringLit_seq0_chunk2(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_0;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_0 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_0 = tbElem0;
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_StringLit_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_STRING_LIT;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        tbElem0 = parse_StringLit_seq1_chunk0(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_StringLit_seq1_chunk1(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_StringLit_seq1_chunk2(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_1;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_1 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_1 = tbElem0;
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_StringLit_seq0_chunk0(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_STRING_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("\"\"\"", false);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_StringLit_seq0_chunk1(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_STRING_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = CstParseResult.successNoLoc(null, "");
                int seqStartPos2 = pos;
                int seqStartLine2 = line;
                int seqStartColumn2 = column;
                int seqPending2 = 0;
                boolean cut2 = false;
                if (zomElem0.isSuccess()) {
                    int notStartPos3 = pos;
                    int notStartLine3 = line;
                    int notStartColumn3 = column;
                    var notElem3 = matchLiteralCst("\"\"\"", false);
                    restoreLocationRaw(notStartPos3, notStartLine3, notStartColumn3);
                    var elem2_0 = notElem3.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                    if (elem2_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        zomElem0 = elem2_0;
                    } else if (elem2_0.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        zomElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                    }
                }
                if (zomElem0.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem2_1 = matchAnyCst();
                    if (elem2_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        zomElem0 = elem2_1;
                    } else if (elem2_1.isFailure()) {
                        restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                        zomElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                    }
                }
                if (zomElem0.isSuccess()) {
                    zomElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_StringLit_seq0_chunk2(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_STRING_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("\"\"\"", false);
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_StringLit_seq1_chunk0(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_STRING_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst("\"", false);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_StringLit_seq1_chunk1(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_STRING_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos0 = pos;
            int zomStartLine0 = line;
            int zomStartColumn0 = column;
            while (true) {
                int beforePos0 = pos;
                int beforeLine0 = line;
                int beforeColumn0 = column;
                int zomIterPending0 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult zomElem0 = null;
                int choiceStart2Pos = pos;
                int choiceStart2Line = line;
                int choiceStart2Column = column;
                int choicePending2 = 0;
                var alt2_0 = matchCharClassCst("\"\\\\", true, false);
                if (alt2_0.isSuccess()) {
                    zomElem0 = alt2_0;
                } else if (alt2_0.isCutFailure()) {
                    zomElem0 = alt2_0.asRegularFailure();
                } else {
                    restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                CstParseResult alt2_1 = CstParseResult.successNoLoc(null, "");
                int seqStartPos4 = pos;
                int seqStartLine4 = line;
                int seqStartColumn4 = column;
                int seqPending4 = 0;
                boolean cut4 = false;
                if (alt2_1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_0 = matchLiteralCst("\\", false);
                    if (elem4_0.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        alt2_1 = elem4_0;
                    } else if (elem4_0.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        alt2_1 = cut4 ? elem4_0.asCutFailure() : elem4_0;
                    }
                }
                if (alt2_1.isSuccess()) {
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var elem4_1 = matchAnyCst();
                    if (elem4_1.isCutFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        alt2_1 = elem4_1;
                    } else if (elem4_1.isFailure()) {
                        restoreLocationRaw(seqStartPos4, seqStartLine4, seqStartColumn4);
                        alt2_1 = cut4 ? elem4_1.asCutFailure() : elem4_1;
                    }
                }
                if (alt2_1.isSuccess()) {
                    alt2_1 = CstParseResult.successNoLoc(null, substring(seqStartPos4, pos));
                }
                if (alt2_1.isSuccess()) {
                    zomElem0 = alt2_1;
                } else if (alt2_1.isCutFailure()) {
                    zomElem0 = alt2_1.asRegularFailure();
                } else {
                    restoreLocationRaw(choiceStart2Pos, choiceStart2Line, choiceStart2Column);
                }
                }
                if (zomElem0 == null) {
                    zomElem0 = CstParseResult.failure("one of alternatives");
                }
                if (zomElem0.isCutFailure()) {
                    elem_1 = zomElem0;
                    break;
                }
                if (zomElem0.isFailure() || pos == beforePos0) {
                    restoreLocationRaw(beforePos0, beforeLine0, beforeColumn0);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos0, pos));
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_StringLit_seq1_chunk2(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_STRING_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_2 = matchLiteralCst("\"", false);
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_NumLit() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        long key = cacheKey(136, startOffset);
        if (cache != null) {
            var cached = cache.get(key);
            if (cached != null) {
                if (cached.isSuccess()) {
                    var hitCarriedLeading = List.<Trivia>of();
                    var hitLocalLeading = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
                    var hitLeading = concatTrivia(hitCarriedLeading, hitLocalLeading);
                    var hitEndLoc = cached.endLocation.unwrap();
                    restoreLocation(hitEndLoc);
                    var hitNode = attachLeadingTrivia(cached.node.unwrap(), hitLeading);
                    return CstParseResult.success(hitNode, cached.text.or(""), hitEndLoc);
                }
                return cached;
            }
        }
        
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_NUM_LIT;
        
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case '0':
                {
                    result = parse_NumLit_alt0(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_NumLit_alt1(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (!result.isSuccess() && !result.isCutFailure()) {
                        result = parse_NumLit_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    }
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                {
                    result = parse_NumLit_alt2(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
                case '.':
                {
                    result = parse_NumLit_alt3(children, choiceStart0Pos, choiceStart0Line, choiceStart0Column, choicePending0, savedChildren0);
                    if (result != null && result.isCutFailure()) result = result.asRegularFailure();
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_NUM_LIT, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_NUM_LIT, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        if (cache != null) cache.put(key, cacheableResult);
        return finalResult;
    }

    private CstParseResult parse_NumLit_alt0(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_NUM_LIT;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("0", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_1 = matchCharClassCst("xX", false, false);
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int oomEntryPending4 = 0;
            var oomFirst4 = matchCharClassCst("0-9a-fA-F_", false, false);
            CstParseResult elem1_2 = oomFirst4;
            int oomStartPos4 = pos;
            int oomStartLine4 = line;
            int oomStartColumn4 = column;
            if (oomFirst4.isSuccess()) {
                while (true) {
                    int beforePos4 = pos;
                    int beforeLine4 = line;
                    int beforeColumn4 = column;
                    int oomIterPending4 = 0;
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var oomElem4 = matchCharClassCst("0-9a-fA-F_", false, false);
                    if (oomElem4.isCutFailure()) {
                        elem1_2 = oomElem4;
                        break;
                    }
                    if (oomElem4.isFailure() || pos == beforePos4) {
                        restoreLocationRaw(beforePos4, beforeLine4, beforeColumn4);
                        break;
                    }
                }
            }
            if (elem1_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_2;
            } else if (elem1_2.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_2.asCutFailure() : elem1_2;
            }
        }
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos7 = pos;
            int optStartLine7 = line;
            int optStartColumn7 = column;
            int optPending7 = 0;
            var optElem7 = matchCharClassCst("lL", false, false);
            CstParseResult elem1_3;
            if (optElem7.isCutFailure()) {
                restoreLocationRaw(optStartPos7, optStartLine7, optStartColumn7);
                elem1_3 = optElem7;
            } else if (optElem7.isSuccess()) {
                elem1_3 = optElem7;
            } else {
                restoreLocationRaw(optStartPos7, optStartLine7, optStartColumn7);
                elem1_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem1_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_3;
            } else if (elem1_3.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_3.asCutFailure() : elem1_3;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_0;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_0 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_0 = tbElem0;
        }
        if (alt0_0.isSuccess()) {
            return alt0_0;
        }
        if (alt0_0.isCutFailure()) {
            return alt0_0;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_0;
    }

    private CstParseResult parse_NumLit_alt1(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_NUM_LIT;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        boolean cut1 = false;
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_0 = matchLiteralCst("0", false);
            if (elem1_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_0;
            } else if (elem1_0.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_0.asCutFailure() : elem1_0;
            }
        }
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem1_1 = matchCharClassCst("bB", false, false);
            if (elem1_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_1;
            } else if (elem1_1.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_1.asCutFailure() : elem1_1;
            }
        }
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int oomEntryPending4 = 0;
            var oomFirst4 = matchCharClassCst("01_", false, false);
            CstParseResult elem1_2 = oomFirst4;
            int oomStartPos4 = pos;
            int oomStartLine4 = line;
            int oomStartColumn4 = column;
            if (oomFirst4.isSuccess()) {
                while (true) {
                    int beforePos4 = pos;
                    int beforeLine4 = line;
                    int beforeColumn4 = column;
                    int oomIterPending4 = 0;
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var oomElem4 = matchCharClassCst("01_", false, false);
                    if (oomElem4.isCutFailure()) {
                        elem1_2 = oomElem4;
                        break;
                    }
                    if (oomElem4.isFailure() || pos == beforePos4) {
                        restoreLocationRaw(beforePos4, beforeLine4, beforeColumn4);
                        break;
                    }
                }
            }
            if (elem1_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_2;
            } else if (elem1_2.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_2.asCutFailure() : elem1_2;
            }
        }
        if (tbElem0.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos7 = pos;
            int optStartLine7 = line;
            int optStartColumn7 = column;
            int optPending7 = 0;
            var optElem7 = matchCharClassCst("lL", false, false);
            CstParseResult elem1_3;
            if (optElem7.isCutFailure()) {
                restoreLocationRaw(optStartPos7, optStartLine7, optStartColumn7);
                elem1_3 = optElem7;
            } else if (optElem7.isSuccess()) {
                elem1_3 = optElem7;
            } else {
                restoreLocationRaw(optStartPos7, optStartLine7, optStartColumn7);
                elem1_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem1_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = elem1_3;
            } else if (elem1_3.isFailure()) {
                restoreLocationRaw(seqStartPos1, seqStartLine1, seqStartColumn1);
                tbElem0 = cut1 ? elem1_3.asCutFailure() : elem1_3;
            }
        }
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_1;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_1 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_1 = tbElem0;
        }
        if (alt0_1.isSuccess()) {
            return alt0_1;
        }
        if (alt0_1.isCutFailure()) {
            return alt0_1;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_1;
    }

    private CstParseResult parse_NumLit_alt2(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_NUM_LIT;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        tbElem0 = parse_NumLit_seq0_chunk0(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_NumLit_seq0_chunk1(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_NumLit_seq0_chunk2(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_NumLit_seq0_chunk3(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_2;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_2 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_2 = tbElem0;
        }
        if (alt0_2.isSuccess()) {
            return alt0_2;
        }
        if (alt0_2.isCutFailure()) {
            return alt0_2;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_2;
    }

    private CstParseResult parse_NumLit_alt3(ArrayList<CstNode> children, int choiceStartPos, int choiceStartLine, int choiceStartColumn, int choicePending, ArrayList<CstNode> childrenState) {
        var __ruleName = RULE_NUM_LIT;
        children.clear();
        children.addAll(childrenState);
        int tbStartPos0 = pos;
        int tbStartLine0 = line;
        int tbStartColumn0 = column;
        tokenBoundaryDepth++;
        var savedChildrenTb0 = new ArrayList<>(children);
        CstParseResult tbElem0 = CstParseResult.successNoLoc(null, "");
        int seqStartPos1 = pos;
        int seqStartLine1 = line;
        int seqStartColumn1 = column;
        int seqPending1 = 0;
        tbElem0 = parse_NumLit_seq1_chunk0(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_NumLit_seq1_chunk1(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) tbElem0 = parse_NumLit_seq1_chunk2(seqStartPos1, seqStartLine1, seqStartColumn1, seqPending1);
        if (tbElem0.isSuccess()) {
            tbElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos1, pos));
        }
        tokenBoundaryDepth--;
        children.clear();
        children.addAll(savedChildrenTb0);
        CstParseResult alt0_3;
        if (tbElem0.isSuccess()) {
            var tbText0 = substringSpan(tbStartPos0, pos);
            var tbSpan0 = new SourceSpan(tbStartLine0, tbStartColumn0, tbStartPos0, line, column, pos);
            var tbNode0 = new CstNode.Token(idGen.next(), tbSpan0, __ruleName, tbText0, List.<Trivia>of(), List.of());
            children.add(tbNode0);
            alt0_3 = CstParseResult.successNoLoc(tbNode0, tbText0);
        } else {
            alt0_3 = tbElem0;
        }
        if (alt0_3.isSuccess()) {
            return alt0_3;
        }
        if (alt0_3.isCutFailure()) {
            return alt0_3;
        }
        this.pos = choiceStartPos;
        this.line = choiceStartLine;
        this.column = choiceStartColumn;
        return alt0_3;
    }

    private CstParseResult parse_NumLit_seq0_chunk0(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_NUM_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchCharClassCst("0-9", false, false);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_1 = CstParseResult.successNoLoc(null, "");
            int zomStartPos1 = pos;
            int zomStartLine1 = line;
            int zomStartColumn1 = column;
            while (true) {
                int beforePos1 = pos;
                int beforeLine1 = line;
                int beforeColumn1 = column;
                int zomIterPending1 = 0;
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var zomElem1 = matchCharClassCst("0-9_", false, false);
                if (zomElem1.isCutFailure()) {
                    elem_1 = zomElem1;
                    break;
                }
                if (zomElem1.isFailure() || pos == beforePos1) {
                    restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                    break;
                }
            }
            if (!elem_1.isCutFailure()) {
                elem_1 = CstParseResult.successNoLoc(null, substring(zomStartPos1, pos));
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_NumLit_seq0_chunk1(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_NUM_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchLiteralCst(".", false);
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                CstParseResult elem2_1 = CstParseResult.successNoLoc(null, "");
                int zomStartPos4 = pos;
                int zomStartLine4 = line;
                int zomStartColumn4 = column;
                while (true) {
                    int beforePos4 = pos;
                    int beforeLine4 = line;
                    int beforeColumn4 = column;
                    int zomIterPending4 = 0;
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var zomElem4 = matchCharClassCst("0-9_", false, false);
                    if (zomElem4.isCutFailure()) {
                        elem2_1 = zomElem4;
                        break;
                    }
                    if (zomElem4.isFailure() || pos == beforePos4) {
                        restoreLocationRaw(beforePos4, beforeLine4, beforeColumn4);
                        break;
                    }
                }
                if (!elem2_1.isCutFailure()) {
                    elem2_1 = CstParseResult.successNoLoc(null, substring(zomStartPos4, pos));
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_NumLit_seq0_chunk2(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_NUM_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchCharClassCst("eE", false, false);
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                int optStartPos4 = pos;
                int optStartLine4 = line;
                int optStartColumn4 = column;
                int optPending4 = 0;
                var optElem4 = matchCharClassCst("+\\-", false, false);
                CstParseResult elem2_1;
                if (optElem4.isCutFailure()) {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    elem2_1 = optElem4;
                } else if (optElem4.isSuccess()) {
                    elem2_1 = optElem4;
                } else {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    elem2_1 = CstParseResult.successNoLoc(null, "");
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                int oomEntryPending6 = 0;
                var oomFirst6 = matchCharClassCst("0-9_", false, false);
                CstParseResult elem2_2 = oomFirst6;
                int oomStartPos6 = pos;
                int oomStartLine6 = line;
                int oomStartColumn6 = column;
                if (oomFirst6.isSuccess()) {
                    while (true) {
                        int beforePos6 = pos;
                        int beforeLine6 = line;
                        int beforeColumn6 = column;
                        int oomIterPending6 = 0;
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var oomElem6 = matchCharClassCst("0-9_", false, false);
                        if (oomElem6.isCutFailure()) {
                            elem2_2 = oomElem6;
                            break;
                        }
                        if (oomElem6.isFailure() || pos == beforePos6) {
                            restoreLocationRaw(beforePos6, beforeLine6, beforeColumn6);
                            break;
                        }
                    }
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_NumLit_seq0_chunk3(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_NUM_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var optElem0 = matchCharClassCst("fFdDlL", false, false);
            CstParseResult elem_4;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_4 = optElem0;
            } else if (optElem0.isSuccess()) {
                elem_4 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_4 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_4.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_4;
            } else if (elem_4.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_4.asCutFailure() : elem_4;
            }
        }
        return result;
    }

    private CstParseResult parse_NumLit_seq1_chunk0(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_NUM_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            var elem_0 = matchLiteralCst(".", false);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int oomEntryPending1 = 0;
            var oomFirst1 = matchCharClassCst("0-9_", false, false);
            CstParseResult elem_1 = oomFirst1;
            int oomStartPos1 = pos;
            int oomStartLine1 = line;
            int oomStartColumn1 = column;
            if (oomFirst1.isSuccess()) {
                while (true) {
                    int beforePos1 = pos;
                    int beforeLine1 = line;
                    int beforeColumn1 = column;
                    int oomIterPending1 = 0;
                    if (tokenBoundaryDepth == 0) skipWhitespace();
                    var oomElem1 = matchCharClassCst("0-9_", false, false);
                    if (oomElem1.isCutFailure()) {
                        elem_1 = oomElem1;
                        break;
                    }
                    if (oomElem1.isFailure() || pos == beforePos1) {
                        restoreLocationRaw(beforePos1, beforeLine1, beforeColumn1);
                        break;
                    }
                }
            }
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    private CstParseResult parse_NumLit_seq1_chunk1(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_NUM_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            CstParseResult optElem0 = CstParseResult.successNoLoc(null, "");
            int seqStartPos2 = pos;
            int seqStartLine2 = line;
            int seqStartColumn2 = column;
            int seqPending2 = 0;
            boolean cut2 = false;
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                var elem2_0 = matchCharClassCst("eE", false, false);
                if (elem2_0.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = elem2_0;
                } else if (elem2_0.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = cut2 ? elem2_0.asCutFailure() : elem2_0;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                int optStartPos4 = pos;
                int optStartLine4 = line;
                int optStartColumn4 = column;
                int optPending4 = 0;
                var optElem4 = matchCharClassCst("+\\-", false, false);
                CstParseResult elem2_1;
                if (optElem4.isCutFailure()) {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    elem2_1 = optElem4;
                } else if (optElem4.isSuccess()) {
                    elem2_1 = optElem4;
                } else {
                    restoreLocationRaw(optStartPos4, optStartLine4, optStartColumn4);
                    elem2_1 = CstParseResult.successNoLoc(null, "");
                }
                if (elem2_1.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = elem2_1;
                } else if (elem2_1.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = cut2 ? elem2_1.asCutFailure() : elem2_1;
                }
            }
            if (optElem0.isSuccess()) {
                if (tokenBoundaryDepth == 0) skipWhitespace();
                int oomEntryPending6 = 0;
                var oomFirst6 = matchCharClassCst("0-9_", false, false);
                CstParseResult elem2_2 = oomFirst6;
                int oomStartPos6 = pos;
                int oomStartLine6 = line;
                int oomStartColumn6 = column;
                if (oomFirst6.isSuccess()) {
                    while (true) {
                        int beforePos6 = pos;
                        int beforeLine6 = line;
                        int beforeColumn6 = column;
                        int oomIterPending6 = 0;
                        if (tokenBoundaryDepth == 0) skipWhitespace();
                        var oomElem6 = matchCharClassCst("0-9_", false, false);
                        if (oomElem6.isCutFailure()) {
                            elem2_2 = oomElem6;
                            break;
                        }
                        if (oomElem6.isFailure() || pos == beforePos6) {
                            restoreLocationRaw(beforePos6, beforeLine6, beforeColumn6);
                            break;
                        }
                    }
                }
                if (elem2_2.isCutFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = elem2_2;
                } else if (elem2_2.isFailure()) {
                    restoreLocationRaw(seqStartPos2, seqStartLine2, seqStartColumn2);
                    optElem0 = cut2 ? elem2_2.asCutFailure() : elem2_2;
                }
            }
            if (optElem0.isSuccess()) {
                optElem0 = CstParseResult.successNoLoc(null, substring(seqStartPos2, pos));
            }
            CstParseResult elem_2;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_2 = optElem0;
            } else if (optElem0.isSuccess()) {
                elem_2 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_2 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_2.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_2;
            } else if (elem_2.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_2.asCutFailure() : elem_2;
            }
        }
        return result;
    }

    private CstParseResult parse_NumLit_seq1_chunk2(int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending) {
        var __ruleName = RULE_NUM_LIT;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            int optStartPos0 = pos;
            int optStartLine0 = line;
            int optStartColumn0 = column;
            int optPending0 = 0;
            var optElem0 = matchCharClassCst("fFdD", false, false);
            CstParseResult elem_3;
            if (optElem0.isCutFailure()) {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_3 = optElem0;
            } else if (optElem0.isSuccess()) {
                elem_3 = optElem0;
            } else {
                restoreLocationRaw(optStartPos0, optStartLine0, optStartColumn0);
                elem_3 = CstParseResult.successNoLoc(null, "");
            }
            if (elem_3.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = elem_3;
            } else if (elem_3.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        result = cut ? elem_3.asCutFailure() : elem_3;
            }
        }
        return result;
    }

    private CstParseResult parse_Keyword() {
        int startOffset = pos;
        int startLine = line;
        int startColumn = column;
        
        // Skip leading whitespace and combine with carried pending-leading.
        var carriedLeading = List.<Trivia>of();
        var localLeadingTrivia = (tokenBoundaryDepth > 0) ? List.<Trivia>of() : skipWhitespace();
        var leadingTrivia = concatTrivia(carriedLeading, localLeadingTrivia);
        var children = new ArrayList<CstNode>();
        var __ruleName = RULE_KEYWORD;
        
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        int seqStartPos0 = pos;
        int seqStartLine0 = line;
        int seqStartColumn0 = column;
        int seqPending0 = 0;
        var seqChildren0 = new ArrayList<>(children);
        result = parse_Keyword_seq0_chunk0(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) result = parse_Keyword_seq0_chunk1(children, seqStartPos0, seqStartLine0, seqStartColumn0, seqPending0, seqChildren0);
        if (result.isSuccess()) {
            result = CstParseResult.successNoLoc(null, substring(seqStartPos0, pos));
        }
        
        CstParseResult finalResult;
        CstParseResult cacheableResult;
        if (result.isSuccess()) {
            var endLoc = location();
            var span = new SourceSpan(startLine, startColumn, startOffset, endLoc.line(), endLoc.column(), endLoc.offset());
            var cacheNode = wrapWithRuleName(result, children, span, RULE_KEYWORD, List.<Trivia>of());
            var node = wrapWithRuleName(result, children, span, RULE_KEYWORD, leadingTrivia);
            cacheableResult = CstParseResult.success(cacheNode, result.text.or(""), endLoc);
            finalResult = CstParseResult.success(node, result.text.or(""), endLoc);
        } else {
            this.pos = startOffset;
            this.line = startLine;
            this.column = startColumn;
            finalResult = result;
            cacheableResult = finalResult;
        }
        
        return finalResult;
    }

    private CstParseResult parse_Keyword_seq0_chunk0(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_KEYWORD;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            if (tokenBoundaryDepth == 0) skipWhitespace();
            CstParseResult elem_0 = parse_Keyword_choice0(children);
            if (elem_0.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_0;
            } else if (elem_0.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_0.asCutFailure() : elem_0;
            }
        }
        return result;
    }

    private CstParseResult parse_Keyword_choice0(ArrayList<CstNode> children) {
        var __ruleName = RULE_KEYWORD;
        CstParseResult result = null;
        int choiceStart0Pos = pos;
        int choiceStart0Line = line;
        int choiceStart0Column = column;
        int choicePending0 = 0;
        var savedChildren0 = new ArrayList<>(children);
        if (pos < input.length()) {
            char dispatchChar0 = input.charAt(pos);
            switch (dispatchChar0) {
                case 'a':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_0 = matchLiteralCst("abstract", false);
                    if (alt0_0.isSuccess() && alt0_0.node.isPresent()) {
                        children.add(alt0_0.node.unwrap());
                    }
                    if (alt0_0.isSuccess()) {
                        result = alt0_0;
                    } else if (alt0_0.isCutFailure()) {
                        result = alt0_0.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_1 = matchLiteralCst("assert", false);
                    if (alt0_1.isSuccess() && alt0_1.node.isPresent()) {
                        children.add(alt0_1.node.unwrap());
                    }
                    if (alt0_1.isSuccess()) {
                        result = alt0_1;
                    } else if (alt0_1.isCutFailure()) {
                        result = alt0_1.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case 'b':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_2 = matchLiteralCst("boolean", false);
                    if (alt0_2.isSuccess() && alt0_2.node.isPresent()) {
                        children.add(alt0_2.node.unwrap());
                    }
                    if (alt0_2.isSuccess()) {
                        result = alt0_2;
                    } else if (alt0_2.isCutFailure()) {
                        result = alt0_2.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_3 = matchLiteralCst("break", false);
                    if (alt0_3.isSuccess() && alt0_3.node.isPresent()) {
                        children.add(alt0_3.node.unwrap());
                    }
                    if (alt0_3.isSuccess()) {
                        result = alt0_3;
                    } else if (alt0_3.isCutFailure()) {
                        result = alt0_3.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_4 = matchLiteralCst("byte", false);
                    if (alt0_4.isSuccess() && alt0_4.node.isPresent()) {
                        children.add(alt0_4.node.unwrap());
                    }
                    if (alt0_4.isSuccess()) {
                        result = alt0_4;
                    } else if (alt0_4.isCutFailure()) {
                        result = alt0_4.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    break;
                }
                case 'c':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_5 = matchLiteralCst("case", false);
                    if (alt0_5.isSuccess() && alt0_5.node.isPresent()) {
                        children.add(alt0_5.node.unwrap());
                    }
                    if (alt0_5.isSuccess()) {
                        result = alt0_5;
                    } else if (alt0_5.isCutFailure()) {
                        result = alt0_5.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_6 = matchLiteralCst("catch", false);
                    if (alt0_6.isSuccess() && alt0_6.node.isPresent()) {
                        children.add(alt0_6.node.unwrap());
                    }
                    if (alt0_6.isSuccess()) {
                        result = alt0_6;
                    } else if (alt0_6.isCutFailure()) {
                        result = alt0_6.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_7 = matchLiteralCst("char", false);
                    if (alt0_7.isSuccess() && alt0_7.node.isPresent()) {
                        children.add(alt0_7.node.unwrap());
                    }
                    if (alt0_7.isSuccess()) {
                        result = alt0_7;
                    } else if (alt0_7.isCutFailure()) {
                        result = alt0_7.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_8 = matchLiteralCst("class", false);
                    if (alt0_8.isSuccess() && alt0_8.node.isPresent()) {
                        children.add(alt0_8.node.unwrap());
                    }
                    if (alt0_8.isSuccess()) {
                        result = alt0_8;
                    } else if (alt0_8.isCutFailure()) {
                        result = alt0_8.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_9 = matchLiteralCst("const", false);
                    if (alt0_9.isSuccess() && alt0_9.node.isPresent()) {
                        children.add(alt0_9.node.unwrap());
                    }
                    if (alt0_9.isSuccess()) {
                        result = alt0_9;
                    } else if (alt0_9.isCutFailure()) {
                        result = alt0_9.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_10 = matchLiteralCst("continue", false);
                    if (alt0_10.isSuccess() && alt0_10.node.isPresent()) {
                        children.add(alt0_10.node.unwrap());
                    }
                    if (alt0_10.isSuccess()) {
                        result = alt0_10;
                    } else if (alt0_10.isCutFailure()) {
                        result = alt0_10.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    }
                    }
                    }
                    break;
                }
                case 'd':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_11 = matchLiteralCst("default", false);
                    if (alt0_11.isSuccess() && alt0_11.node.isPresent()) {
                        children.add(alt0_11.node.unwrap());
                    }
                    if (alt0_11.isSuccess()) {
                        result = alt0_11;
                    } else if (alt0_11.isCutFailure()) {
                        result = alt0_11.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_12 = matchLiteralCst("double", false);
                    if (alt0_12.isSuccess() && alt0_12.node.isPresent()) {
                        children.add(alt0_12.node.unwrap());
                    }
                    if (alt0_12.isSuccess()) {
                        result = alt0_12;
                    } else if (alt0_12.isCutFailure()) {
                        result = alt0_12.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_13 = matchLiteralCst("do", false);
                    if (alt0_13.isSuccess() && alt0_13.node.isPresent()) {
                        children.add(alt0_13.node.unwrap());
                    }
                    if (alt0_13.isSuccess()) {
                        result = alt0_13;
                    } else if (alt0_13.isCutFailure()) {
                        result = alt0_13.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    break;
                }
                case 'e':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_14 = matchLiteralCst("else", false);
                    if (alt0_14.isSuccess() && alt0_14.node.isPresent()) {
                        children.add(alt0_14.node.unwrap());
                    }
                    if (alt0_14.isSuccess()) {
                        result = alt0_14;
                    } else if (alt0_14.isCutFailure()) {
                        result = alt0_14.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_15 = matchLiteralCst("enum", false);
                    if (alt0_15.isSuccess() && alt0_15.node.isPresent()) {
                        children.add(alt0_15.node.unwrap());
                    }
                    if (alt0_15.isSuccess()) {
                        result = alt0_15;
                    } else if (alt0_15.isCutFailure()) {
                        result = alt0_15.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_16 = matchLiteralCst("extends", false);
                    if (alt0_16.isSuccess() && alt0_16.node.isPresent()) {
                        children.add(alt0_16.node.unwrap());
                    }
                    if (alt0_16.isSuccess()) {
                        result = alt0_16;
                    } else if (alt0_16.isCutFailure()) {
                        result = alt0_16.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    break;
                }
                case 'f':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_17 = matchLiteralCst("false", false);
                    if (alt0_17.isSuccess() && alt0_17.node.isPresent()) {
                        children.add(alt0_17.node.unwrap());
                    }
                    if (alt0_17.isSuccess()) {
                        result = alt0_17;
                    } else if (alt0_17.isCutFailure()) {
                        result = alt0_17.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_18 = matchLiteralCst("finally", false);
                    if (alt0_18.isSuccess() && alt0_18.node.isPresent()) {
                        children.add(alt0_18.node.unwrap());
                    }
                    if (alt0_18.isSuccess()) {
                        result = alt0_18;
                    } else if (alt0_18.isCutFailure()) {
                        result = alt0_18.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_19 = matchLiteralCst("final", false);
                    if (alt0_19.isSuccess() && alt0_19.node.isPresent()) {
                        children.add(alt0_19.node.unwrap());
                    }
                    if (alt0_19.isSuccess()) {
                        result = alt0_19;
                    } else if (alt0_19.isCutFailure()) {
                        result = alt0_19.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_20 = matchLiteralCst("float", false);
                    if (alt0_20.isSuccess() && alt0_20.node.isPresent()) {
                        children.add(alt0_20.node.unwrap());
                    }
                    if (alt0_20.isSuccess()) {
                        result = alt0_20;
                    } else if (alt0_20.isCutFailure()) {
                        result = alt0_20.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_21 = matchLiteralCst("for", false);
                    if (alt0_21.isSuccess() && alt0_21.node.isPresent()) {
                        children.add(alt0_21.node.unwrap());
                    }
                    if (alt0_21.isSuccess()) {
                        result = alt0_21;
                    } else if (alt0_21.isCutFailure()) {
                        result = alt0_21.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    }
                    }
                    break;
                }
                case 'g':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_22 = matchLiteralCst("goto", false);
                    if (alt0_22.isSuccess() && alt0_22.node.isPresent()) {
                        children.add(alt0_22.node.unwrap());
                    }
                    if (alt0_22.isSuccess()) {
                        result = alt0_22;
                    } else if (alt0_22.isCutFailure()) {
                        result = alt0_22.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'i':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_23 = matchLiteralCst("implements", false);
                    if (alt0_23.isSuccess() && alt0_23.node.isPresent()) {
                        children.add(alt0_23.node.unwrap());
                    }
                    if (alt0_23.isSuccess()) {
                        result = alt0_23;
                    } else if (alt0_23.isCutFailure()) {
                        result = alt0_23.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_24 = matchLiteralCst("import", false);
                    if (alt0_24.isSuccess() && alt0_24.node.isPresent()) {
                        children.add(alt0_24.node.unwrap());
                    }
                    if (alt0_24.isSuccess()) {
                        result = alt0_24;
                    } else if (alt0_24.isCutFailure()) {
                        result = alt0_24.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_25 = matchLiteralCst("instanceof", false);
                    if (alt0_25.isSuccess() && alt0_25.node.isPresent()) {
                        children.add(alt0_25.node.unwrap());
                    }
                    if (alt0_25.isSuccess()) {
                        result = alt0_25;
                    } else if (alt0_25.isCutFailure()) {
                        result = alt0_25.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_26 = matchLiteralCst("interface", false);
                    if (alt0_26.isSuccess() && alt0_26.node.isPresent()) {
                        children.add(alt0_26.node.unwrap());
                    }
                    if (alt0_26.isSuccess()) {
                        result = alt0_26;
                    } else if (alt0_26.isCutFailure()) {
                        result = alt0_26.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_27 = matchLiteralCst("int", false);
                    if (alt0_27.isSuccess() && alt0_27.node.isPresent()) {
                        children.add(alt0_27.node.unwrap());
                    }
                    if (alt0_27.isSuccess()) {
                        result = alt0_27;
                    } else if (alt0_27.isCutFailure()) {
                        result = alt0_27.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_28 = matchLiteralCst("if", false);
                    if (alt0_28.isSuccess() && alt0_28.node.isPresent()) {
                        children.add(alt0_28.node.unwrap());
                    }
                    if (alt0_28.isSuccess()) {
                        result = alt0_28;
                    } else if (alt0_28.isCutFailure()) {
                        result = alt0_28.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    }
                    }
                    }
                    break;
                }
                case 'l':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_29 = matchLiteralCst("long", false);
                    if (alt0_29.isSuccess() && alt0_29.node.isPresent()) {
                        children.add(alt0_29.node.unwrap());
                    }
                    if (alt0_29.isSuccess()) {
                        result = alt0_29;
                    } else if (alt0_29.isCutFailure()) {
                        result = alt0_29.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 'n':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_30 = matchLiteralCst("native", false);
                    if (alt0_30.isSuccess() && alt0_30.node.isPresent()) {
                        children.add(alt0_30.node.unwrap());
                    }
                    if (alt0_30.isSuccess()) {
                        result = alt0_30;
                    } else if (alt0_30.isCutFailure()) {
                        result = alt0_30.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_31 = matchLiteralCst("new", false);
                    if (alt0_31.isSuccess() && alt0_31.node.isPresent()) {
                        children.add(alt0_31.node.unwrap());
                    }
                    if (alt0_31.isSuccess()) {
                        result = alt0_31;
                    } else if (alt0_31.isCutFailure()) {
                        result = alt0_31.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_32 = matchLiteralCst("null", false);
                    if (alt0_32.isSuccess() && alt0_32.node.isPresent()) {
                        children.add(alt0_32.node.unwrap());
                    }
                    if (alt0_32.isSuccess()) {
                        result = alt0_32;
                    } else if (alt0_32.isCutFailure()) {
                        result = alt0_32.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    break;
                }
                case 'p':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_33 = matchLiteralCst("package", false);
                    if (alt0_33.isSuccess() && alt0_33.node.isPresent()) {
                        children.add(alt0_33.node.unwrap());
                    }
                    if (alt0_33.isSuccess()) {
                        result = alt0_33;
                    } else if (alt0_33.isCutFailure()) {
                        result = alt0_33.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_34 = matchLiteralCst("private", false);
                    if (alt0_34.isSuccess() && alt0_34.node.isPresent()) {
                        children.add(alt0_34.node.unwrap());
                    }
                    if (alt0_34.isSuccess()) {
                        result = alt0_34;
                    } else if (alt0_34.isCutFailure()) {
                        result = alt0_34.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_35 = matchLiteralCst("protected", false);
                    if (alt0_35.isSuccess() && alt0_35.node.isPresent()) {
                        children.add(alt0_35.node.unwrap());
                    }
                    if (alt0_35.isSuccess()) {
                        result = alt0_35;
                    } else if (alt0_35.isCutFailure()) {
                        result = alt0_35.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_36 = matchLiteralCst("public", false);
                    if (alt0_36.isSuccess() && alt0_36.node.isPresent()) {
                        children.add(alt0_36.node.unwrap());
                    }
                    if (alt0_36.isSuccess()) {
                        result = alt0_36;
                    } else if (alt0_36.isCutFailure()) {
                        result = alt0_36.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    }
                    break;
                }
                case 'r':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_37 = matchLiteralCst("return", false);
                    if (alt0_37.isSuccess() && alt0_37.node.isPresent()) {
                        children.add(alt0_37.node.unwrap());
                    }
                    if (alt0_37.isSuccess()) {
                        result = alt0_37;
                    } else if (alt0_37.isCutFailure()) {
                        result = alt0_37.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
                case 's':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_38 = matchLiteralCst("short", false);
                    if (alt0_38.isSuccess() && alt0_38.node.isPresent()) {
                        children.add(alt0_38.node.unwrap());
                    }
                    if (alt0_38.isSuccess()) {
                        result = alt0_38;
                    } else if (alt0_38.isCutFailure()) {
                        result = alt0_38.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_39 = matchLiteralCst("static", false);
                    if (alt0_39.isSuccess() && alt0_39.node.isPresent()) {
                        children.add(alt0_39.node.unwrap());
                    }
                    if (alt0_39.isSuccess()) {
                        result = alt0_39;
                    } else if (alt0_39.isCutFailure()) {
                        result = alt0_39.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_40 = matchLiteralCst("strictfp", false);
                    if (alt0_40.isSuccess() && alt0_40.node.isPresent()) {
                        children.add(alt0_40.node.unwrap());
                    }
                    if (alt0_40.isSuccess()) {
                        result = alt0_40;
                    } else if (alt0_40.isCutFailure()) {
                        result = alt0_40.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_41 = matchLiteralCst("super", false);
                    if (alt0_41.isSuccess() && alt0_41.node.isPresent()) {
                        children.add(alt0_41.node.unwrap());
                    }
                    if (alt0_41.isSuccess()) {
                        result = alt0_41;
                    } else if (alt0_41.isCutFailure()) {
                        result = alt0_41.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_42 = matchLiteralCst("switch", false);
                    if (alt0_42.isSuccess() && alt0_42.node.isPresent()) {
                        children.add(alt0_42.node.unwrap());
                    }
                    if (alt0_42.isSuccess()) {
                        result = alt0_42;
                    } else if (alt0_42.isCutFailure()) {
                        result = alt0_42.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_43 = matchLiteralCst("synchronized", false);
                    if (alt0_43.isSuccess() && alt0_43.node.isPresent()) {
                        children.add(alt0_43.node.unwrap());
                    }
                    if (alt0_43.isSuccess()) {
                        result = alt0_43;
                    } else if (alt0_43.isCutFailure()) {
                        result = alt0_43.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    }
                    }
                    }
                    break;
                }
                case 't':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_44 = matchLiteralCst("this", false);
                    if (alt0_44.isSuccess() && alt0_44.node.isPresent()) {
                        children.add(alt0_44.node.unwrap());
                    }
                    if (alt0_44.isSuccess()) {
                        result = alt0_44;
                    } else if (alt0_44.isCutFailure()) {
                        result = alt0_44.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_45 = matchLiteralCst("throws", false);
                    if (alt0_45.isSuccess() && alt0_45.node.isPresent()) {
                        children.add(alt0_45.node.unwrap());
                    }
                    if (alt0_45.isSuccess()) {
                        result = alt0_45;
                    } else if (alt0_45.isCutFailure()) {
                        result = alt0_45.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_46 = matchLiteralCst("throw", false);
                    if (alt0_46.isSuccess() && alt0_46.node.isPresent()) {
                        children.add(alt0_46.node.unwrap());
                    }
                    if (alt0_46.isSuccess()) {
                        result = alt0_46;
                    } else if (alt0_46.isCutFailure()) {
                        result = alt0_46.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_47 = matchLiteralCst("transient", false);
                    if (alt0_47.isSuccess() && alt0_47.node.isPresent()) {
                        children.add(alt0_47.node.unwrap());
                    }
                    if (alt0_47.isSuccess()) {
                        result = alt0_47;
                    } else if (alt0_47.isCutFailure()) {
                        result = alt0_47.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_48 = matchLiteralCst("true", false);
                    if (alt0_48.isSuccess() && alt0_48.node.isPresent()) {
                        children.add(alt0_48.node.unwrap());
                    }
                    if (alt0_48.isSuccess()) {
                        result = alt0_48;
                    } else if (alt0_48.isCutFailure()) {
                        result = alt0_48.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_49 = matchLiteralCst("try", false);
                    if (alt0_49.isSuccess() && alt0_49.node.isPresent()) {
                        children.add(alt0_49.node.unwrap());
                    }
                    if (alt0_49.isSuccess()) {
                        result = alt0_49;
                    } else if (alt0_49.isCutFailure()) {
                        result = alt0_49.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    }
                    }
                    }
                    }
                    break;
                }
                case 'v':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_50 = matchLiteralCst("void", false);
                    if (alt0_50.isSuccess() && alt0_50.node.isPresent()) {
                        children.add(alt0_50.node.unwrap());
                    }
                    if (alt0_50.isSuccess()) {
                        result = alt0_50;
                    } else if (alt0_50.isCutFailure()) {
                        result = alt0_50.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_51 = matchLiteralCst("volatile", false);
                    if (alt0_51.isSuccess() && alt0_51.node.isPresent()) {
                        children.add(alt0_51.node.unwrap());
                    }
                    if (alt0_51.isSuccess()) {
                        result = alt0_51;
                    } else if (alt0_51.isCutFailure()) {
                        result = alt0_51.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    }
                    break;
                }
                case 'w':
                {
                    children.clear();
                    children.addAll(savedChildren0);
                    var alt0_52 = matchLiteralCst("while", false);
                    if (alt0_52.isSuccess() && alt0_52.node.isPresent()) {
                        children.add(alt0_52.node.unwrap());
                    }
                    if (alt0_52.isSuccess()) {
                        result = alt0_52;
                    } else if (alt0_52.isCutFailure()) {
                        result = alt0_52.asRegularFailure();
                    } else {
                        restoreLocationRaw(choiceStart0Pos, choiceStart0Line, choiceStart0Column);
                    }
                    break;
                }
            }
        }
        if (result == null) {
            children.clear();
            children.addAll(savedChildren0);
            result = CstParseResult.failure("one of alternatives");
        }
        return result;
    }

    private CstParseResult parse_Keyword_seq0_chunk1(ArrayList<CstNode> children, int seqStartPos, int seqStartLine, int seqStartColumn, int seqPending, ArrayList<CstNode> seqChildren) {
        var __ruleName = RULE_KEYWORD;
        CstParseResult result = CstParseResult.successNoLoc(null, "");
        boolean cut = false;
        if (result.isSuccess()) {
            int notStartPos0 = pos;
            int notStartLine0 = line;
            int notStartColumn0 = column;
            var savedChildrenNot0 = new ArrayList<>(children);
            var notElem0 = matchCharClassCst("a-zA-Z0-9_$", false, false);
            restoreLocationRaw(notStartPos0, notStartLine0, notStartColumn0);
            children.clear();
            children.addAll(savedChildrenNot0);
            var elem_1 = notElem0.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
            if (elem_1.isCutFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = elem_1;
            } else if (elem_1.isFailure()) {
                restoreLocationRaw(seqStartPos, seqStartLine, seqStartColumn);
                        children.clear();
                children.addAll(seqChildren);
                result = cut ? elem_1.asCutFailure() : elem_1;
            }
        }
        return result;
    }

    // === Helper Methods ===

    private List<Trivia> skipWhitespace() {
        if (skippingWhitespace || tokenBoundaryDepth > 0 || pos >= input.length()) return List.of();
        char c = input.charAt(pos);
        if (c != ' ' && c != '\t' && c != '\r' && c != '\n' && c != '/') return List.of();
        var trivia = new ArrayList<Trivia>();
        if (skippingWhitespace || tokenBoundaryDepth > 0) return trivia;
        skippingWhitespace = true;
        try {
        while (!isAtEnd()) {
            int wsStartLine = line;
            int wsStartColumn = column;
            int wsStartPos = pos;
            CstParseResult wsResult = null;
            int choiceStart1Pos = pos;
            int choiceStart1Line = line;
            int choiceStart1Column = column;
            int choicePending1 = 0;
            if (pos < input.length()) {
                char dispatchChar1 = input.charAt(pos);
                switch (dispatchChar1) {
                    case '\t':
                    case '\n':
                    case '\r':
                    case ' ':
                    {
                        var alt1_0 = matchCharClassCst(" \\t\\r\\n", false, false);
                        if (alt1_0.isSuccess()) {
                            wsResult = alt1_0;
                        } else if (alt1_0.isCutFailure()) {
                            wsResult = alt1_0.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        break;
                    }
                    case '/':
                    {
                        CstParseResult alt1_1 = CstParseResult.successNoLoc(null, "");
                        int seqStartPos3 = pos;
                        int seqStartLine3 = line;
                        int seqStartColumn3 = column;
                        int seqPending3 = 0;
                        boolean cut3 = false;
                        if (alt1_1.isSuccess()) {
                            var elem3_0 = matchLiteralCst("//", false);
                            if (elem3_0.isCutFailure()) {
                                restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                                alt1_1 = elem3_0;
                            } else if (elem3_0.isFailure()) {
                                restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                                alt1_1 = cut3 ? elem3_0.asCutFailure() : elem3_0;
                            }
                        }
                        if (alt1_1.isSuccess()) {
                            CstParseResult elem3_1 = CstParseResult.successNoLoc(null, "");
                            int zomStartPos5 = pos;
                            int zomStartLine5 = line;
                            int zomStartColumn5 = column;
                            while (true) {
                                int beforePos5 = pos;
                                int beforeLine5 = line;
                                int beforeColumn5 = column;
                                int zomIterPending5 = 0;
                                var zomElem5 = matchCharClassCst("\\n", true, false);
                                if (zomElem5.isCutFailure()) {
                                    elem3_1 = zomElem5;
                                    break;
                                }
                                if (zomElem5.isFailure() || pos == beforePos5) {
                                    restoreLocationRaw(beforePos5, beforeLine5, beforeColumn5);
                                    break;
                                }
                            }
                            if (!elem3_1.isCutFailure()) {
                                elem3_1 = CstParseResult.successNoLoc(null, substring(zomStartPos5, pos));
                            }
                            if (elem3_1.isCutFailure()) {
                                restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                                alt1_1 = elem3_1;
                            } else if (elem3_1.isFailure()) {
                                restoreLocationRaw(seqStartPos3, seqStartLine3, seqStartColumn3);
                                alt1_1 = cut3 ? elem3_1.asCutFailure() : elem3_1;
                            }
                        }
                        if (alt1_1.isSuccess()) {
                            alt1_1 = CstParseResult.successNoLoc(null, substring(seqStartPos3, pos));
                        }
                        if (alt1_1.isSuccess()) {
                            wsResult = alt1_1;
                        } else if (alt1_1.isCutFailure()) {
                            wsResult = alt1_1.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        CstParseResult alt1_2 = CstParseResult.successNoLoc(null, "");
                        int seqStartPos7 = pos;
                        int seqStartLine7 = line;
                        int seqStartColumn7 = column;
                        int seqPending7 = 0;
                        boolean cut7 = false;
                        if (alt1_2.isSuccess()) {
                            var elem7_0 = matchLiteralCst("/*", false);
                            if (elem7_0.isCutFailure()) {
                                restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                                alt1_2 = elem7_0;
                            } else if (elem7_0.isFailure()) {
                                restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                                alt1_2 = cut7 ? elem7_0.asCutFailure() : elem7_0;
                            }
                        }
                        if (alt1_2.isSuccess()) {
                            CstParseResult elem7_1 = CstParseResult.successNoLoc(null, "");
                            int zomStartPos9 = pos;
                            int zomStartLine9 = line;
                            int zomStartColumn9 = column;
                            while (true) {
                                int beforePos9 = pos;
                                int beforeLine9 = line;
                                int beforeColumn9 = column;
                                int zomIterPending9 = 0;
                                CstParseResult zomElem9 = CstParseResult.successNoLoc(null, "");
                                int seqStartPos11 = pos;
                                int seqStartLine11 = line;
                                int seqStartColumn11 = column;
                                int seqPending11 = 0;
                                boolean cut11 = false;
                                if (zomElem9.isSuccess()) {
                                    int notStartPos12 = pos;
                                    int notStartLine12 = line;
                                    int notStartColumn12 = column;
                                    var notElem12 = matchLiteralCst("*/", false);
                                    restoreLocationRaw(notStartPos12, notStartLine12, notStartColumn12);
                                    var elem11_0 = notElem12.isSuccess() ? CstParseResult.failure("not match") : CstParseResult.successNoLoc(null, "");
                                    if (elem11_0.isCutFailure()) {
                                        restoreLocationRaw(seqStartPos11, seqStartLine11, seqStartColumn11);
                                        zomElem9 = elem11_0;
                                    } else if (elem11_0.isFailure()) {
                                        restoreLocationRaw(seqStartPos11, seqStartLine11, seqStartColumn11);
                                        zomElem9 = cut11 ? elem11_0.asCutFailure() : elem11_0;
                                    }
                                }
                                if (zomElem9.isSuccess()) {
                                    var elem11_1 = matchAnyCst();
                                    if (elem11_1.isCutFailure()) {
                                        restoreLocationRaw(seqStartPos11, seqStartLine11, seqStartColumn11);
                                        zomElem9 = elem11_1;
                                    } else if (elem11_1.isFailure()) {
                                        restoreLocationRaw(seqStartPos11, seqStartLine11, seqStartColumn11);
                                        zomElem9 = cut11 ? elem11_1.asCutFailure() : elem11_1;
                                    }
                                }
                                if (zomElem9.isSuccess()) {
                                    zomElem9 = CstParseResult.successNoLoc(null, substring(seqStartPos11, pos));
                                }
                                if (zomElem9.isCutFailure()) {
                                    elem7_1 = zomElem9;
                                    break;
                                }
                                if (zomElem9.isFailure() || pos == beforePos9) {
                                    restoreLocationRaw(beforePos9, beforeLine9, beforeColumn9);
                                    break;
                                }
                            }
                            if (!elem7_1.isCutFailure()) {
                                elem7_1 = CstParseResult.successNoLoc(null, substring(zomStartPos9, pos));
                            }
                            if (elem7_1.isCutFailure()) {
                                restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                                alt1_2 = elem7_1;
                            } else if (elem7_1.isFailure()) {
                                restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                                alt1_2 = cut7 ? elem7_1.asCutFailure() : elem7_1;
                            }
                        }
                        if (alt1_2.isSuccess()) {
                            var elem7_2 = matchLiteralCst("*/", false);
                            if (elem7_2.isCutFailure()) {
                                restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                                alt1_2 = elem7_2;
                            } else if (elem7_2.isFailure()) {
                                restoreLocationRaw(seqStartPos7, seqStartLine7, seqStartColumn7);
                                alt1_2 = cut7 ? elem7_2.asCutFailure() : elem7_2;
                            }
                        }
                        if (alt1_2.isSuccess()) {
                            alt1_2 = CstParseResult.successNoLoc(null, substring(seqStartPos7, pos));
                        }
                        if (alt1_2.isSuccess()) {
                            wsResult = alt1_2;
                        } else if (alt1_2.isCutFailure()) {
                            wsResult = alt1_2.asRegularFailure();
                        } else {
                            restoreLocationRaw(choiceStart1Pos, choiceStart1Line, choiceStart1Column);
                        }
                        }
                        break;
                    }
                }
            }
            if (wsResult == null) {
                wsResult = CstParseResult.failure("one of alternatives");
            }
            if (wsResult.isFailure() || pos == wsStartPos) break;
            var wsText = substring(wsStartPos, pos);
            var wsSpan = new SourceSpan(wsStartLine, wsStartColumn, wsStartPos, line, column, pos);
            trivia.add(classifyTrivia(wsSpan, wsText));
        }
        } finally {
            skippingWhitespace = false;
        }
        return trivia;
    }

    private CstNode wrapWithRuleName(CstParseResult result, List<CstNode> children, SourceSpan span, RuleId ruleId, List<Trivia> leadingTrivia) {
        // If result produced a single node (Token or Terminal), re-wrap with rule name and trivia
        // This matches PegEngine.wrapWithRuleName behavior
        if (result.node.isPresent()) {
            var inner = result.node.unwrap();
            return switch (inner) {
                case CstNode.Token tok -> new CstNode.Token(tok.id(), span, ruleId, tok.text(), leadingTrivia, List.of());
                case CstNode.Terminal t -> new CstNode.Terminal(t.id(), span, ruleId, t.text(), leadingTrivia, List.of());
                case CstNode.NonTerminal nt -> new CstNode.NonTerminal(nt.id(), span, ruleId, nt.children(), leadingTrivia, List.of());
            };
        }
        // No inner node   wrap children in NonTerminal
        return new CstNode.NonTerminal(idGen.next(), span, ruleId, children, leadingTrivia, List.of());
    }

    private Trivia classifyTrivia(SourceSpan span, String text) {
        if (text.startsWith("//")) {
            return new Trivia.LineComment(span, text);
        } else if (text.startsWith("/*")) {
            return new Trivia.BlockComment(span, text);
        } else {
            return new Trivia.Whitespace(span, text);
        }
    }

    // === Pending-leading trivia helpers ===
    // See docs/TRIVIA-ATTRIBUTION.md for the attribution rule.

    private void appendPending(List<Trivia> captured) {
        // no-op: triviaPostPass=true; attribution handled by post-pass.
    }

    private List<Trivia> takePendingLeading() {
        return List.of();
    }

    private int savePendingLeading() {
        return 0;
    }

    private void restorePendingLeading(int snapshot) {
        // no-op: triviaPostPass=true; attribution handled by post-pass.
    }

    private List<Trivia> concatTrivia(List<Trivia> first, List<Trivia> second) {
        if (first.isEmpty()) return second;
        if (second.isEmpty()) return first;
        var combined = new ArrayList<Trivia>(first.size() + second.size());
        combined.addAll(first);
        combined.addAll(second);
        return List.copyOf(combined);
    }

    private CstNode attachLeadingTrivia(CstNode node, List<Trivia> leadingTrivia) {
        if (leadingTrivia.isEmpty()) {
            return node;
        }
        return switch (node) {
            case CstNode.Terminal t -> new CstNode.Terminal(
                t.id(), t.span(), t.rule(), t.text(), leadingTrivia, t.trailingTrivia()
            );
            case CstNode.NonTerminal nt -> new CstNode.NonTerminal(
                nt.id(), nt.span(), nt.rule(), nt.children(), leadingTrivia, nt.trailingTrivia()
            );
            case CstNode.Token tok -> new CstNode.Token(
                tok.id(), tok.span(), tok.rule(), tok.text(), leadingTrivia, tok.trailingTrivia()
            );
        };
    }

    private CstNode attachTrailingTrivia(CstNode node, List<Trivia> trailingTrivia) {
        if (trailingTrivia.isEmpty()) {
            return node;
        }
        return switch (node) {
            case CstNode.Terminal t -> new CstNode.Terminal(
                t.id(), t.span(), t.rule(), t.text(), t.leadingTrivia(), trailingTrivia
            );
            case CstNode.NonTerminal nt -> new CstNode.NonTerminal(
                nt.id(), nt.span(), nt.rule(), nt.children(), nt.leadingTrivia(), trailingTrivia
            );
            case CstNode.Token tok -> new CstNode.Token(
                tok.id(), tok.span(), tok.rule(), tok.text(), tok.leadingTrivia(), trailingTrivia
            );
        };
    }

    private CstNode attachTrailingToTail(CstNode node, List<Trivia> trivia) {
        if (trivia.isEmpty()) return node;
        return switch (node) {
            case CstNode.NonTerminal nt -> {
                var ntChildren = nt.children();
                if (ntChildren.isEmpty()) {
                    var combined = concatTrivia(nt.trailingTrivia(), trivia);
                    yield new CstNode.NonTerminal(
                        nt.id(), nt.span(), nt.rule(), ntChildren, nt.leadingTrivia(), combined
                    );
                }
                var newChildren = new ArrayList<CstNode>(ntChildren);
                var lastIdx = newChildren.size() - 1;
                var lastChild = newChildren.get(lastIdx);
                newChildren.set(lastIdx, attachTrailingToTail(lastChild, trivia));
                yield new CstNode.NonTerminal(
                    nt.id(), nt.span(), nt.rule(), List.copyOf(newChildren), nt.leadingTrivia(), nt.trailingTrivia()
                );
            }
            case CstNode.Terminal t -> new CstNode.Terminal(
                t.id(), t.span(), t.rule(), t.text(), t.leadingTrivia(), concatTrivia(t.trailingTrivia(), trivia)
            );
            case CstNode.Token tok -> new CstNode.Token(
                tok.id(), tok.span(), tok.rule(), tok.text(), tok.leadingTrivia(), concatTrivia(tok.trailingTrivia(), trivia)
            );
        };
    }


    private CstParseResult matchLiteralCst(String text, boolean caseInsensitive) {
        int len = text.length();
        if (input.length() - pos < len) {
            var f = literalFailure(text);
            trackFailure(f.expected.unwrap());
            return f;
        }
        int startPos = pos;
        int startLine = line;
        int startColumn = column;
        if (caseInsensitive) {
            for (int i = 0; i < len; i++) {
                if (Character.toLowerCase(text.charAt(i)) != Character.toLowerCase(input.charAt(pos + i))) {
                    var f = literalFailure(text);
                    trackFailure(f.expected.unwrap());
                    return f;
                }
            }
        } else {
            for (int i = 0; i < len; i++) {
                if (text.charAt(i) != input.charAt(pos + i)) {
                    var f = literalFailure(text);
                    trackFailure(f.expected.unwrap());
                    return f;
                }
            }
        }
        if (text.indexOf('\n') < 0) {
            pos += len;
            column += len;
        } else {
            for (int i = 0; i < len; i++) advance();
        }
        var span = new SourceSpan(startLine, startColumn, startPos, line, column, pos);
        var node = new CstNode.Terminal(idGen.next(), span, RULE_PEG_LITERAL, text, List.<Trivia>of(), List.of());
        return CstParseResult.successNoLoc(node, text);
    }

    private CstParseResult literalFailure(String text) {
        CstParseResult r = literalFailureCache.get(text);
        if (r == null) {
            r = CstParseResult.failure("'" + text + "'");
            literalFailureCache.put(text, r);
        }
        return r;
    }

    private CstParseResult matchDictionaryCst(List<String> words, boolean caseInsensitive) {
        String longestMatch = null;
        int longestLen = 0;
        for (var word : words) {
            if (matchesWord(word, caseInsensitive) && word.length() > longestLen) {
                longestMatch = word;
                longestLen = word.length();
            }
        }
        if (longestMatch == null) {
            trackFailure("dictionary word");
            return CstParseResult.failure("dictionary word");
        }
        int startPos = pos;
        int startLine = line;
        int startColumn = column;
        for (int i = 0; i < longestLen; i++) {
            advance();
        }
        var span = new SourceSpan(startLine, startColumn, startPos, line, column, pos);
        var node = new CstNode.Terminal(idGen.next(), span, RULE_PEG_LITERAL, longestMatch, List.<Trivia>of(), List.of());
        return CstParseResult.successNoLoc(node, longestMatch);
    }

    private boolean matchesWord(String word, boolean caseInsensitive) {
        if (remaining() < word.length()) return false;
        for (int i = 0; i < word.length(); i++) {
            char expected = word.charAt(i);
            char actual = peek(i);
            if (caseInsensitive) {
                if (Character.toLowerCase(expected) != Character.toLowerCase(actual)) return false;
            } else {
                if (expected != actual) return false;
            }
        }
        return true;
    }

    private CstParseResult matchCharClassCst(String pattern, boolean negated, boolean caseInsensitive) {
        if (isAtEnd()) {
            var f = charClassFailure(pattern, negated);
            trackFailure(f.expected.unwrap());
            return f;
        }
        int startPos = pos;
        int startLine = line;
        int startColumn = column;
        char c = peek();
        boolean matches = matchesPattern(c, pattern, caseInsensitive);
        if (negated) matches = !matches;
        if (!matches) {
            var f = charClassFailure(pattern, negated);
            trackFailure(f.expected.unwrap());
            return f;
        }
        advance();
        var text = c < 128 ? ASCII_CHAR_STRINGS[c] : String.valueOf(c);
        var span = new SourceSpan(startLine, startColumn, startPos, line, column, pos);
        var node = new CstNode.Terminal(idGen.next(), span, RULE_PEG_CHAR_CLASS, text, List.<Trivia>of(), List.of());
        return CstParseResult.successNoLoc(node, text);
    }

    private CstParseResult charClassFailure(String pattern, boolean negated) {
        String key = negated ? "^" + pattern : pattern;
        CstParseResult r = charClassFailureCache.get(key);
        if (r == null) {
            r = CstParseResult.failure("[" + (negated ? "^" : "") + pattern + "]");
            charClassFailureCache.put(key, r);
        }
        return r;
    }

    private boolean matchesPattern(char c, String pattern, boolean caseInsensitive) {
        char testChar = caseInsensitive ? Character.toLowerCase(c) : c;
        int i = 0;
        while (i < pattern.length()) {
            char start = pattern.charAt(i);
            if (start == '\\' && i + 1 < pattern.length()) {
                char escaped = pattern.charAt(i + 1);
                int consumed = 2;
                char expected = switch (escaped) {
                    case 'n' -> '\n';
                    case 'r' -> '\r';
                    case 't' -> '\t';
                    case '\\' -> '\\';
                    case ']' -> ']';
                    case '-' -> '-';
                    case 'x' -> {
                        if (i + 4 <= pattern.length()) {
                            try {
                                var hex = pattern.substring(i + 2, i + 4);
                                consumed = 4;
                                yield (char) Integer.parseInt(hex, 16);
                            } catch (NumberFormatException e) { yield 'x'; }
                        }
                        yield 'x';
                    }
                    case 'u' -> {
                        if (i + 6 <= pattern.length()) {
                            try {
                                var hex = pattern.substring(i + 2, i + 6);
                                consumed = 6;
                                yield (char) Integer.parseInt(hex, 16);
                            } catch (NumberFormatException e) { yield 'u'; }
                        }
                        yield 'u';
                    }
                    default -> escaped;
                };
                if (caseInsensitive) expected = Character.toLowerCase(expected);
                if (testChar == expected) return true;
                i += consumed;
                continue;
            }
            if (i + 2 < pattern.length() && pattern.charAt(i + 1) == '-') {
                char end = pattern.charAt(i + 2);
                if (caseInsensitive) {
                    start = Character.toLowerCase(start);
                    end = Character.toLowerCase(end);
                }
                if (testChar >= start && testChar <= end) return true;
                i += 3;
            } else {
                if (caseInsensitive) start = Character.toLowerCase(start);
                if (testChar == start) return true;
                i++;
            }
        }
        return false;
    }

    private CstParseResult matchAnyCst() {
        if (isAtEnd()) {
            trackFailure("any character");
            return CstParseResult.failure("any character");
        }
        int startPos = pos;
        int startLine = line;
        int startColumn = column;
        char c = advance();
        var text = c < 128 ? ASCII_CHAR_STRINGS[c] : String.valueOf(c);
        var span = new SourceSpan(startLine, startColumn, startPos, line, column, pos);
        var node = new CstNode.Terminal(idGen.next(), span, RULE_PEG_ANY, text, List.<Trivia>of(), List.of());
        return CstParseResult.successNoLoc(node, text);
    }

    // === CST Parse Result ===

    private static final class CstParseResult {
        final boolean success;
        final Option<CstNode> node;
        // Cleanup F.2: widen text from Option<String> to Option<CharSequence>
        // so F.3 can emit StringSpan into this field without forcing
        // String materialization. Consumers (textOrEmpty helper) read
        // via .or("") which produces CharSequence, accepted everywhere.
        final Option<CharSequence> text;
        final Option<String> expected;
        final Option<SourceLocation> endLocation;
        final boolean cutFailed;

        private CstParseResult(boolean success, Option<CstNode> node, Option<CharSequence> text, Option<String> expected, Option<SourceLocation> endLocation, boolean cutFailed) {
            this.success = success;
            this.node = node;
            this.text = text;
            this.expected = expected;
            this.endLocation = endLocation;
            this.cutFailed = cutFailed;
        }

        boolean isSuccess() { return success; }
        boolean isFailure() { return !success; }
        boolean isCutFailure() { return !success && cutFailed; }

        static CstParseResult success(CstNode node, CharSequence text, SourceLocation endLocation) {
            return new CstParseResult(true, Option.option(node), Option.<CharSequence>some(text), Option.none(), Option.some(endLocation), false);
        }

        // Phase 1.7 (D2): intermediate-result success that omits endLocation.
        // See mutable variant above for rationale.
        static CstParseResult successNoLoc(CstNode node, CharSequence text) {
            return new CstParseResult(true, Option.option(node), Option.<CharSequence>some(text), Option.none(), Option.none(), false);
        }

        static CstParseResult failure(String expected) {
            return new CstParseResult(false, Option.none(), Option.none(), Option.some(expected), Option.none(), false);
        }

        static CstParseResult cutFailure(String expected) {
            return new CstParseResult(false, Option.none(), Option.none(), Option.some(expected), Option.none(), true);
        }

        CstParseResult asCutFailure() {
            return cutFailed ? this : new CstParseResult(false, Option.none(), Option.none(), expected, Option.none(), true);
        }

        CstParseResult asRegularFailure() {
            return cutFailed ? new CstParseResult(false, Option.none(), Option.none(), expected, Option.none(), false) : this;
        }
    }
    // === Embedded TriviaPostPass (Step 4 commit 4   flag-ON) ===
    /**
     * Re-derive leading/trailing trivia attribution from
     * (input, span, %whitespace) after the engine returns its CST.
     * Mirrors org.pragmatica.peg.source.TriviaPostPass at the runtime.
     */
    private static final class TriviaPostPass {
        private TriviaPostPass() {}

        static CstNode assignTrivia(String input, CstNode cst, int leadingScanFrom) {
            int rootStart = cst.span().startOffset();
            if (leadingScanFrom < 0 || leadingScanFrom > rootStart) {
                // Generator span semantics: rootStart may be 0 (span includes
                // leading whitespace). Clamp leadingScanFrom rather than reject.
                if (leadingScanFrom > 0 && rootStart == 0) {
                    leadingScanFrom = 0;
                } else {
                    throw new IllegalArgumentException(
                        "leadingScanFrom " + leadingScanFrom + " out of range [0, " + rootStart + "]");
                }
            }
            // Build line-start table once per pass (O(N)) so that per-chunk
            // computeSpan is O(log N) instead of O(from). Eliminates an O(N )
            // hotspot for whitespace-rich source.
            int[] lineStarts = buildLineStarts(input);
            return rebuildRoot(input, cst, lineStarts, leadingScanFrom);
        }

        private static int[] buildLineStarts(String input) {
            int len = input.length();
            int[] starts = new int[Math.max(8, len / 16 + 4)];
            int n = 0;
            starts[n++] = 0;
            for (int i = 0; i < len; i++) {
                if (input.charAt(i) == '\n') {
                    if (n == starts.length) {
                        starts = java.util.Arrays.copyOf(starts, starts.length * 2);
                    }
                    starts[n++] = i + 1;
                }
            }
            return java.util.Arrays.copyOf(starts, n);
        }

        private static int[] lineColAt(int[] lineStarts, int offset) {
            int idx = java.util.Arrays.binarySearch(lineStarts, offset);
            if (idx < 0) idx = -idx - 2;
            int line = idx + 1;
            int col = offset - lineStarts[idx] + 1;
            return new int[]{line, col};
        }

        static List<Trivia> scanWhitespace(String input, int from, int to, int[] lineStarts) {
            if (from >= to) return List.of();
            var trivia = new ArrayList<Trivia>();
            int pos = from;
            while (pos < to) {
                int matched = matchWsInner(input, pos, to);
                if (matched < 0 || matched == pos) break;
                var text = input.substring(pos, matched);
                var span = computeSpan(lineStarts, pos, matched);
                trivia.add(classify(span, text));
                pos = matched;
            }
            return List.copyOf(trivia);
        }

        private static CstNode rebuildRoot(String input, CstNode root, int[] lineStarts, int leadingScanFrom) {
            int rootStart = root.span().startOffset();
            int rootEnd = root.span().endOffset();
            int leadingTextLen = totalTriviaLength(root.leadingTrivia());
            // Generator semantics: span includes leading WS. The actual content
            // begins at (rootStart + leadingTextLen), and the leading WS lives
            // in [rootStart, rootStart + leadingTextLen).
            // Runtime semantics: span excludes leading WS. leadingTextLen is in
            // the gap [leadingScanFrom, rootStart). We distinguish by checking
            // whether scanning the pre-rootStart gap yields the leading.
            int leadingScanEnd;
            boolean wrapperSpanIncludesLeading = false;
            if (leadingTextLen > 0 && rootStart + leadingTextLen <= input.length()) {
                // Hypothesis: generator semantics   leading occupies [rootStart, rootStart + leadingTextLen).
                // Verify by re-scanning [rootStart, rootStart + leadingTextLen) and checking it consumes exactly that range.
                int probeEnd = rootStart + leadingTextLen;
                var probe = scanWhitespace(input, rootStart, probeEnd, lineStarts);
                if (totalTriviaLength(probe) == leadingTextLen) {
                    leadingScanEnd = probeEnd;
                    wrapperSpanIncludesLeading = true;
                } else {
                    leadingScanEnd = rootStart;
                }
            } else {
                leadingScanEnd = rootStart;
            }
            var leading = scanWhitespace(input, leadingScanFrom, leadingScanEnd, lineStarts);
            var trailingExternal = scanWhitespace(input, rootEnd, input.length(), lineStarts);
            return rebuildSelf(input, root, lineStarts, leading, trailingExternal, java.util.List.<Trivia>of(), wrapperSpanIncludesLeading);
        }

        private static int totalTriviaLength(List<Trivia> trivia) {
            int total = 0;
            for (var t : trivia) total += t.text().length();
            return total;
        }

        private static CstNode rebuildSelf(String input, CstNode node, int[] lineStarts,
                                           List<Trivia> leading, List<Trivia> extraTrailing,
                                           List<Trivia> drainExtra, boolean wrapperSpanIncludesLeading) {
            return switch (node) {
                case CstNode.NonTerminal nt -> rebuildNonTerminal(input, nt, lineStarts, leading, extraTrailing, drainExtra, wrapperSpanIncludesLeading);
                case CstNode.Terminal t -> rebuildTerminal(t, leading, extraTrailing, drainExtra);
                case CstNode.Token tk -> rebuildToken(tk, leading, extraTrailing, drainExtra);
            };
        }

        private static boolean canSkipLeafRebuild(List<Trivia> leading, List<Trivia> extraTrailing,
                                                  List<Trivia> drainExtra,
                                                  List<Trivia> existingLeading, List<Trivia> existingTrailing) {
            return leading.isEmpty() && extraTrailing.isEmpty() && drainExtra.isEmpty()
                   && existingLeading.isEmpty() && existingTrailing.isEmpty();
        }

        private static CstNode.Terminal rebuildTerminal(CstNode.Terminal t, List<Trivia> leading,
                                                        List<Trivia> extraTrailing, List<Trivia> drainExtra) {
            if (canSkipLeafRebuild(leading, extraTrailing, drainExtra, t.leadingTrivia(), t.trailingTrivia())) {
                return t;
            }
            return new CstNode.Terminal(t.id(), t.span(), t.rule(), t.text(), leading, combine(drainExtra, extraTrailing));
        }

        private static CstNode.Token rebuildToken(CstNode.Token tk, List<Trivia> leading,
                                                  List<Trivia> extraTrailing, List<Trivia> drainExtra) {
            if (canSkipLeafRebuild(leading, extraTrailing, drainExtra, tk.leadingTrivia(), tk.trailingTrivia())) {
                return tk;
            }
            return new CstNode.Token(tk.id(), tk.span(), tk.rule(), tk.text(), leading, combine(drainExtra, extraTrailing));
        }

        private static CstNode rebuildChild(String input, CstNode child, int[] lineStarts, int prevEnd,
                                            List<Trivia> drainExtra, boolean wrapperSpanIncludesLeading) {
            int childStart = child.span().startOffset();
            var leading = scanWhitespace(input, prevEnd, childStart, lineStarts);
            return switch (child) {
                case CstNode.NonTerminal nt -> rebuildNonTerminal(input, nt, lineStarts, leading, java.util.List.<Trivia>of(), drainExtra, wrapperSpanIncludesLeading);
                case CstNode.Terminal t -> rebuildTerminal(t, leading, java.util.List.<Trivia>of(), drainExtra);
                case CstNode.Token tk -> rebuildToken(tk, leading, java.util.List.<Trivia>of(), drainExtra);
            };
        }

        private static CstNode.NonTerminal rebuildNonTerminal(String input, CstNode.NonTerminal nt, int[] lineStarts,
                                                              List<Trivia> leading, List<Trivia> extraTrailing,
                                                              List<Trivia> drainExtra, boolean wrapperSpanIncludesLeading) {
            int spanStart = nt.span().startOffset();
            int spanEnd = nt.span().endOffset();
            // H2: span-semantics decided once at the root. When wrapper span
            // includes its own leading WS, advance cursor past leadingLen so the
            // first child's leading scan does not re-emit the same trivia. No
            // per-node probe scan.
            int cursor = spanStart;
            if (wrapperSpanIncludesLeading) {
                int leadingLen = totalTriviaLength(leading);
                if (leadingLen > 0 && spanStart + leadingLen <= input.length()) {
                    cursor = spanStart + leadingLen;
                }
            }
            var children = nt.children();
            int childCount = children.size();
            if (childCount == 0) {
                // No children: gap [cursor, spanEnd) is the wrapper's internal
                // trailing. Combine with caller-supplied drainExtra (no deeper
                // descendant to absorb it) and extraTrailing.
                var internalTrailing = scanWhitespace(input, cursor, spanEnd, lineStarts);
                // Cleanup D: skip allocation if rebuild would yield identical content.
                if (leading.isEmpty() && extraTrailing.isEmpty() && drainExtra.isEmpty()
                    && internalTrailing.isEmpty()
                    && nt.leadingTrivia().isEmpty() && nt.trailingTrivia().isEmpty()) {
                    return nt;
                }
                return new CstNode.NonTerminal(nt.id(), nt.span(), nt.rule(), children, leading,
                        combine(combine(drainExtra, internalTrailing), extraTrailing));
            }
            // H1: thread orphan trailing INTO the last child's rebuildChild as
            // drainExtra instead of rebuilding the spine afterwards. Mirrors
            // PegEngine.attachTrailingToTail (Bug C' compensation): the orphan
            // trivia ends up in the deepest-rightmost-leaf's trailing slot,
            // matching CstReconstruct.emit's last-child-only emission.
            int lastChildEnd = children.get(childCount - 1).span().endOffset();
            var internalTrailing = scanWhitespace(input, lastChildEnd, spanEnd, lineStarts);
            var lastChildDrain = combine(drainExtra, internalTrailing);
            // Cleanup D: defer ArrayList allocation until first child diverges; skip
            // wrapper-rebuild entirely when no incoming trivia and no internal change.
            boolean canSkip = leading.isEmpty() && extraTrailing.isEmpty() && drainExtra.isEmpty()
                              && internalTrailing.isEmpty()
                              && nt.leadingTrivia().isEmpty() && nt.trailingTrivia().isEmpty();
            ArrayList<CstNode> newChildren = null;
            for (int i = 0; i < childCount; i++) {
                var c = children.get(i);
                var drainForThis = (i == childCount - 1) ? lastChildDrain : java.util.List.<Trivia>of();
                var rebuilt = rebuildChild(input, c, lineStarts, cursor, drainForThis, wrapperSpanIncludesLeading);
                if (newChildren == null) {
                    if (rebuilt != c) {
                        newChildren = new ArrayList<CstNode>(childCount);
                        for (int j = 0; j < i; j++) newChildren.add(children.get(j));
                        newChildren.add(rebuilt);
                    }
                } else {
                    newChildren.add(rebuilt);
                }
                cursor = c.span().endOffset();
            }
            if (newChildren == null && canSkip) {
                return nt;
            }
            var finalChildren = newChildren == null ? children : List.copyOf(newChildren);
            return new CstNode.NonTerminal(nt.id(), nt.span(), nt.rule(), finalChildren, leading, extraTrailing);
        }

        private static List<Trivia> combine(List<Trivia> a, List<Trivia> b) {
            if (a.isEmpty()) return b;
            if (b.isEmpty()) return a;
            var combined = new ArrayList<Trivia>(a.size() + b.size());
            combined.addAll(a);
            combined.addAll(b);
            return List.copyOf(combined);
        }

        private static Trivia classify(SourceSpan span, String text) {
            if (text.startsWith("//")) {
                return new Trivia.LineComment(span, text);
            } else if (text.startsWith("/*")) {
                return new Trivia.BlockComment(span, text);
            } else {
                return new Trivia.Whitespace(span, text);
            }
        }

        private static boolean matchesPattern(char c, String pattern, boolean caseInsensitive) {
            char testChar = caseInsensitive ? Character.toLowerCase(c) : c;
            int i = 0;
            while (i < pattern.length()) {
                char start = pattern.charAt(i);
                if (start == '\\' && i + 1 < pattern.length()) {
                    char escaped = pattern.charAt(i + 1);
                    int consumed = 2;
                    char expected = switch (escaped) {
                        case 'n' -> '\n';
                        case 'r' -> '\r';
                        case 't' -> '\t';
                        case '\\' -> '\\';
                        case ']' -> ']';
                        case '-' -> '-';
                        case 'x' -> {
                            if (i + 4 <= pattern.length()) {
                                try {
                                    var hex = pattern.substring(i + 2, i + 4);
                                    consumed = 4;
                                    yield (char) Integer.parseInt(hex, 16);
                                } catch (NumberFormatException e) { yield 'x'; }
                            }
                            yield 'x';
                        }
                        case 'u' -> {
                            if (i + 6 <= pattern.length()) {
                                try {
                                    var hex = pattern.substring(i + 2, i + 6);
                                    consumed = 6;
                                    yield (char) Integer.parseInt(hex, 16);
                                } catch (NumberFormatException e) { yield 'u'; }
                            }
                            yield 'u';
                        }
                        default -> escaped;
                    };
                    if (caseInsensitive) expected = Character.toLowerCase(expected);
                    if (testChar == expected) return true;
                    i += consumed;
                    continue;
                }
                if (i + 2 < pattern.length() && pattern.charAt(i + 1) == '-') {
                    char end = pattern.charAt(i + 2);
                    if (caseInsensitive) {
                        start = Character.toLowerCase(start);
                        end = Character.toLowerCase(end);
                    }
                    if (testChar >= start && testChar <= end) return true;
                    i += 3;
                } else {
                    if (caseInsensitive) start = Character.toLowerCase(start);
                    if (testChar == start) return true;
                    i++;
                }
            }
            return false;
        }

        private static SourceSpan computeSpan(int[] lineStarts, int from, int to) {
            int[] startLc = lineColAt(lineStarts, from);
            int[] endLc = lineColAt(lineStarts, to);
            return new SourceSpan(startLc[0], startLc[1], from, endLc[0], endLc[1], to);
        }

        private static int matchWsInner(String input, int pos, int limit) {
            return matchWs_0(input, pos, limit);
        }

        private static int matchWs_0(String input, int pos, int limit) {
            {
                int r = matchWs_1(input, pos, limit);
                if (r >= 0) return r;
            }
            {
                int r = matchWs_2(input, pos, limit);
                if (r >= 0) return r;
            }
            {
                int r = matchWs_3(input, pos, limit);
                if (r >= 0) return r;
            }
            return -1;
        }

        private static int matchWs_1(String input, int pos, int limit) {
            if (pos >= limit) return -1;
            char c = input.charAt(pos);
            boolean inClass = matchesPattern(c, " \\t\\r\\n", false);
            boolean ok = inClass;
            return ok ? pos + 1 : -1;
        }

        private static int matchWs_2(String input, int pos, int limit) {
            int cursor = pos;
            cursor = matchWs_4(input, cursor, limit);
            if (cursor < 0) return -1;
            cursor = matchWs_5(input, cursor, limit);
            if (cursor < 0) return -1;
            return cursor;
        }

        private static int matchWs_3(String input, int pos, int limit) {
            int cursor = pos;
            cursor = matchWs_6(input, cursor, limit);
            if (cursor < 0) return -1;
            cursor = matchWs_7(input, cursor, limit);
            if (cursor < 0) return -1;
            cursor = matchWs_8(input, cursor, limit);
            if (cursor < 0) return -1;
            return cursor;
        }

        private static int matchWs_4(String input, int pos, int limit) {
            String text = "//";
            int len = text.length();
            if (pos + len > limit) return -1;
            for (int i = 0; i < len; i++) {
                if (input.charAt(pos + i) != text.charAt(i)) return -1;
            }
            return pos + len;
        }

        private static int matchWs_5(String input, int pos, int limit) {
            int cursor = pos;
            while (true) {
                int next = matchWs_9(input, cursor, limit);
                if (next < 0 || next == cursor) break;
                cursor = next;
            }
            return cursor;
        }

        private static int matchWs_6(String input, int pos, int limit) {
            String text = "/*";
            int len = text.length();
            if (pos + len > limit) return -1;
            for (int i = 0; i < len; i++) {
                if (input.charAt(pos + i) != text.charAt(i)) return -1;
            }
            return pos + len;
        }

        private static int matchWs_7(String input, int pos, int limit) {
            int cursor = pos;
            while (true) {
                int next = matchWs_10(input, cursor, limit);
                if (next < 0 || next == cursor) break;
                cursor = next;
            }
            return cursor;
        }

        private static int matchWs_8(String input, int pos, int limit) {
            String text = "*/";
            int len = text.length();
            if (pos + len > limit) return -1;
            for (int i = 0; i < len; i++) {
                if (input.charAt(pos + i) != text.charAt(i)) return -1;
            }
            return pos + len;
        }

        private static int matchWs_9(String input, int pos, int limit) {
            if (pos >= limit) return -1;
            char c = input.charAt(pos);
            boolean inClass = matchesPattern(c, "\\n", false);
            boolean ok = !inClass;
            return ok ? pos + 1 : -1;
        }

        private static int matchWs_10(String input, int pos, int limit) {
            int cursor = pos;
            cursor = matchWs_11(input, cursor, limit);
            if (cursor < 0) return -1;
            cursor = matchWs_12(input, cursor, limit);
            if (cursor < 0) return -1;
            return cursor;
        }

        private static int matchWs_11(String input, int pos, int limit) {
            return matchWs_13(input, pos, limit) < 0 ? pos : -1;
        }

        private static int matchWs_12(String input, int pos, int limit) {
            return pos < limit ? pos + 1 : -1;
        }

        private static int matchWs_13(String input, int pos, int limit) {
            String text = "*/";
            int len = text.length();
            if (pos + len > limit) return -1;
            for (int i = 0; i < len; i++) {
                if (input.charAt(pos + i) != text.charAt(i)) return -1;
            }
            return pos + len;
        }

    }

}
