Ast:
    | {
        type: Empty | Desc | Flag;
    }
    | {
        param: Ast.Name;
        type: Name;
    }
    | {
        param: Ast.Value;
        type: Value;
    }
    | {
        param: Ast.Choice;
        type: Choice;
    }
    | {
        param: Ast.Group;
        type: Group;
    }
    | {
        param: Ast.Option;
        type: OptionalIf;
    }
    | {
        param: Ast.BinaryOperands;
        type:
            | AND
            | OR
            | XOR
            | EQ
            | NE
            | LT
            | GT
            | LTE
            | GTE;
    }
    | {
        param: Ast.UnaryOperand;
        type: NOT;
    }