--- 
name: OCaml
fileTypes: 
- ml
- mli
scopeName: source.ocaml
repository: 
  moduleref: 
    patterns: 
    - name: meta.module-reference.ocaml
      beginCaptures: 
        "1": 
          name: support.other.module.ocaml
        "2": 
          name: punctuation.separator.module-reference.ocaml
      match: \b([A-Z][a-zA-Z0-9'_]*)(\.)
  variables: 
    patterns: 
    - name: variable.parameter.unit.ocaml
      match: \(\)
    - include: "#constants"
    - include: "#moduleref"
    - name: variable.parameter.labeled.ocaml
      begin: (~)([a-z][a-zA-Z0-9'_]*)(\s*:\s*)?
      beginCaptures: 
        "1": 
          name: punctuation.definition.labeled-parameter.ocaml
        "2": 
          name: entity.name.tag.label.ocaml
        "3": 
          name: punctuation.separator.label.ocaml
      end: \s
      patterns: 
      - include: "#variables"
    - name: variable.parameter.optional.ocaml
      captures: 
        "1": 
          name: punctuation.definition.optional-parameter.ocaml
        "2": 
          name: entity.name.tag.label.optional.ocaml
      match: (\?)([a-z][a-zA-Z0-9_]*)
    - name: variable.parameter.optional.ocaml
      endCaptures: 
        "1": 
          name: punctuation.definition.optional-parameter.ocaml
      begin: (\?)(\()([a-z_][a-zA-Z0-9'_]*)\s*(=)
      beginCaptures: 
        "1": 
          name: punctuation.definition.optional-parameter.ocaml
        "2": 
          name: punctuation.definition.optional-parameter.ocaml
        "3": 
          name: entity.name.tag.label.optional.ocaml
        "4": 
          name: punctuation.separator.optional-parameter-assignment.ocaml
      end: (\))
      patterns: 
      - include: $self
    - name: meta.parameter.type-constrained.ocaml
      endCaptures: 
        "1": 
          name: punctuation.section.type-constraint.ocaml
      begin: (\()(?=(~[a-z][a-zA-Z0-9_]*:|("(\\"|[^"])*")|[^\(\)~"])+(?<!:)(:>|:(?![:=])))
      beginCaptures: 
        "1": 
          name: punctuation.section.type-constraint.ocaml
      end: (\))
      patterns: 
      - name: storage.type.ocaml
        begin: (?<!:)(:>|:(?![:=]))
        beginCaptures: 
          "1": 
            name: punctuation.separator.type-constraint.ocaml
        end: (?=\))
        patterns: 
        - name: meta.paren.group
          begin: \(
          end: \)
      - include: "#variables"
    - include: "#comments"
    - name: meta.paren-group.ocaml
      begin: \(
      end: \)
      patterns: 
      - include: "#variables"
    - name: variable.parameter.tuple.ocaml
      endCaptures: 
        "1": 
          name: punctuation.definition.tuple.ocaml
      begin: (\()
      beginCaptures: 
        "1": 
          name: punctuation.definition.tuple.ocaml
      end: (\))
      patterns: 
      - include: "#matchpatterns"
      - include: "#variables"
      - name: punctuation.separator.tuple.ocaml
        match: ","
    - name: variable.parameter.record.ocaml
      endCaptures: 
        "1": 
          name: punctuation.definition.record.ocaml
      begin: (\{)
      beginCaptures: 
        "1": 
          name: punctuation.definition.record.ocaml
      end: (\})
      patterns: 
      - include: "#moduleref"
      - name: meta.recordfield.match.ocaml
        endCaptures: 
          "1": 
            name: punctuation.separator.record.ocaml
        begin: \b([a-z][a-zA-Z0-9'_]*)\s*(=)
        beginCaptures: 
          "1": 
            name: entity.name.tag.record.ocaml
          "2": 
            name: punctuation.separator.record.field-assignment.ocaml
        end: (;)|(?=\})
        patterns: 
        - include: "#matchpatterns"
    - include: "#storagetypes"
    - name: variable.parameter.ocaml
      match: \b[a-z_][a-zA-Z0-9'_]*
  typedefs: 
    patterns: 
    - name: punctuation.separator.variant-definition.ocaml
      match: \|
    - include: "#comments"
    - name: meta.paren-group.ocaml
      begin: \(
      end: \)
      patterns: 
      - include: "#typedefs"
    - name: keyword.other.ocaml
      match: \bof\b
    - include: "#storagetypes"
    - name: storage.type.ocaml
      match: (?<=\s|\()['a-z_][a-zA-Z0-9_]*\b
    - name: meta.module.type.ocaml
      captures: 
        "1": 
          name: support.other.module.ocaml
        "2": 
          name: storage.type.module.ocaml
      match: \b((?:[A-Z][a-zA-Z0-9'_]*)(?:\.[A-Z][a-zA-Z0-9'_]+)*)(\.[a-zA-Z0-9'_]+)
    - name: meta.polymorphic-variant.definition.ocaml
      endCaptures: 
        "1": 
          name: punctuation.definition.polymorphic-variant.ocaml
      begin: (\[(>|<)?)
      beginCaptures: 
        "1": 
          name: punctuation.definition.polymorphic-variant.ocaml
      end: (\])
      patterns: 
      - include: "#typedefs"
    - include: $self
    - name: punctuation.separator.algebraic-type.ocaml
      match: \|
  storagetypes: 
    patterns: 
    - name: storage.type.ocaml
      match: \b(int|char|float|string|list|array|bool|unit|exn|option|int32|int64|nativeint|format4|lazy_t)\b
    - name: storage.type.variant.polymorphic.ocaml
      match: "#[a-z_][a-zA-Z0-9_]*"
  module-signature: 
    patterns: 
    - name: meta.module.signature.val.ocaml
      begin: (val)\s+([a-z_][a-zA-Z0-9_']*)\s*(:)
      beginCaptures: 
        "1": 
          name: keyword.other.ocaml
        "2": 
          name: entity.name.type.value-signature.ocaml
        "3": 
          name: punctuation.separator.type-constraint.ocaml
      end: (?=\b(type|val|external|class|module|end)\b)|^\s*$
      patterns: 
      - name: variable.parameter.optional.ocaml
        captures: 
          "1": 
            name: punctuation.definition.optional-parameter.ocaml
          "2": 
            name: entity.name.tag.label.optional.ocaml
          "3": 
            name: punctuation.separator.optional-parameter.ocaml
        match: (\?)([a-z][a-zA-Z0-9_]*)\s*(:)
      - name: variable.parameter.labeled.ocaml
        begin: (~)([a-z][a-zA-Z0-9'_]*)\s*(:)\s*
        beginCaptures: 
          "1": 
            name: punctuation.definition.labeled-parameter.ocaml
          "2": 
            name: entity.name.tag.label.ocaml
          "3": 
            name: punctuation.separator.label.ocaml
        end: \s
        patterns: 
        - include: "#variables"
      - include: "#typedefs"
    - name: meta.module.signature.external.ocaml
      begin: (external)\s+([a-z_][a-zA-Z0-9_']*)\s*(:)
      beginCaptures: 
        "1": 
          name: keyword.other.ocaml
        "2": 
          name: entity.name.type.external-signature.ocaml
        "3": 
          name: punctuation.separator.type-constraint.ocaml
      end: (?=\b(type|val|external|class|module|end)\b)|^\s*$
      patterns: 
      - name: variable.parameter.optional.ocaml
        captures: 
          "1": 
            name: punctuation.definition.optional-parameter.ocaml
          "2": 
            name: entity.name.tag.label.optional.ocaml
          "3": 
            name: punctuation.separator.optional-parameter.ocaml
        match: (\?)([a-z][a-zA-Z0-9_]*)\s*(:)
      - name: variable.parameter.labeled.ocaml
        begin: (~)([a-z][a-zA-Z0-9'_]*)\s*(:)\s*
        beginCaptures: 
          "1": 
            name: punctuation.definition.labeled-parameter.ocaml
          "2": 
            name: entity.name.tag.label.ocaml
          "3": 
            name: punctuation.separator.label.ocaml
        end: \s
        patterns: 
        - include: "#variables"
      - include: "#strings"
      - include: "#typedefs"
  matchpatterns: 
    patterns: 
    - name: constant.language.universal-match.ocaml
      match: \b_\b
    - name: punctuation.separator.match-pattern.ocaml
      match: \|(?=\s*\S)
    - name: meta.match-option.ocaml
      endCaptures: 
        "1": 
          name: punctuation.definition.match-option.ocaml
      begin: (\()(?=(?!=.*?->).*?\|)
      beginCaptures: 
        "1": 
          name: punctuation.definition.match-option.ocaml
      end: (\))
      patterns: 
      - name: punctuation.separator.match-option.ocaml
        match: \|
      - include: "#matchpatterns"
    - include: "#moduleref"
    - include: "#constants"
    - include: "#variables"
    - include: $self
  comments: 
    patterns: 
    - name: comment.block.ocaml
      captures: 
        "1": 
          name: comment.block.empty.ocaml
      match: \(\*\*?(\*)\)
    - name: comment.block.ocaml
      begin: \(\*
      end: \*\)
      patterns: 
      - include: "#comments"
    - name: comment.block.ocamlyacc
      begin: /\*
      end: \*/
      patterns: 
      - include: "#comments"
    - name: comment.block.string.quoted.double.ocaml
      begin: (?=[^\\])(")
      end: "\""
      patterns: 
      - name: comment.block.string.constant.character.escape.ocaml
        match: \\(x[a-fA-F0-9][a-fA-F0-9]|[0-2]\d\d|[bnrt'"\\])
  lists: 
    patterns: 
    - name: meta.list.ocaml
      endCaptures: 
        "1": 
          name: punctuation.definition.list.end.ocaml
      begin: (\[)(?!\||<|>)
      beginCaptures: 
        "1": 
          name: punctuation.definition.list.begin.ocaml
      end: (?<!\||>)(])
      patterns: 
      - include: "#lists"
      - include: $self
  strings: 
    patterns: 
    - name: string.quoted.double.ocaml
      endCaptures: 
        "1": 
          name: punctuation.definition.string.end.ocaml
      begin: (?=[^\\])(")
      beginCaptures: 
        "1": 
          name: punctuation.definition.string.begin.ocaml
      end: (")
      patterns: 
      - name: punctuation.separator.string.ignore-eol.ocaml
        match: \\$[ \t]*
      - name: constant.character.string.escape.ocaml
        match: \\(x[a-fA-F0-9][a-fA-F0-9]|[0-2]\d\d|[bnrt'"\\])
      - name: constant.character.regexp.escape.ocaml
        match: \\[\|\(\)1-9$^.*+?\[\]]
      - name: invalid.illegal.character.string.escape
        match: \\(?!(x[a-fA-F0-9][a-fA-F0-9]|[0-2]\d\d|[bnrt'"\\]|[\|\(\)1-9$^.*+?\[\]]|$[ \t]*))(?:.)
  constants: 
    patterns: 
    - name: constant.language.pseudo-variable.ocaml
      captures: 
        "1": 
          name: meta.empty-typing-pair.ocaml
        "2": 
          name: meta.empty-typing-pair.parens.ocaml
        "3": 
          name: meta.empty-typing-pair.ocaml
      match: (?:\[\s*(\])|\((\))|\(\s*(\)))
    - name: constant.language.boolean.ocaml
      match: \b(true|false)\b
    - name: constant.numeric.floating-point.ocaml
      match: \b-?[0-9][0-9_]*((\.([0-9][0-9_]*([eE][+-]??[0-9][0-9_]*)?)?)|([eE][+-]??[0-9][0-9_]*))
    - name: constant.numeric.integer.nativeint.ocaml
      match: \b(-?((0(x|X)[0-9a-fA-F][0-9a-fA-F_]*)|(0(o|O)[0-7][0-7_]*)|(0(b|B)[01][01_]*)|([0-9][0-9_]*)))n
    - name: constant.numeric.integer.int64.ocaml
      match: \b(-?((0(x|X)[0-9a-fA-F][0-9a-fA-F_]*)|(0(o|O)[0-7][0-7_]*)|(0(b|B)[01][01_]*)|([0-9][0-9_]*)))L
    - name: constant.numeric.integer.int32.ocaml
      match: \b(-?((0(x|X)[0-9a-fA-F][0-9a-fA-F_]*)|(0(o|O)[0-7][0-7_]*)|(0(b|B)[01][01_]*)|([0-9][0-9_]*)))l
    - name: constant.numeric.integer.ocaml
      match: \b(-?((0(x|X)[0-9a-fA-F][0-9a-fA-F_]*)|(0(o|O)[0-7][0-7_]*)|(0(b|B)[01][01_]*)|([0-9][0-9_]*)))
    - name: constant.character.ocaml
      match: "'(.|\\\\(x[a-fA-F0-9][a-fA-F0-9]|[0-2]\\d\\d|[bnrt'\"\\\\]))'"
  arrays: 
    patterns: 
    - name: meta.array.ocaml
      endCaptures: 
        "1": 
          name: punctuation.definition.array.end.ocaml
      begin: (\[\|)
      beginCaptures: 
        "1": 
          name: punctuation.definition.array.begin.ocaml
      end: (\|])
      patterns: 
      - include: "#arrays"
      - include: $self
uuid: F816FA69-6EE8-11D9-BF2D-000D93589AF6
foldingStartMarker: (\b(module|class|)\s.*?=\s*$|\bbegin|sig|struct|(object(\s*\(_?[a-z]+\))?)\s*$|\bwhile\s.*?\bdo\s*$|^let(?:\s+rec)?\s+[a-z_][a-zA-Z0-9_]*\s+(?!=)\S)
patterns: 
- name: meta.module.binding
  captures: 
    "1": 
      name: keyword.other.module-binding.ocaml
    "2": 
      name: keyword.other.module-definition.ocaml
    "3": 
      name: support.other.module.ocaml
    "4": 
      name: punctuation.separator.module-binding.ocmal
  match: \b(let)\s+(module)\s+([A-Z][a-zA-Z0-9'_]*)\s*(=)
- name: meta.function.ocaml
  endCaptures: 
    "1": 
      name: punctuation.separator.function.type-constraint.ocaml
    "2": 
      name: storage.type.ocaml
    "3": 
      name: keyword.operator.ocaml
    "4": 
      name: keyword.operator.ocaml
  begin: \b(let|and)\s+(?!\(\*)((rec\s+)([a-z_][a-zA-Z0-9_']*)\b|([a-z_][a-zA-Z0-9_']*|\([^)]+\))(?=\s)((?=\s*=\s*(?=fun(?:ction)\b))|(?!\s*=)))
  beginCaptures: 
    "1": 
      name: keyword.other.function-definition.ocaml
    "3": 
      name: keyword.other.funtion-definition.ocaml
    "4": 
      name: entity.name.function.ocaml
    "5": 
      name: entity.name.function.ocaml
  end: (?:(:)\s*([^=]+))?(?:(=)|(=)\s*(?=fun(?:ction)\b))
  patterns: 
  - include: "#variables"
- name: meta.function.anonymous.ocaml
  endCaptures: 
    "1": 
      name: punctuation.definition.function.anonymous.ocaml
  begin: (\()(?=fun\s)
  beginCaptures: 
    "1": 
      name: punctuation.definition.function.anonymous.ocaml
  end: (\))
  patterns: 
  - name: meta.function.anonymous.definition.ocaml
    endCaptures: 
      "1": 
        name: punctuation.separator.function-definition.ocaml
    begin: (?<=\()(fun)\s
    beginCaptures: 
      "1": 
        name: keyword.other.function-definition.ocaml
    end: (->)
    patterns: 
    - include: "#variables"
  - include: $self
- name: meta.type-definition-group.ocaml
  begin: ^\s*(?=type\s)
  end: \b(?=let|end)|^\s*$
  patterns: 
  - name: meta.type-definition.ocaml
    begin: \b(type|and)\s+([^=]*)(=)?
    beginCaptures: 
      "1": 
        name: keyword.other.type-definition.ocaml
      "2": 
        name: storage.type.user-defined.ocaml
      "3": 
        name: punctuation.separator.type-definition.ocaml
    end: (?=\b(type|and|let|end)\b)|(?=^\s*$)
    patterns: 
    - include: "#typedefs"
- name: meta.pattern-match.ocaml
  endCaptures: 
    "1": 
      name: punctuation.separator.match-definition.ocaml
    "2": 
      name: keyword.control.match-condition.ocaml
  begin: \b(with|function)(?=(\s*$|.*->))\b|((?<!\|)(\|)(?!\|)(?=.*->))
  beginCaptures: 
    "1": 
      name: keyword.control.match-definition.ocaml
    "2": 
      name: keyword.other.function-definition.ocaml
    "3": 
      name: keyword.control.match-definition.ocaml
  end: (?:(->)|\b(when)\b|\s(?=\|))
  patterns: 
  - include: "#matchpatterns"
- name: meta.class.type-definition.ocaml
  captures: 
    "1": 
      name: keyword.other.class-type-definition.ocaml
    "2": 
      name: entity.name.type.class-type.ocaml
    "4": 
      name: storage.type.user-defined.ocaml
  match: ^[ \t]*(class\s+type\s+)((\[\s*('[A-Za-z][a-zA-Z0-9_']*(?:\s*,\s*'[A-Za-z][a-zA-Z0-9_']*)*)\s*\]\s+)?[a-z_][a-zA-Z0-9'_]*)
- name: meta.class.ocaml
  endCaptures: 
    "1": 
      name: keyword.operator.ocaml
  begin: ^[ \t]*(class)(?:\s+(?!(?:virtual)\s+))((\[\s*('[A-Za-z][a-zA-Z0-9_']*(?:\s*,\s*'[A-Za-z][a-zA-Z0-9_']*)*)\s*\]\s+)?[a-z_][a-zA-Z0-9'_]*)
  beginCaptures: 
    "1": 
      name: keyword.other.class-definition.ocaml
    "2": 
      name: entity.name.type.class.ocaml
    "4": 
      name: storage.type.user-defined.ocaml
  end: (=)
  patterns: 
  - include: "#variables"
- name: meta.class.virtual.ocaml
  endCaptures: 
    "1": 
      name: keyword.operator.ocaml
  begin: ^[ \t]*(class\s+virtual\s+)((\[\s*('[A-Za-z][a-zA-Z0-9_']*(?:\s*,\s*'[A-Za-z][a-zA-Z0-9_']*)*)\s*\]\s+)?[a-z_][a-zA-Z0-9'_]*)
  beginCaptures: 
    "1": 
      name: keyword.other.class-definition.ocaml
    "2": 
      name: entity.name.type.class.ocaml
    "4": 
      name: storage.type.user-defined.ocaml
  end: (=)
  patterns: 
  - include: "#variables"
- name: meta.class.virtual.type-definition.ocaml
  captures: 
    "1": 
      name: keyword.other.class-type-definition.ocaml
    "2": 
      name: entity.name.type.class-type.ocaml
    "4": 
      name: storage.type.user-defined.ocaml
  match: ^[ \t]*(class\s+type\s+virtual)((\[\s*('[A-Za-z][a-zA-Z0-9_']*(?:\s*,\s*'[A-Za-z][a-zA-Z0-9_']*)*)\s*\]\s+)?[a-z_][a-zA-Z0-9'_]*)
- name: meta.record.ocaml
  endCaptures: 
    "1": 
      name: punctuation.definition.record.ocaml
  begin: (\{)
  beginCaptures: 
    "1": 
      name: punctuation.definition.record.ocaml
  end: (\})
  patterns: 
  - name: keyword.other.language.ocaml
    match: \bwith\b
  - name: meta.record.definition.ocaml
    endCaptures: 
      "1": 
        name: keyword.operator.ocaml
    begin: (\bmutable\s+)?\b([a-z_][a-zA-Z0-9_']*)\s*(:)
    beginCaptures: 
      "1": 
        name: keyword.other.storage.modifier.ocaml
      "2": 
        name: source.ocaml
      "3": 
        name: punctuation.definition.record.ocaml
    end: (;|(?=}))
    patterns: 
    - include: "#typedefs"
  - include: $self
- name: meta.object.ocaml
  endCaptures: 
    "1": 
      name: keyword.control.object.ocaml
    "2": 
      name: punctuation.terminator.expression.ocaml
  begin: \b(object)\s*(?:(\()(_?[a-z]+)(\)))?\s*$
  beginCaptures: 
    "1": 
      name: keyword.other.object-definition.ocaml
    "2": 
      name: punctuation.definition.self-binding.ocaml
    "3": 
      name: entity.name.type.self-binding.ocaml
    "4": 
      name: punctuation.definition.self-binding.ocaml
  end: \b(end)\b
  patterns: 
  - name: meta.method.ocaml
    endCaptures: 
      "1": 
        name: keyword.operator.ocaml
    begin: \b(method)\s+(virtual\s+)?(private\s+)?([a-z_][a-zA-Z0-9'_]*)
    beginCaptures: 
      "1": 
        name: keyword.other.method-definition.ocaml
      "2": 
        name: keyword.other.method-definition.ocaml
      "3": 
        name: keyword.other.method-restriction.ocaml
      "4": 
        name: entity.name.function.method.ocaml
    end: (=|:)
    patterns: 
    - include: "#variables"
  - name: meta.object.type-constraint.ocaml
    endCaptures: 
      "1": 
        name: storage.type.polymorphic-variant.ocaml
      "2": 
        name: storage.type.ocaml
      "3": 
        name: storage.type.user-defined.ocaml
    begin: (constraint)\s+([a-z_'][a-zA-Z0-9'_]*)\s+(=)
    beginCaptures: 
      "1": 
        name: keyword.other.language.ocaml
      "2": 
        name: storage.type.user-defined.ocaml
      "3": 
        name: keyword.operator.ocaml
    end: (#[a-z_][a-zA-Z0-9'_]*)|(int|char|float|string|list|array|bool|unit|exn|option|int32|int64|nativeint|format4|lazy_t)|([a-z_][a-zA-Z0-9'_]*)\s*$
  - include: $self
- name: meta.method-call.ocaml
  captures: 
    "1": 
      name: punctuation.separator.method-call.ocaml
  match: (?<=\w|\)|')(#)[a-z_][a-zA-Z0-9'_]*
- name: meta.module.ocaml
  captures: 
    "1": 
      name: keyword.other.module-definition.ocaml
    "2": 
      name: entity.name.type.module.ocaml
    "3": 
      name: punctuation.separator.module-definition.ocaml
    "4": 
      name: entity.name.type.module-type.ocaml
  match: ^[ \t]*(module)\s+([A-Z_][a-zA-Z0-9'_]*)(?:\s*(:)\s*([A-Z][a-zA-Z0-9'_]*)?)?
- name: meta.module.type.ocaml
  captures: 
    "1": 
      name: keyword.other.module-type-definition.ocaml
    "2": 
      name: entity.name.type.module-type.ocaml
  match: ^[ \t]*(module\s+type\s+)([A-Z][a-zA-Z0-9'_]*)
- name: meta.module.signature.ocaml
  endCaptures: 
    "1": 
      name: keyword.other.module.signature.ocaml
    "2": 
      name: punctuation.terminator.expression.ocaml
    "3": 
      name: keyword.operator.ocaml
  begin: \b(sig)\b
  beginCaptures: 
    "1": 
      name: keyword.other.module.signature.ocaml
  end: \b(end)\b
  patterns: 
  - include: "#module-signature"
  - include: $self
- name: meta.module.structure.ocaml
  endCaptures: 
    "1": 
      name: keyword.other.module.structure.ocaml
  begin: \b(struct)\b
  beginCaptures: 
    "1": 
      name: keyword.other.module.structure.ocaml
  end: \b(end)\b
  patterns: 
  - include: $self
- include: "#moduleref"
- name: meta.module.open.ocaml
  begin: \b(open)\s+([A-Z][a-zA-Z0-9'_]*)(?=(\.[A-Z][a-zA-Z0-9_]*)*)
  beginCaptures: 
    "1": 
      name: keyword.other.ocaml
    "2": 
      name: support.other.module.ocaml
  end: (\s|$)
  patterns: 
  - name: support.other.module.ocaml
    captures: 
      "1": 
        name: punctuation.separator.module-reference.ocaml
    match: (\.)([A-Z][a-zA-Z0-9'_]*)
- name: meta.exception.ocaml
  captures: 
    "1": 
      name: keyword.other.ocaml
    "2": 
      name: entity.name.type.exception.ocaml
  match: \b(exception)\s+([A-Z][a-zA-Z0-9'_]*)\b
- name: source.camlp4.embedded.ocaml
  endCaptures: 
    "1": 
      name: punctuation.definition.camlp4-stream.ocaml
  begin: (?=(\[<)(?![^\[]+?[^>]]))
  end: (>])
  patterns: 
  - include: source.camlp4.ocaml
- include: "#strings"
- include: "#constants"
- include: "#comments"
- include: "#lists"
- include: "#arrays"
- name: meta.type-constraint.ocaml
  endCaptures: 
    "1": 
      name: punctuation.separator.type-constraint.ocaml
    "2": 
      name: storage.type.ocaml
    "3": 
      name: punctuation.section.type-constraint.ocaml
  begin: (\()(?=(~[a-z][a-zA-Z0-9_]*:|("(\\"|[^"])*")|[^\(\)~"])+(?<!:)(:>|:(?![:=])))
  beginCaptures: 
    "1": 
      name: punctuation.section.type-constraint.ocaml
  end: (?<!:)(:>|:(?![:=]))(.*?)(\))
  patterns: 
  - include: $self
- name: keyword.other.directive.ocaml
  match: ^[ \t]*#[a-zA-Z]+
- name: keyword.other.directive.line-number.ocaml
  match: ^[ \t]*#[0-9]*
- include: "#storagetypes"
- name: keyword.other.storage.modifier.ocaml
  match: \b(mutable|ref)\b
- name: entity.name.type.variant.polymorphic.ocaml
  match: "`[A-Za-z][a-zA-Z0-9'_]*\\b"
- name: entity.name.type.variant.ocaml
  match: \b[A-Z][a-zA-Z0-9'_]*\b
- name: keyword.operator.symbol.ocaml
  match: "!=|:=|>|<"
- name: keyword.operator.infix.floating-point.ocaml
  match: "[*+/-]\\."
- name: keyword.operator.prefix.floating-point.ocaml
  match: ~-\.
- name: punctuation.definition.list.constructor.ocaml
  match: "::"
- name: punctuation.terminator.expression.ocaml
  match: ;;
- name: punctuation.separator.ocaml
  match: ;
- name: punctuation.separator.function-return.ocaml
  match: ->
- name: keyword.operator.infix.ocaml
  match: "[=<>@^&+\\-*/$%|][|!$%&*+./:<=>?@^~-]*"
- name: keyword.operator.prefix.ocaml
  match: \bnot\b|!|[!\?~][!$%&*+./:<=>?@^~-]+
- name: entity.name.tag.label.ocaml
  captures: 
    "1": 
      name: punctuation.separator.argument-label.ocaml
  match: ~[a-z][a-z0-9'_]*(:)?
- name: meta.begin-end-group.ocaml
  endCaptures: 
    "1": 
      name: keyword.control.begin-end.ocaml
  begin: \b(begin)\b
  beginCaptures: 
    "1": 
      name: keyword.control.begin-end.ocaml
  end: \b(end)\b
  patterns: 
  - include: $self
- name: meta.for-loop.ocaml
  endCaptures: 
    "1": 
      name: keyword.control.for-loop.ocaml
  begin: \b(for)\b
  beginCaptures: 
    "1": 
      name: keyword.control.for-loop.ocaml
  end: \b(done)\b
  patterns: 
  - name: keyword.control.loop.ocaml
    match: \bdo\b
  - include: $self
- name: meta.while-loop.ocaml
  endCaptures: 
    "1": 
      name: keyword.control.while-loop.ocaml
  begin: \b(while)\b
  beginCaptures: 
    "1": 
      name: keyword.control.while-loop.ocaml
  end: \b(done)\b
  patterns: 
  - name: keyword.control.loop.ocaml
    match: \bdo\b
  - include: $self
- name: meta.paren-group.ocaml
  begin: \(
  end: \)
  patterns: 
  - include: $self
- name: keyword.operator.ocaml
  match: \b(and|land|lor|lsl|lsr|lxor|mod|or)\b
- name: keyword.control.ocaml
  match: \b(downto|if|else|match|then|to|when|with|try)\b
- name: keyword.other.ocaml
  match: \b(as|assert|class|constraint|exception|functor|in|include|inherit|initializer|lazy|let|mod|module|mutable|new|object|open|private|rec|sig|struct|type|val|virtual)\b
- include: "#module-signature"
- name: invalid.illegal.unrecognized-character.ocaml
  match: "(\xE2\x80\x99|\xE2\x80\x98|\xE2\x80\x9C|\xE2\x80\x9D)"
foldingStopMarker: (\bend(\s+in)?[ \t]*(;{1,2}|=)?|\bdone;?|^\s*;;|^\s*in)[ \t]*$
keyEquivalent: ^~O
