{
  "scopeName": "source.cobol",
  "patterns": [
    {
      "include": "#cobol-source"
    }
  ],
  "repository": {
    "cobol-source": {
      "patterns": [
        {
          "include": "#comment-cobol-source"
        },
        {
          "include": "#sequence-number-area"
        },
        {
          "include": "#exec-sql-block"
        },
        {
          "include": "#exec-cics-block"
        },
        {
          "include": "#exec-unknown-block"
        },
        {
          "include": "#number-constant"
        },
        {
          "include": "#comment-floating"
        },
        {
          "include": "#string-quoted-constant"
        },
        {
          "include": "#string-double-quoted-constant"
        },
        {
          "include": "#picture"
        },
        {
          "include": "#db2-host-var-definition"
        },
        {
          "include": "#cobol-keywords"
        },
        {
          "include": "#cobol-preprocessor-keywords"
        }
      ]
    },
    "comment-cobol-source": {
      "match": "^(.{6})(\\/.*|\\*.*)$",
      "captures": {
        "1": {
          "name": "constant.numeric.integer"
        },
        "2": {
          "name": "comment.line.cobol.fixed"
        }
      }
    },
    "sequence-number-area": {
      "match": "^.{6}",
      "name": "constant.numeric.integer"
    },
    "comment-floating": {
      "match": "\\s\\*>.*",
      "name": "comment.line.cobol.floating"
    },
    "number-constant": {
      "match": "(?<![\\+\\-\\w])(\\+|\\-)?\\d+(\\.\\d+)?([Ee](\\-|\\+)\\d+)?(?![\\-\\w])",
      "name": "constant.numeric.integer"
    },
    "string-quoted-constant": {
      "begin": "'",
      "end": "'|$",
      "name": "string.quoted.single.cobol"
    },
    "string-double-quoted-constant": {
      "begin": "\"",
      "end": "\"|$",
      "name": "string.quoted.double.cobol"
    },
    "picture": {
      "match": "(?i:\\b(picture|pic)\\s+(is\\s+)?\\S+)(?<!\\.)",
      "name": "storage.type.picture.cobol"
    },
    "cobol-keywords": {
      "patterns": [
        { "include": "#cobol-condition-keyword" },
        { "include": "#cobol-branch-keyword" },
        { "include": "#cobol-callback-keyword" },
        { "include": "#cobol-serialization-keyword" },
        { "include": "#cobol-subroutine-keyword" },
        { "include": "#cobol-exit-keyword" },
        { "include": "#cobol-general-keyword" }
      ]
    },
    "cobol-condition-keyword": {
      "match": "(?<![\\-\\w])(?i:IF|ELSE|END-IF|EVALUATE|NOT|WHEN\\s+OTHER|WHEN|END-EVALUATE|CONTINUE)(?![\\-\\w])",
      "name": "keyword.control.condition.cobol"
    },
    "cobol-branch-keyword": {
      "match": "(?<![\\-\\w])(?i:PERFORM|END-PERFORM|GO\\s+TO)(?![\\-\\w])",
      "name": "keyword.control.branch.cobol"
    },
    "cobol-callback-keyword": {
      "match": "(?<![\\-\\w])(?i:MERGE|SORT|SORT-MERGE|USE)(?![\\-\\w])",
      "name": "keyword.control.callback.cobol"
    },
    "cobol-serialization-keyword": {
      "match": "(?<![\\-\\w])(?i:JSON\\s+GENERATE|JSON\\s+PARSE|END-JSON|XML\\s+GENERATE|XML\\s+PARSE|END-XML)(?![\\-\\w])",
      "name": "keyword.control.serialization.cobol"
    },
    "cobol-subroutine-keyword": {
      "match": "(?<![\\-\\w])(?i:CALL|END-CALL|GOBACK|STOP\\s+RUN)(?![\\-\\w])",
      "name": "keyword.control.subroutine.cobol"
    },
    "cobol-exit-keyword": {
      "match": "(?<![\\-\\w])(?i:EXIT\\s+(PROGRAM|METHOD|PERFORM(\\s+CYCLE)?|PARAGRAPH|SECTION))(?![\\-\\w])",
      "name": "keyword.control.exit.cobol"
    },
    "exec-sql-block": {
      "begin": "(?i:EXEC\\s+SQL)",
      "beginCaptures": {
        "0": {
          "name": "string.quoted.sql.cobol"
        }
      },
      "name": "sql.embedded.code",
      "end": "(?i:END-EXEC)",
      "endCaptures": {
        "0": {
          "name": "string.quoted.sql.cobol"
        }
      }
    },
    "exec-cics-block": {
      "begin": "(?i:EXEC\\s+CICS)",
      "beginCaptures": {
        "0": {
          "name": "string.quoted.cics.cobol"
        }
      },
      "name": "cics.embedded.code",
      "end": "(?i:END-EXEC)",
      "endCaptures": {
        "0": {
          "name": "string.quoted.cics.cobol"
        }
      }
    },
    "exec-unknown-block": {
      "begin": "(?i:(?<=^| )EXEC(\\s+|$))",
      "beginCaptures": {
        "0": {
          "name": "string.quoted.single.cobol"
        }
      },
      "patterns": [
        {
          "include": "#comment-cobol-source"
        },
        {
          "include": "#sequence-number-area"
        },
        {
          "include": "#string-quoted-constant"
        },
        {
          "include": "#string-double-quoted-constant"
        }
      ],
      "name": "string.quoted.single.cobol",
      "end": "(?<=^| )(?i:END-EXEC)(?=$| |[.])|\\S(?<=^.{8,10}\\S*\\s*[.])",
      "endCaptures": {
        "0": {
          "name": "string.quoted.single.cobol"
        }
      }
    },
    "db2-host-var-definition": {
      "name": "sql.embedded.code",
      "begin": "(?i:\\s+SQL\\s+TYPE\\s+IS)",
      "beginCaptures": {
        "0": {
          "name": "keyword.cobol"
        }
      },
      "end": "\\.",
      "endCaptures": {
        "0": {
          "name": "source.cobol"
        }
      }
    },
    "cobol-general-keyword": {
      "match": "(?<![\\-\\w])(?i:ABD|ABORT|ACCEPT|ACCESS|ADATA|ADD|AS|CBLCARD|CO2|COBOL2|CO3|COBOL3|CPSM|DLI|EDF|EXCI|FEPI|NATLANG|NOCBLCARD|NOCPSM|NODEBUG|NOEDF|NOFEPI|NOLENGTH|NOLINKAGE|NOOPTIONS|NOSPIE|OP|OPTIONS|SP|SPIE|SYSEIB|ADDRESS|ADEXIT|ADV|ADVANCING|ADX|AFP|AFTER|ALIAS|ALL|ALLOCATE|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALPHNUM|ALSO|ALTER|ALTERNATE|ANA|ANALIST|AND|ANSI|ANY|APOST|APPLY|AR|ARCH|ARE|AREA|AREAS|ARITH|ASCENDING|ASCII|ASSIGN|ASSOCIATED_DATA|ASSOCIATED_DATA_LENGTH|AT|AUTHOR|AUTO|AVG|AWO|BASIS|BEFORE|BIN|BINARY|BLANK|BLOCK|BLOCK0|BOOLEAN|BOTH|BOTTOM|BUF|BUFSIZE|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CBL|CCSVERSION|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CICS|CLASS|CLEANSIGN|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|CO|CODEPAGE|CODE-SET|COLLATING|COLS|COMMA|COMMITMENT|COMMON|COMP|COMPAT|COMPILE|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|CONFIGURATION|CONTAINS|CONTENT|CONTENT-OF|CONTINUE|CONTROL|CONVERTING|COPYLOC|COPYRIGHT|CORR|CORRESPONDING|COUNT|CP|CPLC|CPYR|CR|CRT|CRUNCH|CS|CURR|CURRENCY|CURSOR|CYCLE|DACO-CONTROL|DATA|DATE|DATEVAL|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DB|DBCS|DEBUG|DEBUGGING|DEC|DECIMAL-POINT|DECK|DECLARATIVES|DEF|DEFAULT|DEFAULT-DISPLAY|DEFINE|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESIGNER|DFHRESP|DFHVALUE|DIAGTRUNC|DISABLE|DISK|DISPLAY|DISPLAY-1|DISPSIGN|DIVIDE|DIVISION|DLL|DN|DOWN|DS|DSN|DSNAME|DTR|DU|DUMP|DUPLICATES|DWARF|DYN|DYNAM|DYNAMIC|EBCDIC|EGCS|EGI|EJECT|EJPD|ELSE|EMA|EMI|EN|ENABLE|ENCODING|END|ENDP|ENDPERIOD|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-INSPECT|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|END-XML|ENGLISH|ENTRY|ENTRY-NAME|ENTRY-INTERFACE|ENVIRONMENT|EOC|EODS|EOP|EQUAL|ERROR|ESCAPE|ESI|EVALUATE|EVENP|EVENPACK|EVERY|EX|EXCEPTION|EXCLUSIVE|EXEC|EXHIBIT|EXIT|EXP|EXPORTALL|EXTEND|EXTERNAL|FALSE|FASTSRT|FD|FIELD|FILED|FILE|FILE-CONTROL|FILL|FILLER|FIND|FIRST|FLAG|FLAGSTD|FNC|FOOTING|FOR|FORMAT|FORCENUMCMP|FROM|FSRT|FULL|FUNCTION|FUNCTION-ID|FUNCTION-POINTER|GENERATE|GET|GIVING|GLOBAL|GO|GOBACK|GREATER|GROUP-USAGE|HEX|HGPR|HIGH-VALUE|HIGH-VALUES|IC|ID|IDENTIFICATION|IF|IMPLICIT|IN|INDEX|INDEXED|INEXIT|INFO|INITCHECK|INITIAL|INITIALIZE|INITIATE|INL|INLINE|INPUT|INPUT-OUTPUT|INSERT|INSPECT|INSTALLATION|INTDATE|INTEGER|INTO|INVALID|INVD|INVDATA|INVMPSZ|INVPARTN|INVREQ|INX|IS|I-O|I-O-CONTROL|JIOP|JAVA64|JAVA-CALLABLE|JAVAIOP|JAVA-SHAREABLE|JA|JAPANESE|JP|JUST|JUSTIFIED|JVMINITOPTIONS|JVMI|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANG|LANGUAGE|LAST|LAX|LAXPERF|LAXREDEF|LAYOUT|LC|LEADING|LEFT|LENGTH|LESS|LIBEXIT|LIBRARY|LIBX|LILIAN|LIMIT|LIN|LINAGE|LINAGE-COUNTER|LINE|LINE-SEQUENTIAL|LINECOUNT|LINES|LINKAGE|LIST|LM|LOCAL|LOCAL-STORAGE|LOCK|LONGMIXED|LONGUPPER|LOW-VALUE|LOW-VALUES|LP|LU|LXPRF|LXRDF|MAP|MAPFAIL|MATCH|MAX|MAXPCF|MD|MDECK|MEMORY|MERGE|MESSAGE|MIG|MIXED|MMDDYYYY|MODE|MODULES|MOVE|MSG|MSGEXIT|MSGX|MULTIPLE|MULTIPLY|NAME|NAMED|NAT|NATIONAL|NATIONAL-EDITED|NATIVE|NC|ND|NEGATIVE|NETWORK|NEXT|NO|NO-POS|NOADATA|NOADEXIT|NOADV|NOADX|NOALIAS|NOALPHNUM|NOAWO|NOBIN|NOBLOCK0|NOC|NOCICS|NOCLEANSIGN|NOCOMPILE|NOCOPYLOC|NOCOPYRIGHT|NOCPLC|NOCPYR|NOCS|NOCURR|NOCURRENCY|NOD|NODBCS|NODECK|NODEF|NODEFINE|NODIAGTRUNC|NODLL|NODSNAME|NODTR|NODU|NODUMP|NODWARF|NODYN|NODYNAM|NOEJPD|NOENDPERIOD|NOEVENPACK|NOEX|NOEXIT|NOEXP|NOEXPORTALL|NOF|NOFASTSRT|NOFLAG|NOFLAGSTD|NOFNC|NOFORCENUMCMP|NOFSRT|NOIC|NOINEXIT|NOINITCHECK|NOINITIAL|NOINL|NOINLINE|NOINVD|NOINVDATA|NOINX|NOJAVA64|NOJAVAIOP|NOJIOP|NOJVMI|NOJVMINITOPTIONS|NOLAXPERF|NOLAXREDEF|NOLIBEXIT|NOLIBX|NOLIST|NOMAP|NOMD|NOMDECK|NOMSGEXIT|NOMSGX|NONAME|NONC|NONUM|NONUMBER|NONUMCHECK|NOOBJ|NOOBJECT|NOOFF|NOOFFSET|NOOMITODOMIN|NOPAC|NOPARMCHECK|NOPC|NOPFD|NOPRESERVE|NOPRTEXIT|NOPRTX|NORENT|NORULES|NOS|NOSEP|NOSEPARATE|NOSEQ|NOSEQUENCE|NOSERV|NOSERVICE|NOSLACKBYTES|NOSO|NOSOURCE|NOSQL|NOSQLC|NOSQLCCSID|NOSQLIMS|NOSSR|NOSSRANGE|NOSTGOPT|NOSUPP|NOSUPPRESS|NOT|NOTERM|NOTERMINAL|NOTEST|NOTHREAD|NOTRUNCBIN|NOUNRA|NOUNREFALL|NOUNREFSOURCE|NOUNRS|NOVBREF|NOVOLATILE|NOWD|NOWORD|NOX|NOXREF|NOZC|NOZLEN|NOZON|NOZONECHECK|NOZWB|NS|NSYMBOL|NULL|NULLS|NUM|NUMBER|NUMCHECK|NUMERIC|NUMERIC-EDITED|NUMPROC|OBJ|OBJECT|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OFFSET|OMITODOMIN|OMITTED|ON|OOM|OPEN|OPT|OPTFILE|OPTIMIZE|OPTIONAL|OR|ORDER|ORDERLY|ORGANIZATION|OTHER|OUT|OUTDD|OUTPATH|OUTPUT|OVERFLOW|OWN|OWNER|PAC|PACKED-DECIMAL|PADDING|PAGE|PARAGRAPH|PARMCHECK|PARSE|PARTNFAIL|PASSWORD|PATH|PC|PERFORM|PFD|PGMN|PGMNAME|PIC|PICTURE|POINTER|POINTER-32|PORT|POSITION|POSITIVE|PRESERVE|PRINTER|PROCEDURE|PROCEDURES|PROCEDURE-POINTER|PROCEED|PROCESS|PROCESSING|PROGRAM|PROGRAM-ID|PROTOTYPE|PRTEXIT|PRTX|PURGE|QUA|QUALIFY|QUOTE|QUOTES|RANDOM|RDATT|READ|READER|READY|RECEIVE|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REFERENCE|REFERENCES|RELATIVE|RELEASE|RELOAD|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|RENT|REPLACE|REPLACING|REPORT|REPORTS|RERUN|RESERVE|RESET|RESUME|RETURN|RETURNING|REVERSED|REWIND|REWRITE|RIGHT|RMODE|ROUNDED|RULES|RUN|SAME|SAVE|SD|SEARCH|SECTION|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEP|SEPARATE|SEQ|SEQUENCE|SEQUENTIAL|SERV|SERVICE|SET|SHORT|SIGN|SIZE|SKIP|SLACKBYTES|SLCKB|SN|SO|SORT|SORT-MERGE|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|SQL|SQLC|SQLCCSID|SQLIMS|SSR|SSRANGE|STANDARD|STANDARD-1|STANDARD-2|START|STATIC|STATS|STATUS|STD|STGOPT|STOP|STRICT|STRING|SUBTRACT|SUCC|SUM|SUPP|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|SYSLIB|TALLYING|TAPE|TABLE|TERM|TERMINAL|TERMINATE|TEST|THAN|THEN|THREAD|THROUGH|THRU|TIME|TIMER|TIMES|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRACE|TRAILING|TRUE|TRUNC|TRUNCBIN|TUNE|UE|UENGLISH|UNDATE|UNEXPIN|UNIT|UNREF|UNSTRING|UNTIL|UP|UPON|UPPER|USAGE|USE|USING|UTF-8|VALIDATING|VALUE|VALUES|VARYING|VBREF|VIRTUAL|VLR|VOLATILE|VOLSER|VS|VSAMOPENFS|WAIT|WARNING|WD|WHEN|WHEN-COMPILED|WITH|WORD|WORDS|WORKING-STORAGE|WRITE|WRITE-ONLY|XML|XMLPARSE|XMLSS|XOPT|XOPTS|XP|XREF|YEAR|YYYYDDD|YYYYMMDD|ZC|ZD|ZERO|ZEROES|ZEROS|ZLEN|ZON|ZONECHECK|ZONEDATA|ZWB|IS|INTRINSIC|REPOSITORY|EPILOG|NOCMPR2|NOTRIG|CPP|DATEPROC|DP|GDS|GRAPHIC|KA|LEASM|LIB|LIN|MARGINS|NODE|NODATEPROC|NODP|NOEPILOG|NOFLAGMIG|NOGRAPHIC|NOLIB|NOOPSEQUENCE|NOOPT|NOOPTIMIZE|NOP|NOPROLOG|NOSTDTRUNC|NSEQ|OP|OPMARGINS|OPSEQUENCE|PROLOG|RES|SZ|TRIG|YEARWINDOW|YW)(?![\\-\\w])",
      "name": "keyword.cobol"
    },
    "cobol-preprocessor-keywords": {
      "match": "(?<![\\-\\w])(?i:CBL|CONTROL|COPY|BY|CR|DB|ENTER|EXEC|FILE|FUNCTION|IDMS|IN|INCLUDE|LEADING|LINKAGE|PROCEDURE|DIVISION|LIST|MAID|MAP|MAP-CONTROL|MODULE|NO|NOLIST|NOMAP|NOSOURCE|OF|OFF|PIC|PICTURE|RECORD|REDEFINES|REPLACING|REPLACE|TITLE|TRAILING|SECTION|SOURCE|SQL|SUPPRESS|VERSION|WORKING-STORAGE|IS)(?![\\-\\w])",
      "name": "keyword.cobol"
    }
  }
}
