{
  "displayName": "OCaml",
  "fileTypes": [
    ".ml",
    ".mli"
  ],
  "name": "ocaml",
  "patterns": [
    {
      "include": "#comment"
    },
    {
      "include": "#pragma"
    },
    {
      "include": "#decl"
    }
  ],
  "repository": {
    "attribute": {
      "begin": "(\\[)\\s*((?<![-!#-\\&*+./:<-@^|~])@{1,3}(?![-!#-\\&*+./:<-@^|~]))",
      "beginCaptures": {
        "1": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
        },
        "2": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      },
      "end": "]",
      "endCaptures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
        }
      },
      "patterns": [
        {
          "include": "#attributePayload"
        }
      ]
    },
    "attributeIdentifier": {
      "captures": {
        "1": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
        },
        "2": {
          "name": "punctuation.definition.tag"
        }
      },
      "match": "((?<![-!#-\\&*+./:<-@^|~])%(?![-!#-\\&*+./:<-@^|~]))((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)"
    },
    "attributePayload": {
      "patterns": [
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)%)(?![-!#-\\&*+./:<-@^|~])",
          "end": "((?<![-!#-\\&*+./:<-@^|~])[:?](?![-!#-\\&*+./:<-@^|~]))|(?<=\\s)|(?=])",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "include": "#pathModuleExtended"
            },
            {
              "include": "#pathRecord"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(?=])",
          "patterns": [
            {
              "include": "#signature"
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)\\?)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(?=])",
          "patterns": [
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)\\?)(?![-!#-\\&*+./:<-@^|~])",
              "end": "(?=])|\\bwhen\\b",
              "endCaptures": {
                "1": {
                }
              },
              "patterns": [
                {
                  "include": "#pattern"
                }
              ]
            },
            {
              "begin": "(?<=(?:\\P{word}|^)when)(?!\\p{word})",
              "end": "(?=])",
              "patterns": [
                {
                  "include": "#term"
                }
              ]
            }
          ]
        },
        {
          "include": "#term"
        }
      ]
    },
    "bindClassTerm": {
      "patterns": [
        {
          "begin": "(?<=(?:\\P{word}|^)(?:and|class|type))(?!\\p{word})",
          "end": "(?<![-!#-\\&*+./:<-@^|~])(:)|(=)(?![-!#-\\&*+./:<-@^|~])|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "begin": "(?<=(?:\\P{word}|^)(?:and|class|type))(?!\\p{word})",
              "end": "(?=(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*\\s*,|[^%\\s[:lower:]])|(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*|(?=\\btype\\b)",
              "endCaptures": {
                "0": {
                  "name": "entity.name.function strong emphasis"
                }
              },
              "patterns": [
                {
                  "include": "#attributeIdentifier"
                }
              ]
            },
            {
              "begin": "\\[",
              "captures": {
                "0": {
                  "name": "punctuation.definition.tag"
                }
              },
              "end": "]",
              "patterns": [
                {
                  "include": "#type"
                }
              ]
            },
            {
              "include": "#bindTermArgs"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(?<![-!#-\\&*+./:<-@^|~])=(?![-!#-\\&*+./:<-@^|~])|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#literalClassType"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": "\\band\\b|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            }
          },
          "patterns": [
            {
              "include": "#term"
            }
          ]
        }
      ]
    },
    "bindClassType": {
      "patterns": [
        {
          "begin": "(?<=(?:\\P{word}|^)(?:and|class|type))(?!\\p{word})",
          "end": "(?<![-!#-\\&*+./:<-@^|~])(:)|(=)(?![-!#-\\&*+./:<-@^|~])|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "begin": "(?<=(?:\\P{word}|^)(?:and|class|type))(?!\\p{word})",
              "end": "(?=(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*\\s*,|[^%\\s[:lower:]])|(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*|(?=\\btype\\b)",
              "endCaptures": {
                "0": {
                  "name": "entity.name.function strong emphasis"
                }
              },
              "patterns": [
                {
                  "include": "#attributeIdentifier"
                }
              ]
            },
            {
              "begin": "\\[",
              "captures": {
                "0": {
                  "name": "punctuation.definition.tag"
                }
              },
              "end": "]",
              "patterns": [
                {
                  "include": "#type"
                }
              ]
            },
            {
              "include": "#bindTermArgs"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(?<![-!#-\\&*+./:<-@^|~])=(?![-!#-\\&*+./:<-@^|~])|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#literalClassType"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": "\\band\\b|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            }
          },
          "patterns": [
            {
              "include": "#literalClassType"
            }
          ]
        }
      ]
    },
    "bindConstructor": {
      "patterns": [
        {
          "begin": "(?<=(?:\\P{word}|^)exception)(?!\\p{word})|(?<=[^-!#-\\&*+./:<-@^|~]\\+=|^\\+=|[^-!#-\\&*+./:<-@^|~]=|^=|[^-!#-\\&*+./:<-@^|~]\\||^\\|)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(:)|\\b(of)\\b|((?<![-!#-\\&*+./:<-@^|~])\\|(?![-!#-\\&*+./:<-@^|~]))|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "punctuation.definition.tag"
            },
            "3": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#attributeIdentifier"
            },
            {
              "match": "\\.\\.",
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            {
              "match": "\\b\\b(?=\\p{upper})[_[:alpha:]]['[:word:]]*\\b(?!\\s*(?:\\.|\\([^*]))",
              "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])|(?<=(?:\\P{word}|^)of)(?!\\p{word})",
          "end": "(?<![-!#-\\&*+./:<-@^|~])\\|(?![-!#-\\&*+./:<-@^|~])|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      ]
    },
    "bindSignature": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "(?<=(?:\\P{word}|^)type)(?!\\p{word})",
          "end": "(?<![-!#-\\&*+./:<-@^|~])=(?![-!#-\\&*+./:<-@^|~])",
          "endCaptures": {
            "0": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#pathModuleExtended"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": "\\band\\b|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            }
          },
          "patterns": [
            {
              "include": "#signature"
            }
          ]
        }
      ]
    },
    "bindStructure": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "(?<=(?:\\P{word}|^)and)(?!\\p{word})|(?=\\p{upper})",
          "end": "(?<![-!#-\\&*+./:<-@^|~])(:(?!=))|(:?=)(?![-!#-\\&*+./:<-@^|~])|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "match": "\\bmodule\\b",
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
            },
            {
              "match": "\\b(?=\\p{upper})[_[:alpha:]]['[:word:]]*",
              "name": "entity.name.function strong emphasis"
            },
            {
              "begin": "\\((?!\\))",
              "captures": {
                "0": {
                  "name": "punctuation.definition.tag"
                }
              },
              "end": "\\)",
              "patterns": [
                {
                  "include": "#comment"
                },
                {
                  "begin": "(?<![-!#-\\&*+./:<-@^|~]):(?![-!#-\\&*+./:<-@^|~])",
                  "beginCaptures": {
                    "0": {
                      "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
                    }
                  },
                  "end": "(?=\\))",
                  "patterns": [
                    {
                      "include": "#signature"
                    }
                  ]
                },
                {
                  "include": "#variableModule"
                }
              ]
            },
            {
              "include": "#literalUnit"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "\\b(and)\\b|((?<![-!#-\\&*+./:<-@^|~])=(?![-!#-\\&*+./:<-@^|~]))|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#signature"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]:|^:|[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": "\\b(?:(and)|(with))\\b|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            },
            "2": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            }
          },
          "patterns": [
            {
              "include": "#structure"
            }
          ]
        }
      ]
    },
    "bindTerm": {
      "patterns": [
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)!)(?![-!#-\\&*+./:<-@^|~])|(?<=(?:\\P{word}|^)(?:and|external|let|method|val))(?!\\p{word})",
          "end": "\\b(module)\\b|\\b(open)\\b|(?<![-!#-\\&*+./:<-@^|~])(:)|((?<![-!#-\\&*+./:<-@^|~])=(?![-!#-\\&*+./:<-@^|~]))(?![-!#-\\&*+./:<-@^|~])|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
            },
            "2": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "3": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "4": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)!)(?![-!#-\\&*+./:<-@^|~])|(?<=(?:\\P{word}|^)(?:and|external|let|method|val))(?!\\p{word})",
              "end": "(?=\\b(?:module|open)\\b)|(?=(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*\\s*,|[^%\\s[:lower:]])|\\b(rec)\\b|((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)",
              "endCaptures": {
                "1": {
                  "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                },
                "2": {
                  "name": "entity.name.function strong emphasis"
                }
              },
              "patterns": [
                {
                  "include": "#attributeIdentifier"
                },
                {
                  "include": "#comment"
                }
              ]
            },
            {
              "begin": "(?<=(?:\\P{word}|^)rec)(?!\\p{word})",
              "end": "((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)|(?=[^\\s[:alpha:]])",
              "endCaptures": {
                "0": {
                  "name": "entity.name.function strong emphasis"
                }
              },
              "patterns": [
                {
                  "include": "#bindTermArgs"
                }
              ]
            },
            {
              "include": "#bindTermArgs"
            }
          ]
        },
        {
          "begin": "(?<=(?:\\P{word}|^)module)(?!\\p{word})",
          "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "patterns": [
            {
              "include": "#declModule"
            }
          ]
        },
        {
          "begin": "(?<=(?:\\P{word}|^)open)(?!\\p{word})",
          "end": "(?=\\bin\\b)|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "patterns": [
            {
              "include": "#pathModuleSimple"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(?<![-!#-\\&*+./:<-@^|~])=(?![-!#-\\&*+./:<-@^|~])|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
              "end": "\\btype\\b|(?=\\S)",
              "endCaptures": {
                "0": {
                  "name": "keyword.control"
                }
              }
            },
            {
              "begin": "(?<=(?:\\P{word}|^)type)(?!\\p{word})",
              "end": "(?<![-!#-\\&*+./:<-@^|~])\\.(?![-!#-\\&*+./:<-@^|~])",
              "endCaptures": {
                "0": {
                  "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                }
              },
              "patterns": [
                {
                  "include": "#pattern"
                }
              ]
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": "\\band\\b|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            }
          },
          "patterns": [
            {
              "include": "#term"
            }
          ]
        }
      ]
    },
    "bindTermArgs": {
      "patterns": [
        {
          "applyEndPatternLast": true,
          "begin": "[?~]",
          "beginCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "end": ":|(?=\\S)",
          "endCaptures": {
            "0": {
              "name": "keyword"
            }
          },
          "patterns": [
            {
              "begin": "(?<=[^-!#-\\&*+./:<-@^|~]~|^~|[^-!#-\\&*+./:<-@^|~]\\?|^\\?)(?![-!#-\\&*+./:<-@^|~])",
              "end": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*|(?<=\\))",
              "endCaptures": {
                "0": {
                  "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
                }
              },
              "patterns": [
                {
                  "include": "#comment"
                },
                {
                  "begin": "\\((?!\\*)",
                  "captures": {
                    "0": {
                      "name": "punctuation.definition.tag"
                    }
                  },
                  "end": "\\)",
                  "patterns": [
                    {
                      "begin": "(?<=\\()",
                      "end": "[:=]",
                      "endCaptures": {
                        "0": {
                          "name": "keyword"
                        }
                      },
                      "patterns": [
                        {
                          "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
                          "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
                        }
                      ]
                    },
                    {
                      "begin": "(?<=:)",
                      "end": "=|(?=\\))",
                      "endCaptures": {
                        "0": {
                          "name": "keyword"
                        }
                      },
                      "patterns": [
                        {
                          "include": "#type"
                        }
                      ]
                    },
                    {
                      "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
                      "end": "(?=\\))",
                      "patterns": [
                        {
                          "include": "#term"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "include": "#pattern"
        }
      ]
    },
    "bindType": {
      "patterns": [
        {
          "begin": "(?<=(?:\\P{word}|^)(?:and|type))(?!\\p{word})",
          "end": "(?<![-!#-\\&*+./:<-@^|~])\\+=|=(?![-!#-\\&*+./:<-@^|~])|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#attributeIdentifier"
            },
            {
              "include": "#pathType"
            },
            {
              "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
              "name": "entity.name.function strong"
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]\\+|^\\+|[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": "\\band\\b|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            }
          },
          "patterns": [
            {
              "include": "#bindConstructor"
            }
          ]
        }
      ]
    },
    "comment": {
      "patterns": [
        {
          "include": "#attribute"
        },
        {
          "include": "#extension"
        },
        {
          "include": "#commentBlock"
        },
        {
          "include": "#commentDoc"
        }
      ]
    },
    "commentBlock": {
      "begin": "\\(\\*(?!\\*[^)])",
      "contentName": "emphasis",
      "end": "\\*\\)",
      "name": "comment constant.regexp meta.separator.markdown",
      "patterns": [
        {
          "include": "#commentBlock"
        },
        {
          "include": "#commentDoc"
        }
      ]
    },
    "commentDoc": {
      "begin": "\\(\\*\\*",
      "end": "\\*\\)",
      "name": "comment constant.regexp meta.separator.markdown",
      "patterns": [
        {
          "match": "\\*"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "decl": {
      "patterns": [
        {
          "include": "#declClass"
        },
        {
          "include": "#declException"
        },
        {
          "include": "#declInclude"
        },
        {
          "include": "#declModule"
        },
        {
          "include": "#declOpen"
        },
        {
          "include": "#declTerm"
        },
        {
          "include": "#declType"
        }
      ]
    },
    "declClass": {
      "begin": "\\bclass\\b",
      "beginCaptures": {
        "0": {
          "name": "entity.name.class constant.numeric markup.underline"
        }
      },
      "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "begin": "(?<=(?:\\P{word}|^)class)(?!\\p{word})",
          "beginCaptures": {
            "0": {
              "name": "entity.name.class constant.numeric markup.underline"
            }
          },
          "end": "\\btype\\b|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|val)\\b)",
          "endCaptures": {
            "0": {
              "name": "keyword"
            }
          },
          "patterns": [
            {
              "include": "#bindClassTerm"
            }
          ]
        },
        {
          "begin": "(?<=(?:\\P{word}|^)type)(?!\\p{word})",
          "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "patterns": [
            {
              "include": "#bindClassType"
            }
          ]
        }
      ]
    },
    "declException": {
      "begin": "\\bexception\\b",
      "beginCaptures": {
        "0": {
          "name": "keyword markup.underline"
        }
      },
      "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "patterns": [
        {
          "include": "#attributeIdentifier"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "include": "#bindConstructor"
        }
      ]
    },
    "declInclude": {
      "begin": "\\binclude\\b",
      "beginCaptures": {
        "0": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      },
      "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "patterns": [
        {
          "include": "#attributeIdentifier"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "include": "#signature"
        }
      ]
    },
    "declModule": {
      "begin": "(?<=(?:\\P{word}|^)module)(?!\\p{word})|\\bmodule\\b",
      "beginCaptures": {
        "0": {
          "name": "markup.inserted constant.language support.constant.property-value entity.name.filename markup.underline"
        }
      },
      "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "begin": "(?<=(?:\\P{word}|^)module)(?!\\p{word})",
          "end": "\\b(type)\\b|(?=\\p{upper})",
          "endCaptures": {
            "0": {
              "name": "keyword"
            }
          },
          "patterns": [
            {
              "include": "#attributeIdentifier"
            },
            {
              "include": "#comment"
            },
            {
              "match": "\\brec\\b",
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          ]
        },
        {
          "begin": "(?<=(?:\\P{word}|^)type)(?!\\p{word})",
          "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "patterns": [
            {
              "include": "#bindSignature"
            }
          ]
        },
        {
          "begin": "(?=\\p{upper})",
          "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "patterns": [
            {
              "include": "#bindStructure"
            }
          ]
        }
      ]
    },
    "declOpen": {
      "begin": "\\bopen\\b",
      "beginCaptures": {
        "0": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      },
      "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "patterns": [
        {
          "include": "#attributeIdentifier"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "include": "#pathModuleExtended"
        }
      ]
    },
    "declTerm": {
      "begin": "\\b(?:(external|val)|(method)|(let))\\b(!?)",
      "beginCaptures": {
        "1": {
          "name": "support.type markup.underline"
        },
        "2": {
          "name": "storage.type markup.underline"
        },
        "3": {
          "name": "keyword.control markup.underline"
        },
        "4": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      },
      "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "include": "#bindTerm"
        }
      ]
    },
    "declType": {
      "begin": "(?<=(?:\\P{word}|^)type)(?!\\p{word})|\\btype\\b",
      "beginCaptures": {
        "0": {
          "name": "keyword markup.underline"
        }
      },
      "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "include": "#bindType"
        }
      ]
    },
    "extension": {
      "begin": "(\\[)((?<![-!#-\\&*+./:<-@^|~])%{1,3}(?![-!#-\\&*+./:<-@^|~]))",
      "beginCaptures": {
        "1": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
        },
        "2": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      },
      "end": "]",
      "endCaptures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
        }
      },
      "patterns": [
        {
          "include": "#attributePayload"
        }
      ]
    },
    "literal": {
      "patterns": [
        {
          "include": "#termConstructor"
        },
        {
          "include": "#literalArray"
        },
        {
          "include": "#literalBoolean"
        },
        {
          "include": "#literalCharacter"
        },
        {
          "include": "#literalList"
        },
        {
          "include": "#literalNumber"
        },
        {
          "include": "#literalObjectTerm"
        },
        {
          "include": "#literalString"
        },
        {
          "include": "#literalRecord"
        },
        {
          "include": "#literalUnit"
        }
      ]
    },
    "literalArray": {
      "begin": "\\[\\|",
      "captures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
        }
      },
      "end": "\\|]",
      "patterns": [
        {
          "include": "#term"
        }
      ]
    },
    "literalBoolean": {
      "match": "\\bfalse|true\\b",
      "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
    },
    "literalCharacter": {
      "begin": "(?<!\\p{word})'",
      "end": "'",
      "name": "markup.punctuation.quote.beginning",
      "patterns": [
        {
          "include": "#literalCharacterEscape"
        }
      ]
    },
    "literalCharacterEscape": {
      "match": "\\\\(?:[\"'\\\\bnrt]|\\d\\d\\d|x\\h\\h|o[0-3][0-7][0-7])"
    },
    "literalClassType": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "\\bobject\\b",
          "captures": {
            "0": {
              "name": "punctuation.definition.tag emphasis"
            }
          },
          "end": "\\bend\\b",
          "patterns": [
            {
              "begin": "\\binherit\\b",
              "beginCaptures": {
                "0": {
                  "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                }
              },
              "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.definition.tag"
                }
              },
              "patterns": [
                {
                  "begin": "\\bas\\b",
                  "beginCaptures": {
                    "0": {
                      "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                    }
                  },
                  "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
                  "patterns": [
                    {
                      "include": "#variablePattern"
                    }
                  ]
                },
                {
                  "include": "#type"
                }
              ]
            },
            {
              "include": "#pattern"
            },
            {
              "include": "#declTerm"
            }
          ]
        },
        {
          "begin": "\\[",
          "end": "]"
        }
      ]
    },
    "literalList": {
      "patterns": [
        {
          "begin": "\\[",
          "captures": {
            "0": {
              "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
            }
          },
          "end": "]",
          "patterns": [
            {
              "include": "#term"
            }
          ]
        }
      ]
    },
    "literalNumber": {
      "match": "(?<!\\p{alpha})\\d\\d*(\\.\\d\\d*)?",
      "name": "constant.numeric"
    },
    "literalObjectTerm": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "\\bobject\\b",
          "captures": {
            "0": {
              "name": "punctuation.definition.tag emphasis"
            }
          },
          "end": "\\bend\\b",
          "patterns": [
            {
              "begin": "\\binherit\\b",
              "beginCaptures": {
                "0": {
                  "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                }
              },
              "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.definition.tag"
                }
              },
              "patterns": [
                {
                  "begin": "\\bas\\b",
                  "beginCaptures": {
                    "0": {
                      "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                    }
                  },
                  "end": ";;|(?=[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
                  "patterns": [
                    {
                      "include": "#variablePattern"
                    }
                  ]
                },
                {
                  "include": "#term"
                }
              ]
            },
            {
              "include": "#pattern"
            },
            {
              "include": "#declTerm"
            }
          ]
        },
        {
          "begin": "\\[",
          "end": "]"
        }
      ]
    },
    "literalRecord": {
      "begin": "\\{",
      "captures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong strong"
        }
      },
      "end": "}",
      "patterns": [
        {
          "begin": "(?<=[;{])",
          "end": "(:)|(=)|(;)|(with)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            },
            "3": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "4": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#pathModulePrefixSimple"
            },
            {
              "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename emphasis"
            }
          ]
        },
        {
          "begin": "(?<=(?:\\P{word}|^)with)(?!\\p{word})",
          "end": "(:)|(=)|(;)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            },
            "3": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename emphasis"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(;)|(=)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": ";|(?=})",
          "endCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "include": "#term"
            }
          ]
        }
      ]
    },
    "literalString": {
      "patterns": [
        {
          "begin": "\"",
          "end": "\"",
          "name": "string beginning.punctuation.definition.quote.markdown",
          "patterns": [
            {
              "include": "#literalStringEscape"
            }
          ]
        },
        {
          "begin": "(\\{)([_[:lower:]]*?)(\\|)",
          "end": "(\\|)(\\2)(})",
          "name": "string beginning.punctuation.definition.quote.markdown",
          "patterns": [
            {
              "include": "#literalStringEscape"
            }
          ]
        }
      ]
    },
    "literalStringEscape": {
      "match": "\\\\(?:[\"\\\\bnrt]|\\d\\d\\d|x\\h\\h|o[0-3][0-7][0-7])"
    },
    "literalUnit": {
      "match": "\\(\\)",
      "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
    },
    "pathModuleExtended": {
      "patterns": [
        {
          "include": "#pathModulePrefixExtended"
        },
        {
          "match": "\\b(?=\\p{upper})[_[:alpha:]]['[:word:]]*",
          "name": "entity.name.class constant.numeric"
        }
      ]
    },
    "pathModulePrefixExtended": {
      "begin": "\\b(?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*\\.|$|\\()",
      "beginCaptures": {
        "0": {
          "name": "entity.name.class constant.numeric"
        }
      },
      "end": "(?![.\\s]|$|\\()",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "\\(",
          "captures": {
            "0": {
              "name": "keyword.control"
            }
          },
          "end": "\\)",
          "patterns": [
            {
              "match": "\\b((?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*\\)))",
              "name": "string.other.link variable.language variable.parameter emphasis"
            },
            {
              "include": "#structure"
            }
          ]
        },
        {
          "begin": "(?<![-!#-\\&*+./:<-@^|~])\\.(?![-!#-\\&*+./:<-@^|~])",
          "beginCaptures": {
            "0": {
              "name": "keyword strong"
            }
          },
          "end": "\\b((?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*\\.|$))|\\b((?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*(?:$|\\()))|\\b((?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*\\)))|(?![.\\s[:upper:]]|$|\\()",
          "endCaptures": {
            "1": {
              "name": "entity.name.class constant.numeric"
            },
            "2": {
              "name": "entity.name.function strong"
            },
            "3": {
              "name": "string.other.link variable.language variable.parameter emphasis"
            }
          }
        }
      ]
    },
    "pathModulePrefixExtendedParens": {
      "begin": "\\(",
      "captures": {
        "0": {
          "name": "keyword.control"
        }
      },
      "end": "\\)",
      "patterns": [
        {
          "match": "\\b((?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*\\)))",
          "name": "string.other.link variable.language variable.parameter emphasis"
        },
        {
          "include": "#structure"
        }
      ]
    },
    "pathModulePrefixSimple": {
      "begin": "\\b(?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*\\.)",
      "beginCaptures": {
        "0": {
          "name": "entity.name.class constant.numeric"
        }
      },
      "end": "(?![.\\s])",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "(?<![-!#-\\&*+./:<-@^|~])\\.(?![-!#-\\&*+./:<-@^|~])",
          "beginCaptures": {
            "0": {
              "name": "keyword strong"
            }
          },
          "end": "\\b((?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*\\.))|\\b((?=\\p{upper})[_[:alpha:]]['[:word:]]*(?=\\s*))|(?![.\\s[:upper:]])",
          "endCaptures": {
            "1": {
              "name": "entity.name.class constant.numeric"
            },
            "2": {
              "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
            }
          }
        }
      ]
    },
    "pathModuleSimple": {
      "patterns": [
        {
          "include": "#pathModulePrefixSimple"
        },
        {
          "match": "\\b(?=\\p{upper})[_[:alpha:]]['[:word:]]*",
          "name": "entity.name.class constant.numeric"
        }
      ]
    },
    "pathRecord": {
      "patterns": [
        {
          "begin": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
          "end": "(?=[^.\\s])(?!\\(\\*)",
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)\\.)(?![-!#-\\&*+./:<-@^|~])|(?<![-!#-\\&*+./:<-@^|~])\\.(?![-!#-\\&*+./:<-@^|~])",
              "beginCaptures": {
                "0": {
                  "name": "keyword strong"
                }
              },
              "end": "((?<![-!#-\\&*+./:<-@^|~])\\.(?![-!#-\\&*+./:<-@^|~]))|((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|mutable|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)|(?<=\\))|(?<=])",
              "endCaptures": {
                "1": {
                  "name": "keyword strong"
                },
                "2": {
                  "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
                }
              },
              "patterns": [
                {
                  "include": "#comment"
                },
                {
                  "include": "#pathModulePrefixSimple"
                },
                {
                  "begin": "\\((?!\\*)",
                  "captures": {
                    "0": {
                      "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                    }
                  },
                  "end": "\\)",
                  "patterns": [
                    {
                      "include": "#term"
                    }
                  ]
                },
                {
                  "begin": "\\[",
                  "captures": {
                    "0": {
                      "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                    }
                  },
                  "end": "]",
                  "patterns": [
                    {
                      "include": "#pattern"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    "pattern": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#patternArray"
        },
        {
          "include": "#patternLazy"
        },
        {
          "include": "#patternList"
        },
        {
          "include": "#patternMisc"
        },
        {
          "include": "#patternModule"
        },
        {
          "include": "#patternRecord"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#patternParens"
        },
        {
          "include": "#patternType"
        },
        {
          "include": "#variablePattern"
        },
        {
          "include": "#termOperator"
        }
      ]
    },
    "patternArray": {
      "begin": "\\[\\|",
      "captures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
        }
      },
      "end": "\\|]",
      "patterns": [
        {
          "include": "#pattern"
        }
      ]
    },
    "patternLazy": {
      "match": "lazy",
      "name": "variable.other.class.js message.error variable.interpolation string.regexp"
    },
    "patternList": {
      "begin": "\\[",
      "captures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
        }
      },
      "end": "]",
      "patterns": [
        {
          "include": "#pattern"
        }
      ]
    },
    "patternMisc": {
      "captures": {
        "1": {
          "name": "string.regexp strong"
        },
        "2": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        },
        "3": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      },
      "match": "((?<![-!#-\\&*+./:<-@^|~]),(?![-!#-\\&*+./:<-@^|~]))|([-!#-\\&*+./:<-@^|~]+)|\\b(as)\\b"
    },
    "patternModule": {
      "begin": "\\bmodule\\b",
      "beginCaptures": {
        "0": {
          "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
        }
      },
      "end": "(?=\\))",
      "patterns": [
        {
          "include": "#declModule"
        }
      ]
    },
    "patternParens": {
      "begin": "\\((?!\\))",
      "captures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "end": "\\)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "(?<![-!#-\\&*+./:<-@^|~]):(?![-!#-\\&*+./:<-@^|~])",
          "beginCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            }
          },
          "end": "(?=\\))",
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        {
          "include": "#pattern"
        }
      ]
    },
    "patternRecord": {
      "begin": "\\{",
      "captures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong strong"
        }
      },
      "end": "}",
      "patterns": [
        {
          "begin": "(?<=[;{])",
          "end": "(:)|(=)|(;)|(with)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            },
            "3": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "4": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#pathModulePrefixSimple"
            },
            {
              "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename emphasis"
            }
          ]
        },
        {
          "begin": "(?<=(?:\\P{word}|^)with)(?!\\p{word})",
          "end": "(:)|(=)|(;)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            },
            "3": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename emphasis"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(;)|(=)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": ";|(?=})",
          "endCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "include": "#pattern"
            }
          ]
        }
      ]
    },
    "patternType": {
      "begin": "\\btype\\b",
      "beginCaptures": {
        "0": {
          "name": "keyword"
        }
      },
      "end": "(?=\\))",
      "patterns": [
        {
          "include": "#declType"
        }
      ]
    },
    "pragma": {
      "begin": "(?<![-!#-\\&*+./:<-@^|~])#(?![-!#-\\&*+./:<-@^|~])",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#literalNumber"
        },
        {
          "include": "#literalString"
        }
      ]
    },
    "signature": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#signatureLiteral"
        },
        {
          "include": "#signatureFunctor"
        },
        {
          "include": "#pathModuleExtended"
        },
        {
          "include": "#signatureParens"
        },
        {
          "include": "#signatureRecovered"
        },
        {
          "include": "#signatureConstraints"
        }
      ]
    },
    "signatureConstraints": {
      "begin": "\\bwith\\b",
      "beginCaptures": {
        "0": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
        }
      },
      "end": "(?=\\))|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
      "patterns": [
        {
          "begin": "(?<=(?:\\P{word}|^)with)(?!\\p{word})",
          "end": "\\b(?:(module)|(type))\\b",
          "endCaptures": {
            "1": {
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
            },
            "2": {
              "name": "keyword"
            }
          }
        },
        {
          "include": "#declModule"
        },
        {
          "include": "#declType"
        }
      ]
    },
    "signatureFunctor": {
      "patterns": [
        {
          "begin": "\\bfunctor\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword"
            }
          },
          "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "patterns": [
            {
              "begin": "(?<=(?:\\P{word}|^)functor)(?!\\p{word})",
              "end": "(\\(\\))|(\\((?!\\)))",
              "endCaptures": {
                "1": {
                  "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
                },
                "2": {
                  "name": "punctuation.definition.tag"
                }
              }
            },
            {
              "begin": "(?<=\\()",
              "end": "(:)|(\\))",
              "endCaptures": {
                "1": {
                  "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
                },
                "2": {
                  "name": "punctuation.definition.tag"
                }
              },
              "patterns": [
                {
                  "include": "#variableModule"
                }
              ]
            },
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
              "end": "\\)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.definition.tag"
                }
              },
              "patterns": [
                {
                  "include": "#signature"
                }
              ]
            },
            {
              "begin": "(?<=\\))",
              "end": "(\\()|((?<![-!#-\\&*+./:<-@^|~])->(?![-!#-\\&*+./:<-@^|~]))",
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag"
                },
                "2": {
                  "name": "support.type strong"
                }
              }
            },
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)->)(?![-!#-\\&*+./:<-@^|~])",
              "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
              "patterns": [
                {
                  "include": "#signature"
                }
              ]
            }
          ]
        },
        {
          "match": "(?<![-!#-\\&*+./:<-@^|~])->(?![-!#-\\&*+./:<-@^|~])",
          "name": "support.type strong"
        }
      ]
    },
    "signatureLiteral": {
      "begin": "\\bsig\\b",
      "captures": {
        "0": {
          "name": "punctuation.definition.tag emphasis"
        }
      },
      "end": "\\bend\\b",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "include": "#decl"
        }
      ]
    },
    "signatureParens": {
      "begin": "\\((?!\\))",
      "captures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "end": "\\)",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "begin": "(?<![-!#-\\&*+./:<-@^|~]):(?![-!#-\\&*+./:<-@^|~])",
          "beginCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            }
          },
          "end": "(?=\\))",
          "patterns": [
            {
              "include": "#signature"
            }
          ]
        },
        {
          "include": "#signature"
        }
      ]
    },
    "signatureRecovered": {
      "patterns": [
        {
          "begin": "\\(|(?<=[^-!#-\\&*+./:<-@^|~]:|^:|[^-!#-\\&*+./:<-@^|~]->|^->)(?![-!#-\\&*+./:<-@^|~])|(?<=(?:\\P{word}|^)(?:include|open))(?!\\p{word})",
          "end": "\\bmodule\\b|(?!$|\\s|\\bmodule\\b)",
          "endCaptures": {
            "0": {
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
            }
          }
        },
        {
          "begin": "(?<=(?:\\P{word}|^)module)(?!\\p{word})",
          "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "patterns": [
            {
              "begin": "(?<=(?:\\P{word}|^)module)(?!\\p{word})",
              "end": "\\btype\\b",
              "endCaptures": {
                "0": {
                  "name": "keyword"
                }
              }
            },
            {
              "begin": "(?<=(?:\\P{word}|^)type)(?!\\p{word})",
              "end": "\\bof\\b",
              "endCaptures": {
                "0": {
                  "name": "punctuation.definition.tag"
                }
              }
            },
            {
              "begin": "(?<=(?:\\P{word}|^)of)(?!\\p{word})",
              "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
              "patterns": [
                {
                  "include": "#signature"
                }
              ]
            }
          ]
        }
      ]
    },
    "structure": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#structureLiteral"
        },
        {
          "include": "#structureFunctor"
        },
        {
          "include": "#pathModuleExtended"
        },
        {
          "include": "#structureParens"
        }
      ]
    },
    "structureFunctor": {
      "patterns": [
        {
          "begin": "\\bfunctor\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword"
            }
          },
          "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "patterns": [
            {
              "begin": "(?<=(?:\\P{word}|^)functor)(?!\\p{word})",
              "end": "(\\(\\))|(\\((?!\\)))",
              "endCaptures": {
                "1": {
                  "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
                },
                "2": {
                  "name": "punctuation.definition.tag"
                }
              }
            },
            {
              "begin": "(?<=\\()",
              "end": "(:)|(\\))",
              "endCaptures": {
                "1": {
                  "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
                },
                "2": {
                  "name": "punctuation.definition.tag"
                }
              },
              "patterns": [
                {
                  "include": "#variableModule"
                }
              ]
            },
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
              "end": "\\)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.definition.tag"
                }
              },
              "patterns": [
                {
                  "include": "#signature"
                }
              ]
            },
            {
              "begin": "(?<=\\))",
              "end": "(\\()|((?<![-!#-\\&*+./:<-@^|~])->(?![-!#-\\&*+./:<-@^|~]))",
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag"
                },
                "2": {
                  "name": "support.type strong"
                }
              }
            },
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)->)(?![-!#-\\&*+./:<-@^|~])",
              "end": "(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
              "patterns": [
                {
                  "include": "#structure"
                }
              ]
            }
          ]
        },
        {
          "match": "(?<![-!#-\\&*+./:<-@^|~])->(?![-!#-\\&*+./:<-@^|~])",
          "name": "support.type strong"
        }
      ]
    },
    "structureLiteral": {
      "begin": "\\bstruct\\b",
      "captures": {
        "0": {
          "name": "punctuation.definition.tag emphasis"
        }
      },
      "end": "\\bend\\b",
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#pragma"
        },
        {
          "include": "#decl"
        }
      ]
    },
    "structureParens": {
      "begin": "\\(",
      "captures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "end": "\\)",
      "patterns": [
        {
          "include": "#structureUnpack"
        },
        {
          "include": "#structure"
        }
      ]
    },
    "structureUnpack": {
      "begin": "\\bval\\b",
      "beginCaptures": {
        "0": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      },
      "end": "(?=\\))"
    },
    "term": {
      "patterns": [
        {
          "include": "#termLet"
        },
        {
          "include": "#termAtomic"
        }
      ]
    },
    "termAtomic": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#termConditional"
        },
        {
          "include": "#termConstructor"
        },
        {
          "include": "#termDelim"
        },
        {
          "include": "#termFor"
        },
        {
          "include": "#termFunction"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#termMatch"
        },
        {
          "include": "#termMatchRule"
        },
        {
          "include": "#termPun"
        },
        {
          "include": "#termOperator"
        },
        {
          "include": "#termTry"
        },
        {
          "include": "#termWhile"
        },
        {
          "include": "#pathRecord"
        }
      ]
    },
    "termConditional": {
      "match": "\\b(?:if|then|else)\\b",
      "name": "keyword.control"
    },
    "termConstructor": {
      "patterns": [
        {
          "include": "#pathModulePrefixSimple"
        },
        {
          "match": "\\b(?=\\p{upper})[_[:alpha:]]['[:word:]]*",
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong"
        }
      ]
    },
    "termDelim": {
      "patterns": [
        {
          "begin": "\\((?!\\))",
          "captures": {
            "0": {
              "name": "punctuation.definition.tag"
            }
          },
          "end": "\\)",
          "patterns": [
            {
              "include": "#term"
            }
          ]
        },
        {
          "begin": "\\bbegin\\b",
          "captures": {
            "0": {
              "name": "punctuation.definition.tag"
            }
          },
          "end": "\\bend\\b",
          "patterns": [
            {
              "include": "#attributeIdentifier"
            },
            {
              "include": "#term"
            }
          ]
        }
      ]
    },
    "termFor": {
      "patterns": [
        {
          "begin": "\\bfor\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control"
            }
          },
          "end": "\\bdone\\b",
          "endCaptures": {
            "0": {
              "name": "keyword.control"
            }
          },
          "patterns": [
            {
              "begin": "(?<=(?:\\P{word}|^)for)(?!\\p{word})",
              "end": "(?<![-!#-\\&*+./:<-@^|~])=(?![-!#-\\&*+./:<-@^|~])",
              "endCaptures": {
                "0": {
                  "name": "support.type strong"
                }
              },
              "patterns": [
                {
                  "include": "#pattern"
                }
              ]
            },
            {
              "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
              "end": "\\b(?:downto|to)\\b",
              "endCaptures": {
                "0": {
                  "name": "keyword.control"
                }
              },
              "patterns": [
                {
                  "include": "#term"
                }
              ]
            },
            {
              "begin": "(?<=(?:\\P{word}|^)to)(?!\\p{word})",
              "end": "\\bdo\\b",
              "endCaptures": {
                "0": {
                  "name": "keyword.control"
                }
              },
              "patterns": [
                {
                  "include": "#term"
                }
              ]
            },
            {
              "begin": "(?<=(?:\\P{word}|^)do)(?!\\p{word})",
              "end": "(?=\\bdone\\b)",
              "patterns": [
                {
                  "include": "#term"
                }
              ]
            }
          ]
        }
      ]
    },
    "termFunction": {
      "captures": {
        "1": {
          "name": "storage.type"
        },
        "2": {
          "name": "storage.type"
        }
      },
      "match": "\\b(?:(fun)|(function))\\b"
    },
    "termLet": {
      "patterns": [
        {
          "begin": "(?:(?<=[^-!#-\\&*+./:<-@^|~]=|^=|[^-!#-\\&*+./:<-@^|~]->|^->)(?![-!#-\\&*+./:<-@^|~])|(?<=[(;]))(?=\\s|\\blet\\b)|(?<=(?:\\P{word}|^)(?:begin|do|else|in|struct|then|try))(?!\\p{word})|(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)@@)(?![-!#-\\&*+./:<-@^|~])\\s+",
          "end": "\\b(?:(and)|(let))\\b|(?=\\S)(?!\\(\\*)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            },
            "2": {
              "name": "storage.type markup.underline"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            }
          ]
        },
        {
          "begin": "(?<=(?:\\P{word}|^)(?:and|let))(?!\\p{word})|(let)",
          "beginCaptures": {
            "1": {
              "name": "storage.type markup.underline"
            }
          },
          "end": "\\b(?:(and)|(in))\\b|(?=[])}]|\\b(?:end|class|exception|external|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp markup.underline"
            },
            "2": {
              "name": "storage.type markup.underline"
            }
          },
          "patterns": [
            {
              "include": "#bindTerm"
            }
          ]
        }
      ]
    },
    "termMatch": {
      "begin": "\\bmatch\\b",
      "captures": {
        "0": {
          "name": "keyword.control"
        }
      },
      "end": "\\bwith\\b",
      "patterns": [
        {
          "include": "#term"
        }
      ]
    },
    "termMatchRule": {
      "patterns": [
        {
          "begin": "(?<=(?:\\P{word}|^)(?:fun|function|with))(?!\\p{word})",
          "end": "(?<![-!#-\\&*+./:<-@^|~])(\\|)|(->)(?![-!#-\\&*+./:<-@^|~])",
          "endCaptures": {
            "1": {
              "name": "support.type strong"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#attributeIdentifier"
            },
            {
              "include": "#pattern"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@\\[^|~]|^)\\|)(?![-!#-\\&*+./:<-@^|~])|(?<![-!#-\\&*+./:<-@^|~])\\|(?![-!#-\\&*+./:<-@^|~])",
          "beginCaptures": {
            "0": {
              "name": "support.type strong"
            }
          },
          "end": "(?<![-!#-\\&*+./:<-@^|~])(\\|)|(->)(?![-!#-\\&*+./:<-@^|~])",
          "endCaptures": {
            "1": {
              "name": "support.type strong"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#pattern"
            },
            {
              "begin": "\\bwhen\\b",
              "beginCaptures": {
                "0": {
                  "name": "variable.other.class.js message.error variable.interpolation string.regexp"
                }
              },
              "end": "(?=(?<![-!#-\\&*+./:<-@^|~])->(?![-!#-\\&*+./:<-@^|~]))",
              "patterns": [
                {
                  "include": "#term"
                }
              ]
            }
          ]
        }
      ]
    },
    "termOperator": {
      "patterns": [
        {
          "begin": "(?<![-!#-\\&*+./:<-@^|~])#(?![-!#-\\&*+./:<-@^|~])",
          "beginCaptures": {
            "0": {
              "name": "keyword"
            }
          },
          "end": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
          "endCaptures": {
            "0": {
              "name": "entity.name.function"
            }
          }
        },
        {
          "captures": {
            "0": {
              "name": "keyword.control strong"
            }
          },
          "match": "<-"
        },
        {
          "captures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "2": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "match": "(,|[-!#-\\&*+./:<-@^|~]+)|(;)"
        },
        {
          "match": "\\b(?:and|assert|asr|land|lazy|lsr|lxor|mod|new|or)\\b",
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      ]
    },
    "termPun": {
      "applyEndPatternLast": true,
      "begin": "(?<![-!#-\\&*+./:<-@^|~])\\?|~(?![-!#-\\&*+./:<-@^|~])",
      "beginCaptures": {
        "0": {
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        }
      },
      "end": ":|(?=[^:\\s])",
      "endCaptures": {
        "0": {
          "name": "keyword"
        }
      },
      "patterns": [
        {
          "begin": "(?<=[^-!#-\\&*+./:<-@^|~]\\?|^\\?|[^-!#-\\&*+./:<-@^|~]~|^~)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
          "endCaptures": {
            "0": {
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
            }
          }
        }
      ]
    },
    "termTry": {
      "begin": "\\btry\\b",
      "captures": {
        "0": {
          "name": "keyword.control"
        }
      },
      "end": "\\bwith\\b",
      "patterns": [
        {
          "include": "#term"
        }
      ]
    },
    "termWhile": {
      "patterns": [
        {
          "begin": "\\bwhile\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control"
            }
          },
          "end": "\\bdone\\b",
          "endCaptures": {
            "0": {
              "name": "keyword.control"
            }
          },
          "patterns": [
            {
              "begin": "(?<=(?:\\P{word}|^)while)(?!\\p{word})",
              "end": "\\bdo\\b",
              "endCaptures": {
                "0": {
                  "name": "keyword.control"
                }
              },
              "patterns": [
                {
                  "include": "#term"
                }
              ]
            },
            {
              "begin": "(?<=(?:\\P{word}|^)do)(?!\\p{word})",
              "end": "(?=\\bdone\\b)",
              "patterns": [
                {
                  "include": "#term"
                }
              ]
            }
          ]
        }
      ]
    },
    "type": {
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "match": "\\bnonrec\\b",
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        },
        {
          "include": "#pathModulePrefixExtended"
        },
        {
          "include": "#typeLabel"
        },
        {
          "include": "#typeObject"
        },
        {
          "include": "#typeOperator"
        },
        {
          "include": "#typeParens"
        },
        {
          "include": "#typePolymorphicVariant"
        },
        {
          "include": "#typeRecord"
        },
        {
          "include": "#typeConstructor"
        }
      ]
    },
    "typeConstructor": {
      "patterns": [
        {
          "begin": "(_)|((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)|(')((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)|(?<=[^*]\\)|])",
          "beginCaptures": {
            "1": {
              "name": "comment constant.regexp meta.separator.markdown"
            },
            "3": {
              "name": "string.other.link variable.language variable.parameter emphasis strong emphasis"
            },
            "4": {
              "name": "keyword.control emphasis"
            }
          },
          "end": "(?=\\((?!\\*)|[])-.:;=>\\[{|}])|((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)[:aceps]*(?!\\(\\*|\\p{word})|(?=;;|[])}]|\\b(?:end|and|class|exception|external|in|include|inherit|initializer|let|method|module|open|type|val)\\b)",
          "endCaptures": {
            "1": {
              "name": "entity.name.function strong"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#pathModulePrefixExtended"
            }
          ]
        }
      ]
    },
    "typeLabel": {
      "patterns": [
        {
          "begin": "(\\??)((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)\\s*((?<![-!#-\\&*+./:<-@^|~]):(?![-!#-\\&*+./:<-@^|~]))",
          "captures": {
            "1": {
              "name": "keyword strong emphasis"
            },
            "2": {
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename emphasis"
            },
            "3": {
              "name": "keyword"
            }
          },
          "end": "(?=(?<![-!#-\\&*+./:<-@^|~])->(?![-!#-\\&*+./:<-@^|~]))",
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      ]
    },
    "typeModule": {
      "begin": "\\bmodule\\b",
      "beginCaptures": {
        "0": {
          "name": "markup.inserted constant.language support.constant.property-value entity.name.filename"
        }
      },
      "end": "(?=\\))",
      "patterns": [
        {
          "include": "#pathModuleExtended"
        },
        {
          "include": "#signatureConstraints"
        }
      ]
    },
    "typeObject": {
      "begin": "<",
      "captures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong strong"
        }
      },
      "end": ">",
      "patterns": [
        {
          "begin": "(?<=[;<])",
          "end": "(:)|(?=>)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "3": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "4": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#pathModulePrefixSimple"
            },
            {
              "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename emphasis"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(;)|(?=>)",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      ]
    },
    "typeOperator": {
      "patterns": [
        {
          "match": "[,;]|[-!#-\\&*+./:<-@^|~]+",
          "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
        }
      ]
    },
    "typeParens": {
      "begin": "\\(",
      "captures": {
        "0": {
          "name": "punctuation.definition.tag"
        }
      },
      "end": "\\)",
      "patterns": [
        {
          "match": ",",
          "name": "variable.other.class.js message.error variable.interpolation string.regexp"
        },
        {
          "include": "#typeModule"
        },
        {
          "include": "#type"
        }
      ]
    },
    "typePolymorphicVariant": {
      "begin": "\\[",
      "end": "]",
      "patterns": [
      ]
    },
    "typeRecord": {
      "begin": "\\{",
      "captures": {
        "0": {
          "name": "constant.language constant.numeric entity.other.attribute-name.id.css strong strong"
        }
      },
      "end": "}",
      "patterns": [
        {
          "begin": "(?<=[;{])",
          "end": "(:)|(=)|(;)|(with)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            },
            "3": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "4": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "include": "#comment"
            },
            {
              "include": "#pathModulePrefixSimple"
            },
            {
              "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename emphasis"
            }
          ]
        },
        {
          "begin": "(?<=(?:\\P{word}|^)with)(?!\\p{word})",
          "end": "(:)|(=)|(;)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp strong"
            },
            "2": {
              "name": "support.type strong"
            },
            "3": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "match": "(?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*",
              "name": "markup.inserted constant.language support.constant.property-value entity.name.filename emphasis"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^):)(?![-!#-\\&*+./:<-@^|~])",
          "end": "(;)|(=)|(?=})",
          "endCaptures": {
            "1": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            },
            "2": {
              "name": "support.type strong"
            }
          },
          "patterns": [
            {
              "include": "#type"
            }
          ]
        },
        {
          "begin": "(?<=(?:[^-!#-\\&*+./:<-@^|~]|^)=)(?![-!#-\\&*+./:<-@^|~])",
          "end": ";|(?=})",
          "endCaptures": {
            "0": {
              "name": "variable.other.class.js message.error variable.interpolation string.regexp"
            }
          },
          "patterns": [
            {
              "include": "#type"
            }
          ]
        }
      ]
    },
    "variableModule": {
      "captures": {
        "0": {
          "name": "string.other.link variable.language variable.parameter emphasis"
        }
      },
      "match": "\\b(?=\\p{upper})[_[:alpha:]]['[:word:]]*"
    },
    "variablePattern": {
      "captures": {
        "1": {
          "name": "comment constant.regexp meta.separator.markdown"
        },
        "2": {
          "name": "string.other.link variable.language variable.parameter emphasis"
        }
      },
      "match": "\\b(_)\\b|((?!\\b(?:and|'|as|asr|assert|\\*|begin|class|[,:@]|constraint|do|done|downto|else|end|=|exception|external|false|for|\\.|fun|function|functor|[->]|if|in|include|inherit|initializer|land|lazy|[(<\\[{]|let|lor|lsl|lsr|lxor|match|method|mod|module|mutable|new|nonrec|#|object|of|open|or|[%+]|private|[\"?]|rec|[]);\\\\}]|sig|/|struct|then|~|to|true|try|type|val|\\||virtual|when|while|with)\\b(?:[^']|$))\\b(?=[_[:lower:]])[_[:alpha:]]['[:word:]]*)"
    }
  },
  "scopeName": "source.ocaml"
}
