7 lines
101 KiB
JavaScript
7 lines
101 KiB
JavaScript
const lang = Object.freeze({ "displayName": "Fortran (Free Form)", "fileTypes": ["f90", "F90", "f95", "F95", "f03", "F03", "f08", "F08", "f18", "F18", "fpp", "FPP", ".pf", ".PF"], "firstLineMatch": "(?i)-[*]- mode: fortran free -[*]-", "injections": { "source.fortran.free - ( string | comment | meta.preprocessor )": { "patterns": [{ "include": "#line-continuation-operator" }, { "include": "#preprocessor" }] }, "string.quoted.double.fortran": { "patterns": [{ "include": "#string-line-continuation-operator" }] }, "string.quoted.single.fortran": { "patterns": [{ "include": "#string-line-continuation-operator" }] } }, "name": "fortran-free-form", "patterns": [{ "include": "#preprocessor" }, { "include": "#comments" }, { "include": "#constants" }, { "include": "#operators" }, { "include": "#array-constructor" }, { "include": "#parentheses" }, { "include": "#include-statement" }, { "include": "#import-statement" }, { "include": "#block-data-definition" }, { "include": "#function-definition" }, { "include": "#module-definition" }, { "include": "#program-definition" }, { "include": "#submodule-definition" }, { "include": "#subroutine-definition" }, { "include": "#procedure-definition" }, { "include": "#derived-type-definition" }, { "include": "#enum-block-construct" }, { "include": "#interface-block-constructs" }, { "include": "#procedure-specification-statement" }, { "include": "#type-specification-statements" }, { "include": "#specification-statements" }, { "include": "#control-constructs" }, { "include": "#control-statements" }, { "include": "#execution-statements" }, { "include": "#intrinsic-functions" }, { "include": "#variable" }], "repository": { "IO-item-list": { "begin": `(?i)(?=\\s*[a-z0-9"'])`, "comment": "Name list.", "contentName": "meta.name-list.fortran", "end": "(?=[\\);!\\n])", "patterns": [{ "include": "#constants" }, { "include": "#operators" }, { "include": "#intrinsic-functions" }, { "include": "#array-constructor" }, { "include": "#parentheses" }, { "include": "#brackets" }, { "include": "#assignment-keyword" }, { "include": "#operator-keyword" }, { "include": "#variable" }] }, "IO-keywords": { "begin": "(?i)\\G\\s*\\b(?:(read)|(write))\\s*(\\()", "beginCaptures": { "1": { "name": "keyword.control.generic-spec.read.fortran" }, "2": { "name": "keyword.control.generic-spec.write.fortran" }, "3": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "IO generic specification.", "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "captures": { "1": { "name": "keyword.control.generic-spec.formatted.fortran" }, "2": { "name": "keyword.control.generic-spec.unformatted.fortran" } }, "match": "(?i)\\G\\s*\\b(?:(formatted)|(unformatted))\\b" }, { "include": "#invalid-word" }] }, "IO-statements": { "patterns": [{ "begin": "(?ix)\\b(?:(backspace)|(close)|(endfile)|(format)|(inquire)|(open)|(read)|(rewind)|(write))\\s*(?=\\()", "beginCaptures": { "1": { "name": "keyword.control.backspace.fortran" }, "2": { "name": "keyword.control.close.fortran" }, "3": { "name": "keyword.control.endfile.fortran" }, "4": { "name": "keyword.control.format.fortran" }, "5": { "name": "keyword.control.inquire.fortran" }, "6": { "name": "keyword.control.open.fortran" }, "7": { "name": "keyword.control.read.fortran" }, "8": { "name": "keyword.control.rewind.fortran" }, "9": { "name": "keyword.control.write.fortran" }, "10": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.statement.IO.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }, { "include": "#IO-item-list" }] }, { "captures": { "1": { "name": "keyword.control.backspace.fortran" }, "2": { "name": "keyword.control.endfile.fortran" }, "3": { "name": "keyword.control.format.fortran" }, "4": { "name": "keyword.control.print.fortran" }, "5": { "name": "keyword.control.read.fortran" }, "6": { "name": "keyword.control.rewind.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "match": "(?i)\\b(?:(backspace)|(endfile)|(format)|(print)|(read)|(rewind))\\b" }, { "begin": "(?i)\\b(?:(flush)|(wait))\\s*(?=\\()", "beginCaptures": { "1": { "name": "keyword.control.flush.fortran" }, "2": { "name": "keyword.control.wait.fortran" }, "3": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "captures": { "1": { "name": "keyword.control.flush.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\b(flush)\\b" }] }, "abstract-attribute": { "captures": { "1": { "name": "storage.modifier.fortran.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\G\\s*\\b(abstract)\\b" }, "abstract-interface-block-construct": { "begin": "(?i)\\b(abstract)\\s+(interface)\\b", "beginCaptures": { "1": { "name": "keyword.other.attribute.fortran.modern" }, "2": { "name": "keyword.control.interface.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "end": "(?i)\\b(end\\s*interface)\\b", "endCaptures": { "1": { "name": "keyword.control.endinterface.fortran.modern" } }, "name": "meta.interface.abstract.fortran", "patterns": [{ "include": "$base" }] }, "access-attribute": { "patterns": [{ "include": "#private-attribute" }, { "include": "#public-attribute" }] }, "allocatable-attribute": { "captures": { "1": { "name": "storage.modifier.allocatable.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": "(?i)\\s*\\b(allocatable)\\b" }, "allocate-statement": { "begin": "(?i)\\b(allocate)\\s*(?=\\()", "beginCaptures": { "1": { "name": "keyword.control.allocate.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.statement.allocate.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "arithmetic-operators": { "captures": { "1": { "name": "keyword.operator.subtraction.fortran" }, "2": { "name": "keyword.operator.addition.fortran" }, "3": { "name": "keyword.operator.division.fortran" }, "4": { "name": "keyword.operator.power.fortran" }, "5": { "name": "keyword.operator.multiplication.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "match": "(\\-)|(\\+)|\\/(?!\\/|\\=|\\\\)|(\\*\\*)|(\\*)" }, "array-constructor": { "begin": "(?=\\s*(\\[|\\(\\/))", "end": "(?<!\\G)", "name": "meta.contructor.array", "patterns": [{ "include": "#brackets" }, { "begin": "\\s*(\\(\\/)", "beginCaptures": { "1": { "name": "punctuation.bracket.left.fortran" } }, "end": "(\\/\\))", "endCaptures": { "1": { "name": "punctuation.bracket.left.fortran" } }, "patterns": [{ "include": "#comments" }, { "include": "#constants" }, { "include": "#operators" }, { "include": "#array-constructor" }, { "include": "#parentheses" }, { "include": "#intrinsic-functions" }, { "include": "#variable" }] }] }, "assign-statement": { "patterns": [{ "begin": "(?i)\\b(assign)\\b", "beginCaptures": { "1": { "name": "keyword.control.assign.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.assign.fortran", "patterns": [{ "captures": { "1": { "name": "keyword.control.to.fortran" } }, "match": "(?i)\\s*\\b(to)\\b" }, { "include": "$base" }] }] }, "assignment-keyword": { "begin": "(?i)\\G\\s*\\b(assignment)\\s*(\\()", "beginCaptures": { "1": { "name": "keyword.control.generic-spec.assignment.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Assignment generic specification.", "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#assignment-operator" }, { "include": "#invalid-word" }] }, "assignment-operator": { "comment": "Introduced in the Fortran 1977 standard.", "match": "(?<!\\/|\\=|\\<|\\>)(\\=)(?!\\=|\\>)", "name": "keyword.operator.assignment.fortran" }, "associate-construct": { "begin": "(?i)\\b(associate)\\b(?=\\s*\\()", "beginCaptures": { "1": { "name": "keyword.control.associate.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "contentName": "meta.block.associate.fortran", "end": "(?i)\\b(end\\s*associate)\\b", "endCaptures": { "1": { "name": "keyword.control.endassociate.fortran" } }, "patterns": [{ "include": "$base" }] }, "asynchronous-attribute": { "captures": { "1": { "name": "storage.modifier.asynchronous.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\G\\s*\\b(asynchronous)\\b" }, "attribute-specification-statement": { "begin": "(?ix)(?=\\b(?:allocatable|asynchronous|contiguous |external|intrinsic|optional|parameter|pointer|private|protected|public|save|target|value|volatile)\\b |(bind|dimension|intent)\\s*\\( |(codimension)\\s*\\[)", "end": "(?=[;!\\n])", "name": "meta.statement.attribute-specification.fortran", "patterns": [{ "include": "#access-attribute" }, { "include": "#allocatable-attribute" }, { "include": "#asynchronous-attribute" }, { "include": "#codimension-attribute" }, { "include": "#contiguous-attribute" }, { "include": "#dimension-attribute" }, { "include": "#external-attribute" }, { "include": "#intent-attribute" }, { "include": "#intrinsic-attribute" }, { "include": "#language-binding-attribute" }, { "include": "#optional-attribute" }, { "include": "#parameter-attribute" }, { "include": "#pointer-attribute" }, { "include": "#protected-attribute" }, { "include": "#save-attribute" }, { "include": "#target-attribute" }, { "include": "#value-attribute" }, { "include": "#volatile-attribute" }, { "begin": "(?=\\s*::)", "comment": "Attribute list.", "contentName": "meta.attribute-list.normal.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "include": "#invalid-word" }] }, { "include": "#name-list" }] }, "block-construct": { "begin": "(?i)\\b(block)\\b(?!\\s*\\bdata\\b)", "beginCaptures": { "1": { "name": "keyword.control.associate.fortran" } }, "comment": "Introduced in the Fortran 2008 standard.", "contentName": "meta.block.block.fortran", "end": "(?i)\\b(end\\s*block)\\b", "endCaptures": { "1": { "name": "keyword.control.endassociate.fortran" } }, "patterns": [{ "include": "$base" }] }, "block-data-definition": { "begin": "(?i)\\b(block\\s*data)\\b(?:\\s+([a-z]\\w*)\\b)?", "beginCaptures": { "1": { "name": "keyword.control.block-data.fortran" }, "2": { "name": "entity.name.block-data.fortran" } }, "end": "(?ix)\\b(?:(end\\s*block\\s*data)(?:\\s+(\\2))?|(end))\\b (?:\\s*(\\S((?!\\n).)*))?", "endCaptures": { "1": { "name": "keyword.control.end-block-data.fortran" }, "2": { "name": "entity.name.block-data.fortran" }, "3": { "name": "keyword.control.end-block-data.fortran" }, "4": { "name": "invalid.error.block-data-definition.fortran" } }, "name": "meta.block-data.fortran", "patterns": [{ "include": "$base" }] }, "brackets": { "begin": "\\s*(\\[)", "beginCaptures": { "1": { "name": "punctuation.bracket.left.fortran" } }, "end": "(\\])", "endCaptures": { "1": { "name": "punctuation.bracket.left.fortran" } }, "patterns": [{ "include": "#comments" }, { "include": "#constants" }, { "include": "#operators" }, { "include": "#array-constructor" }, { "include": "#parentheses" }, { "include": "#intrinsic-functions" }, { "include": "#variable" }] }, "call-statement": { "patterns": [{ "begin": "(?i)\\s*\\b(call)\\b", "beginCaptures": { "1": { "name": "keyword.control.call.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.call.fortran", "patterns": [{ "begin": "(?ix)\\G\\s*([a-z]\\w*)(%)([a-z]\\w*)\\b\\s*(?=\\()", "beginCaptures": { "1": { "name": "variable.other.fortran" }, "2": { "name": "keyword.accessor.fortran" }, "3": { "name": "entity.name.function.subroutine.fortran" } }, "comment": "type-bound subroutines", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "include": "#intrinsic-subroutines" }, { "begin": "(?i)\\G\\s*\\b([a-z]\\w*)\\s*(?=\\()", "beginCaptures": { "1": { "name": "entity.name.function.subroutine.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "User defined subroutine.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "captures": { "1": { "name": "entity.name.function.subroutine.fortran" } }, "comment": "User defined subroutine.", "match": "(?i)\\G\\s*\\b([a-z]\\w*)\\b(?=\\s*[;!\\n])" }, { "include": "$base" }] }] }, "character-type": { "comment": "Introduced in the Fortran 1977 standard.", "patterns": [{ "begin": "(?i)\\b(character)\\s*(?=\\()", "beginCaptures": { "1": { "name": "storage.type.character.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "contentName": "meta.type-spec.fortran", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "captures": { "1": { "name": "storage.type.character.fortran" }, "2": { "name": "keyword.operator.multiplication.fortran" }, "3": { "name": "constant.numeric.fortran" } }, "match": "(?i)\\b(character)\\b(?:\\s*(\\*)\\s*(\\d*))?" }] }, "codimension-attribute": { "begin": "(?i)\\G\\s*\\b(codimension)(?=\\s*\\[)", "beginCaptures": { "1": { "name": "storage.modifier.codimension.fortran" } }, "comment": "Introduced in the Fortran 2008 standard.", "end": "(?<!\\G)", "patterns": [{ "include": "#brackets" }] }, "comments": { "begin": "!", "end": "(?=\\n)", "name": "comment.line.fortran" }, "common-statement": { "begin": "(?i)\\b(common)\\b", "beginCaptures": { "1": { "name": "keyword.control.common.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "$base" }] }, "concurrent-attribute": { "begin": "(?i)\\G\\s*\\b(concurrent)\\b", "beginCaptures": { "1": { "name": "keyword.control.while.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "end": "(?=[;!\\n])", "patterns": [{ "include": "#parentheses" }, { "include": "#invalid-word" }] }, "constants": { "patterns": [{ "include": "#logical-constant" }, { "include": "#numeric-constant" }, { "include": "#string-constant" }] }, "contiguous-attribute": { "captures": { "1": { "name": "storage.modifier.contigous.fortran" } }, "comment": "Introduced in the Fortran 2008 standard.", "match": "(?i)\\G\\s*\\b(contiguous)\\b" }, "continue-statement": { "patterns": [{ "begin": "(?i)\\s*\\b(continue)\\b", "beginCaptures": { "1": { "name": "keyword.control.continue.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.continue.fortran", "patterns": [{ "include": "#invalid-character" }] }] }, "control-constructs": { "patterns": [{ "include": "#named-control-constructs" }, { "include": "#unnamed-control-constructs" }] }, "control-statements": { "comment": "Statements controlling the flow of the program", "patterns": [{ "include": "#assign-statement" }, { "include": "#call-statement" }, { "include": "#continue-statement" }, { "include": "#cycle-statement" }, { "include": "#entry-statement" }, { "include": "#error-stop-statement" }, { "include": "#exit-statement" }, { "include": "#goto-statement" }, { "include": "#pause-statement" }, { "include": "#return-statement" }, { "include": "#stop-statement" }, { "include": "#where-statement" }, { "include": "#image-control-statement" }] }, "cpp-numeric-constant": { "captures": { "0": { "patterns": [{ "begin": "(?=.)", "beginCaptures": {}, "end": "$", "endCaptures": {}, "patterns": [{ "captures": { "1": { "name": "keyword.other.unit.hexadecimal.cpp" }, "2": { "name": "constant.numeric.hexadecimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "3": { "name": "punctuation.separator.constant.numeric.cpp" }, "4": { "name": "constant.numeric.hexadecimal.cpp" }, "5": { "name": "constant.numeric.hexadecimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "6": { "name": "punctuation.separator.constant.numeric.cpp" }, "7": { "name": "keyword.other.unit.exponent.hexadecimal.cpp" }, "8": { "name": "keyword.operator.plus.exponent.hexadecimal.cpp" }, "9": { "name": "keyword.operator.minus.exponent.hexadecimal.cpp" }, "10": { "name": "constant.numeric.exponent.hexadecimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "11": { "name": "keyword.other.unit.suffix.floating-point.cpp" }, "12": { "name": "keyword.other.unit.user-defined.cpp" } }, "match": "(\\G0[xX])([0-9a-fA-F](?:[0-9a-fA-F]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)?((?:(?<=[0-9a-fA-F])\\.|\\.(?=[0-9a-fA-F])))([0-9a-fA-F](?:[0-9a-fA-F]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)?(?:(?<!')([pP])((?:\\+)?)((?:\\-)?)([0-9](?:[0-9]|(?<=[0-9a-fA-F])'(?=[0-9a-fA-F]))*))?([lLfF](?!\\w))?((?:\\w(?<![0-9a-fA-FpP])\\w*)?$)" }, { "captures": { "1": { "name": "constant.numeric.decimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "2": { "name": "punctuation.separator.constant.numeric.cpp" }, "3": { "name": "constant.numeric.decimal.point.cpp" }, "4": { "name": "constant.numeric.decimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "5": { "name": "punctuation.separator.constant.numeric.cpp" }, "6": { "name": "keyword.other.unit.exponent.decimal.cpp" }, "7": { "name": "keyword.operator.plus.exponent.decimal.cpp" }, "8": { "name": "keyword.operator.minus.exponent.decimal.cpp" }, "9": { "name": "constant.numeric.exponent.decimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "10": { "name": "keyword.other.unit.suffix.floating-point.cpp" }, "11": { "name": "keyword.other.unit.user-defined.cpp" } }, "match": "\\G(?=[0-9.])(?!0[xXbB])([0-9](?:[0-9]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)?((?:(?<=[0-9])\\.|\\.(?=[0-9])))([0-9](?:[0-9]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)?(?:(?<!')([eE])((?:\\+)?)((?:\\-)?)([0-9](?:[0-9]|(?<=[0-9a-fA-F])'(?=[0-9a-fA-F]))*))?([lLfF](?!\\w))?((?:\\w(?<![0-9eE])\\w*)?$)" }, { "captures": { "1": { "name": "keyword.other.unit.binary.cpp" }, "2": { "name": "constant.numeric.binary.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "3": { "name": "punctuation.separator.constant.numeric.cpp" }, "4": { "name": "keyword.other.unit.suffix.integer.cpp" }, "5": { "name": "keyword.other.unit.user-defined.cpp" } }, "match": "(\\G0[bB])([01](?:[01]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)((?:[uU]|(?:[uU]ll?)|(?:[uU]LL?)|(?:ll?[uU]?)|(?:LL?[uU]?)|[fF])(?!\\w))?((?:\\w(?<![0-9])\\w*)?$)" }, { "captures": { "1": { "name": "keyword.other.unit.octal.cpp" }, "2": { "name": "constant.numeric.octal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "3": { "name": "punctuation.separator.constant.numeric.cpp" }, "4": { "name": "keyword.other.unit.suffix.integer.cpp" }, "5": { "name": "keyword.other.unit.user-defined.cpp" } }, "match": "(\\G0)((?:[0-7]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))+)((?:[uU]|(?:[uU]ll?)|(?:[uU]LL?)|(?:ll?[uU]?)|(?:LL?[uU]?)|[fF])(?!\\w))?((?:\\w(?<![0-9])\\w*)?$)" }, { "captures": { "1": { "name": "keyword.other.unit.hexadecimal.cpp" }, "2": { "name": "constant.numeric.hexadecimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "3": { "name": "punctuation.separator.constant.numeric.cpp" }, "4": { "name": "keyword.other.unit.exponent.hexadecimal.cpp" }, "5": { "name": "keyword.operator.plus.exponent.hexadecimal.cpp" }, "6": { "name": "keyword.operator.minus.exponent.hexadecimal.cpp" }, "7": { "name": "constant.numeric.exponent.hexadecimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "8": { "name": "keyword.other.unit.suffix.integer.cpp" }, "9": { "name": "keyword.other.unit.user-defined.cpp" } }, "match": "(\\G0[xX])([0-9a-fA-F](?:[0-9a-fA-F]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)(?:(?<!')([pP])((?:\\+)?)((?:\\-)?)([0-9](?:[0-9]|(?<=[0-9a-fA-F])'(?=[0-9a-fA-F]))*))?((?:[uU]|(?:[uU]ll?)|(?:[uU]LL?)|(?:ll?[uU]?)|(?:LL?[uU]?)|[fF])(?!\\w))?((?:\\w(?<![0-9a-fA-FpP])\\w*)?$)" }, { "captures": { "1": { "name": "constant.numeric.decimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "2": { "name": "punctuation.separator.constant.numeric.cpp" }, "3": { "name": "keyword.other.unit.exponent.decimal.cpp" }, "4": { "name": "keyword.operator.plus.exponent.decimal.cpp" }, "5": { "name": "keyword.operator.minus.exponent.decimal.cpp" }, "6": { "name": "constant.numeric.exponent.decimal.cpp", "patterns": [{ "match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])", "name": "punctuation.separator.constant.numeric.cpp" }] }, "7": { "name": "keyword.other.unit.suffix.integer.cpp" }, "8": { "name": "keyword.other.unit.user-defined.cpp" } }, "match": "\\G(?=[0-9.])(?!0[xXbB])([0-9](?:[0-9]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)(?:(?<!')([eE])((?:\\+)?)((?:\\-)?)([0-9](?:[0-9]|(?<=[0-9a-fA-F])'(?=[0-9a-fA-F]))*))?((?:[uU]|(?:[uU]ll?)|(?:[uU]LL?)|(?:ll?[uU]?)|(?:LL?[uU]?)|[fF])(?!\\w))?((?:\\w(?<![0-9eE])\\w*)?$)" }, { "match": "(?:(?:[0-9a-zA-Z_\\.]|')|(?<=[eEpP])[+-])+", "name": "invalid.illegal.constant.numeric.cpp" }] }] } }, "match": "(?<!\\w)\\.?\\d(?:(?:[0-9a-zA-Z_\\.]|')|(?<=[eEpP])[+-])*" }, "critical-construct": { "begin": "(?i)\\b(critical)\\b", "beginCaptures": { "1": { "name": "keyword.control.associate.fortran" } }, "comment": "Introduced in the Fortran 2008 standard.", "contentName": "meta.block.critical.fortran", "end": "(?i)\\b(end\\s*critical)\\b", "endCaptures": { "1": { "name": "keyword.control.endassociate.fortran" } }, "patterns": [{ "include": "$base" }] }, "cycle-statement": { "patterns": [{ "begin": "(?i)\\s*\\b(cycle)\\b", "beginCaptures": { "1": { "name": "keyword.control.cycle.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.fortran", "patterns": [] }] }, "data-statement": { "begin": "(?i)\\b(data)\\b", "beginCaptures": { "1": { "name": "keyword.control.data.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "$base" }] }, "deallocate-statement": { "begin": "(?i)\\b(deallocate)\\s*(?=\\()", "beginCaptures": { "1": { "name": "keyword.control.deallocate.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.statement.deallocate.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "deferred-attribute": { "captures": { "1": { "name": "storage.modifier.deferred.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\s*\\b(deferred)\\b" }, "derived-type": { "begin": "(?i)\\b(?:(class)|(type))\\s*(\\()\\s*(([a-z]\\w*)|\\*)", "beginCaptures": { "1": { "name": "storage.type.class.fortran" }, "2": { "name": "storage.type.type.fortran" }, "3": { "name": "punctuation.parentheses.left.fortran" }, "4": { "name": "entity.name.type.fortran" } }, "comment": "Introduced in the Fortran 1995 standard.", "contentName": "meta.type-spec.fortran", "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.specification.type.derived.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "derived-type-component-attribute-specification": { "begin": "(?i)(?=\\s*\\b(?:private|sequence)\\b)", "comment": "Introduced in the Fortran 1995 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.attribute-specification.fortran", "patterns": [{ "include": "#access-attribute" }, { "include": "#sequence-attribute" }, { "include": "#invalid-character" }] }, "derived-type-component-parameter-specification": { "captures": { "1": { "name": "storage.type.integer.fortran" }, "2": { "name": "punctuation.comma.fortran" }, "3": { "name": "keyword.other.attribute.derived-type.parameter.fortran" }, "4": { "name": "keyword.operator.double-colon.fortran" }, "5": { "name": "entity.name.derived-type.parameter.fortran" } }, "comment": "Derived type parameter.", "match": "(?ix)\\b(integer)\\s*(,)\\s*(kind|len)\\s*(?:(::)\\s*([a-z]\\w*)?)?\\s*(?=[;!\\n])" }, "derived-type-component-procedure-specification": { "begin": "(?i)(?=\\b(?:procedure)\\b)", "comment": "Introduced in the Fortran 2003 standard.", "end": "(?=[;!\\n])", "name": "meta.specification.procedure.fortran", "patterns": [{ "include": "#procedure-type" }, { "begin": "(?=\\s*(,|::|\\())", "comment": "Attribute list.", "contentName": "meta.attribute-list.derived-type-component-procedure.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "begin": "(,)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[,;!\\n])", "patterns": [{ "include": "#access-attribute" }, { "include": "#pass-attribute" }, { "include": "#nopass-attribute" }, { "include": "#invalid-word" }, { "include": "#pointer-attribute" }] }] }, { "include": "#procedure-name-list" }] }, "derived-type-component-type-specification": { "begin": `(?ix)(?=\\b(?:character|class|complex|double\\s*precision|double\\s*complex|integer|logical|real|type)\\b(?![^:'";!\\n]*\\bfunction\\b))`, "comment": "Introduced in the Fortran 1995 standard.", "end": "(?=[;!\\n])", "name": "meta.specification.derived-type.fortran", "patterns": [{ "include": "#types" }, { "include": "#line-continuation-operator" }, { "begin": "(?=\\s*(,|::))", "comment": "Attribute list.", "contentName": "meta.attribute-list.derived-type-component-type.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "begin": "(,)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[,;!\\n])", "patterns": [{ "include": "#access-attribute" }, { "include": "#allocatable-attribute" }, { "include": "#codimension-attribute" }, { "include": "#contiguous-attribute" }, { "include": "#dimension-attribute" }, { "include": "#pointer-attribute" }, { "include": "#invalid-word" }] }] }, { "include": "#name-list" }] }, "derived-type-contains-attribute-specification": { "begin": "(?i)(?=\\b(?:private)\\b)", "comment": "Introduced in the Fortran 1995 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.attribute-specification.fortran", "patterns": [{ "include": "#access-attribute" }, { "include": "#invalid-character" }] }, "derived-type-contains-final-procedure-specification": { "begin": "(?i)\\b(final)\\b", "beginCaptures": { "1": { "name": "storage.type.final-procedure.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "end": "(?=[;!\\n])", "name": "meta.specification.procedure.final.fortran", "patterns": [{ "begin": "(?=\\s*(::))", "comment": "Attribute list.", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "name": "meta.attribute-list.derived-type-contains-final-procedure.fortran", "patterns": [{ "include": "#invalid-word" }] }, { "include": "#procedure-name" }] }, "derived-type-contains-generic-procedure-specification": { "begin": "(?i)\\b(generic)\\b", "beginCaptures": { "1": { "name": "storage.type.procedure.generic.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "end": "(?=[;!\\n])", "name": "meta.specification.procedure.generic.fortran", "patterns": [{ "begin": "(?=\\s*(,|::|\\())", "comment": "Attribute list.", "contentName": "meta.attribute-list.derived-type-contains-generic-procedure.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "begin": "(,)|^|(?<=&)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[,&;!\\n])", "patterns": [{ "include": "#access-attribute" }, { "include": "#invalid-word" }] }] }, { "begin": "(?=\\s*[a-z])", "comment": "Name list.", "contentName": "meta.name-list.fortran", "end": "(?=[;!\\n])", "patterns": [{ "include": "#IO-keywords" }, { "include": "#assignment-keyword" }, { "include": "#operator-keyword" }, { "include": "#procedure-name" }, { "include": "#pointer-operators" }] }] }, "derived-type-contains-procedure-specification": { "begin": "(?i)(?=\\b(?:procedure)\\b)", "comment": "Introduced in the Fortran 2003 standard.", "end": "(?=[;!\\n])", "name": "meta.specification.procedure.fortran", "patterns": [{ "include": "#procedure-type" }, { "begin": "(?=\\s*(,|::|\\())", "comment": "Attribute list.", "contentName": "meta.attribute-list.derived-type-contains-procedure.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "begin": "(,)|^|(?<=&)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[,&;!\\n])", "name": "meta.something.fortran", "patterns": [{ "include": "#access-attribute" }, { "include": "#deferred-attribute" }, { "include": "#non-overridable-attribute" }, { "include": "#nopass-attribute" }, { "include": "#pass-attribute" }, { "include": "#invalid-word" }] }] }, { "include": "#procedure-name-list" }] }, "derived-type-definition": { "begin": "(?i)\\b(type)\\b(?!\\s*(\\(|is\\b|\\=))", "beginCaptures": { "1": { "name": "keyword.control.type.fortran" } }, "end": "(?=[;!\\n])", "name": "meta.derived-type.definition.fortran", "patterns": [{ "begin": "\\G(?=\\s*(,|::))", "comment": "Attribute list.", "contentName": "meta.attribute-list.derived-type.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "begin": "(,)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[,;!\\n])", "patterns": [{ "include": "#access-attribute" }, { "include": "#abstract-attribute" }, { "include": "#language-binding-attribute" }, { "include": "#extends-attribute" }, { "include": "#invalid-word" }] }] }, { "begin": "(?i)\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.type.fortran" } }, "end": "(?i)(?:^|(?<=;))\\s*(end\\s*type)(?:\\s+(?:(\\1)|(\\w+)))?\\b", "endCaptures": { "1": { "name": "keyword.control.endtype.fortran" }, "2": { "name": "entity.name.type.fortran" }, "3": { "name": "invalid.error.derived-type.fortran" } }, "patterns": [{ "include": "#dummy-variable-list" }, { "include": "#comments" }, { "begin": "(?i)^(?!\\s*\\b(?:contains|end\\s*type)\\b)", "comment": "Derived type specification block.", "end": "(?i)^(?=\\s*\\b(?:contains|end\\s*type)\\b)", "name": "meta.block.specification.derived-type.fortran", "patterns": [{ "include": "#comments" }, { "include": "#derived-type-component-attribute-specification" }, { "include": "#derived-type-component-parameter-specification" }, { "include": "#derived-type-component-procedure-specification" }, { "include": "#derived-type-component-type-specification" }] }, { "begin": "(?i)\\b(contains)\\b", "beginCaptures": { "1": { "name": "keyword.control.contains.fortran" } }, "comment": "Derived type contains block.", "end": "(?i)(?=\\s*end\\s*type\\b)", "name": "meta.block.contains.fortran", "patterns": [{ "include": "#comments" }, { "include": "#derived-type-contains-attribute-specification" }, { "include": "#derived-type-contains-final-procedure-specification" }, { "include": "#derived-type-contains-generic-procedure-specification" }, { "include": "#derived-type-contains-procedure-specification" }] }] }] }, "derived-type-operators": { "captures": { "1": { "name": "keyword.other.selector.fortran" } }, "comment": "Introduced in the Fortran 1995 standard.", "match": "\\s*(\\%)" }, "dimension-attribute": { "begin": "(?i)\\s*\\b(dimension)(?=\\s*\\()", "beginCaptures": { "1": { "name": "storage.modifier.dimension.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?<!\\G)", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "do-construct": { "patterns": [{ "captures": { "1": { "name": "keyword.control.enddo.fortran" } }, "match": "(?i)\\b(end\\s*do)\\b" }, { "begin": "(?i)\\b(do)\\s+(\\d{1,5})", "beginCaptures": { "1": { "name": "keyword.control.do.fortran" }, "2": { "name": "constant.numeric.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?i)(?:^|(?<=;))(?=\\s*\\b\\2\\b)", "name": "meta.do.labeled.fortran", "patterns": [{ "begin": "(?i)\\G(?:\\s*(,)|(?!\\s*[;!\\n]))", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "comment": "Loop control.", "end": "(?=[;!\\n])", "patterns": [{ "include": "#concurrent-attribute" }, { "include": "#while-attribute" }, { "include": "$base" }] }, { "include": "$base" }] }, { "begin": "(?i)\\b(do)\\b", "beginCaptures": { "1": { "name": "keyword.control.do.fortran" } }, "comment": "Introduced in the Fortran 1995 standard.", "end": "(?i)\\b(?:(continue)|(end\\s*do))\\b", "endCaptures": { "1": { "name": "keyword.control.continue.fortran" }, "2": { "name": "keyword.control.enddo.fortran" } }, "name": "meta.block.do.unlabeled.fortran", "patterns": [{ "begin": "(?i)\\G(?:\\s*(,)|(?!\\s*[;!\\n]))", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "comment": "Loop control.", "end": "(?=[;!\\n])", "name": "meta.loop-control.fortran", "patterns": [{ "include": "#concurrent-attribute" }, { "include": "#while-attribute" }, { "include": "$base" }] }, { "begin": "(?i)(?!\\s*\\b(continue|end\\s*do)\\b)", "comment": "Loop body.", "end": "(?i)(?=\\s*\\b(continue|end\\s*do)\\b)", "patterns": [{ "include": "$base" }] }] }] }, "dummy-variable": { "captures": { "1": { "name": "variable.parameter.fortran" } }, "comment": "dummy variable", "match": "(?i)(?:^|(?<=[&,\\(]))\\s*([a-z]\\w*)" }, "dummy-variable-list": { "begin": "\\G\\s*(\\()", "beginCaptures": { "1": { "name": "punctuation.definition.parameters.begin.fortran" } }, "end": "\\)|(?=\\n)", "endCaptures": { "0": { "name": "punctuation.definition.parameters.end.fortran" } }, "name": "meta.dummy-variable-list", "patterns": [{ "include": "#dummy-variable" }] }, "elemental-attribute": { "captures": { "1": { "name": "storage.modifier.elemental.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": "(?i)\\s*\\b(elemental)\\b" }, "entry-statement": { "patterns": [{ "begin": "(?i)\\s*\\b(entry)\\b", "beginCaptures": { "1": { "name": "keyword.control.entry.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.entry.fortran", "patterns": [{ "begin": "(?i)\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.function.entry.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "#dummy-variable-list" }, { "include": "#result-statement" }, { "include": "#language-binding-attribute" }] }] }] }, "enum-block-construct": { "begin": "(?i)\\b(enum)\\b", "beginCaptures": { "1": { "name": "keyword.control.enum.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "end": "(?i)\\b(end\\s*enum)\\b", "endCaptures": { "1": { "name": "keyword.control.end-enum.fortran" } }, "name": "meta.enum.fortran", "patterns": [{ "begin": "\\G\\s*(,)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "#language-binding-attribute" }, { "include": "#invalid-word" }] }, { "begin": "(?i)(?!\\s*\\b(end\\s*enum)\\b)", "end": "(?i)(?=\\b(end\\s*enum)\\b)", "name": "meta.block.specification.enum.fortran", "patterns": [{ "include": "#comments" }, { "begin": "(?ix)\\b(enumerator)\\b", "beginCaptures": { "1": { "name": "keyword.other.enumerator.fortran" } }, "end": "(?=[;!\\n])", "name": "meta.statement.enumerator-specification.fortran", "patterns": [{ "begin": "(?=\\s*(,|::))", "comment": "Attribute list.", "contentName": "meta.attribute-list.enum.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "include": "#invalid-word" }] }, { "include": "#comments" }, { "include": "#name-list" }] }] }] }, "equivalence-statement": { "begin": "(?i)\\b(equivalence)\\b", "beginCaptures": { "1": { "name": "keyword.control.common.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "begin": "(?:\\G|(,))", "beginCaptures": { "1": { "name": "puntuation.comma.fortran" } }, "end": "(?=[,;!\\n])", "patterns": [{ "include": "#parentheses-dummy-variables" }] }] }, "error-stop-statement": { "begin": "(?i)\\s*\\b(error\\s+stop)\\b", "beginCaptures": { "1": { "name": "keyword.control.errorstop.fortran" } }, "comment": "Introduced in the Fortran 2008 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.errorstop.fortran", "patterns": [{ "include": "#constants" }, { "include": "#string-operators" }, { "include": "#variable" }, { "include": "#invalid-character" }] }, "event-statement": { "begin": "(?i)\\b(event post|event wait)\\s*(?=\\()", "beginCaptures": { "1": { "name": "keyword.control.event.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 2018 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.statement.event.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "execution-statements": { "patterns": [{ "include": "#allocate-statement" }, { "include": "#deallocate-statement" }, { "include": "#IO-statements" }, { "include": "#nullify-statement" }] }, "exit-statement": { "begin": "(?i)\\s*\\b(exit)\\b", "beginCaptures": { "1": { "name": "keyword.control.exit.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.exit.fortran", "patterns": [] }, "explicit-interface-block-construct": { "begin": "(?i)\\b(interface)\\b(?=\\s*[;!\\n])", "beginCaptures": { "1": { "name": "keyword.control.interface.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?i)\\b(end\\s*interface)\\b", "endCaptures": { "1": { "name": "keyword.control.endinterface.fortran.modern" } }, "name": "meta.interface.explicit.fortran", "patterns": [{ "include": "$base" }] }, "extends-attribute": { "begin": "(?i)\\s*\\b(extends)\\s*\\(", "beginCaptures": { "1": { "name": "storage.modifier.extends.fortran" } }, "end": "(?:\\)|(?=\\n))", "patterns": [{ "match": "(?i)\\s*\\b([a-z]\\w*)\\b", "name": "entity.name.type.fortran" }] }, "external-attribute": { "captures": { "1": { "name": "storage.modifier.external.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "match": "(?i)\\s*\\b(external)\\b" }, "fail-image-statement": { "captures": { "1": { "name": "keyword.control.fail-image.fortran" } }, "comment": "Introduced in the Fortran 2018 standard.", "match": "\\b(fail image)\\b", "name": "meta.statement.fail-image.fortran" }, "forall-construct": { "applyEndPatternLast": 1, "begin": "(?i)\\b(forall)\\b", "beginCaptures": { "1": { "name": "keyword.control.forall.fortran" } }, "comment": "Introduced in the Fortran 1995 standard.", "end": "(?<!\\G)", "patterns": [{ "begin": "(?i)\\G(?!\\s*[;!\\n])", "comment": "Loop control.", "end": "(?<!\\G)", "name": "meta.loop-control.fortran", "patterns": [{ "include": "#parentheses" }, { "include": "#invalid-word" }] }, { "begin": "(?<=\\))(?=\\s*[;!\\n])", "end": "(?i)\\b(end\\s*forall)\\b", "endCaptures": { "1": { "name": "keyword.control.endforall.fortran" } }, "name": "meta.block.forall.fortran", "patterns": [{ "include": "$base" }] }, { "begin": "(?i)(?<=\\))(?!\\s*[;!\\n])", "end": "\\n", "name": "meta.statement.control.forall.fortran", "patterns": [{ "include": "$base" }] }] }, "form-team-statement": { "begin": "(?i)\\b(form team)\\s*(?=\\()", "beginCaptures": { "1": { "name": "keyword.control.form-team.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 2018 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.statement.form-team.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "function-definition": { "begin": `(?i)(?=([^:'";!\\n](?!\\bend)(?!\\bsubroutine\\b))*\\bfunction\\b)`, "comment": "Function program unit. Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.function.fortran", "patterns": [{ "begin": "(?i)(?=\\G\\s*(?!\\bfunction\\b))", "comment": "Function attribute list.", "end": "(?i)(?=\\bfunction\\b)", "name": "meta.attribute-list.function.fortran", "patterns": [{ "include": "#elemental-attribute" }, { "include": "#module-attribute" }, { "include": "#pure-attribute" }, { "include": "#recursive-attribute" }, { "include": "#types" }, { "include": "#invalid-word" }] }, { "begin": "(?i)\\b(function)\\b", "beginCaptures": { "1": { "name": "keyword.other.function.fortran" } }, "comment": "Captures the function keyword", "end": "(?=[;!\\n])", "patterns": [{ "begin": "(?i)\\G\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.function.fortran" } }, "comment": "Function body.", "end": "(?ix)\\s*\\b(?:(end\\s*function)(?:\\s+([a-z_]\\w*))?|(end))\\b \\s*([^;!\\n]+)?(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.other.endfunction.fortran" }, "2": { "name": "entity.name.function.fortran" }, "3": { "name": "keyword.other.endfunction.fortran" }, "4": { "name": "invalid.error.function.fortran" } }, "patterns": [{ "begin": "\\G(?!\\s*[;!\\n])", "comment": "Rest of the first line in function construct.", "end": "(?=[;!\\n])", "name": "meta.function.first-line.fortran", "patterns": [{ "include": "#dummy-variable-list" }, { "include": "#result-statement" }, { "include": "#language-binding-attribute" }] }, { "begin": "(?i)(?!\\b(?:end\\s*[;!\\n]|end\\s*function\\b))", "comment": "Specification and execution block.", "end": "(?i)(?=\\b(?:end\\s*[;!\\n]|end\\s*function\\b))", "name": "meta.block.specification.function.fortran", "patterns": [{ "begin": "(?i)\\b(contains)\\b", "beginCaptures": { "1": { "name": "keyword.control.contains.fortran" } }, "comment": "Contains block.", "end": "(?i)(?=(?:end\\s*[;!\\n]|end\\s*function\\b))", "name": "meta.block.contains.fortran", "patterns": [{ "include": "$base" }] }, { "include": "$base" }] }] }] }] }, "generic-interface-block-construct": { "begin": "(?i)\\b(interface)\\b", "beginCaptures": { "1": { "name": "keyword.control.interface.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "name": "meta.interface.generic.fortran", "patterns": [{ "begin": "(?ix)\\G\\s*\\b(assignment)\\s* (\\()\\s*(?:(\\=)|(\\S.*))\\s*(\\))", "beginCaptures": { "1": { "name": "keyword.other.assignment.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" }, "3": { "name": "keyword.operator.assignment.fortran" }, "4": { "name": "invalid.error.generic-interface.fortran" }, "5": { "name": "punctuation.parentheses.right.fortran" } }, "comment": "Assignment generic interface.", "end": "(?ix)\\b(end\\s*interface)\\b (?:\\s*\\b(\\1)\\b\\s*(\\()\\s*(?:(\\3)|(\\S.*))\\s*(\\)))?", "endCaptures": { "1": { "name": "keyword.control.endinterface.fortran" }, "2": { "name": "keyword.other.assignment.fortran" }, "3": { "name": "punctuation.parentheses.left.fortran" }, "4": { "name": "keyword.operator.assignment.fortran" }, "5": { "name": "invalid.error.generic-interface-end.fortran" }, "6": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#interface-procedure-statement" }, { "include": "$base" }] }, { "begin": "(?ix)\\G\\s*\\b(operator)\\s* (\\()\\s*(?: (\\.[a-z]+\\.|\\=\\=|\\/\\=|\\>\\=|\\>|\\<|\\<\\=|\\-|\\+|\\/|\\/\\/|\\*\\*|\\*) |(\\S.*) )\\s*(\\))", "beginCaptures": { "1": { "name": "keyword.other.operator.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" }, "3": { "name": "keyword.operator.fortran" }, "4": { "name": "invalid.error.generic-interface-block-op.fortran" }, "5": { "name": "punctuation.parentheses.right.fortran" } }, "comment": "Operator generic interface.", "end": "(?ix)\\b(end\\s*interface)\\b (?:\\s*\\b(\\1)\\b\\s*(\\()\\s*(?:(\\3)|(\\S.*))\\s*(\\)))?", "endCaptures": { "1": { "name": "keyword.control.endinterface.fortran" }, "2": { "name": "keyword.other.operator.fortran" }, "3": { "name": "punctuation.parentheses.left.fortran" }, "4": { "name": "keyword.operator.fortran" }, "5": { "name": "invalid.error.generic-interface-block-op-end.fortran" }, "6": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#interface-procedure-statement" }, { "include": "$base" }] }, { "begin": "(?ix)\\G\\s*\\b(?:(read)|(write))\\s* (\\()\\s*(?:(formatted)|(unformatted)|(\\S.*))\\s*(\\))", "beginCaptures": { "1": { "name": "keyword.other.read.fortran" }, "2": { "name": "keyword.other.write.fortran" }, "3": { "name": "punctuation.parentheses.left.fortran" }, "4": { "name": "keyword.other.formatted.fortran" }, "5": { "name": "keyword.other.unformatted.fortran" }, "6": { "name": "invalid.error.generic-interface-block.fortran" }, "7": { "name": "punctuation.parentheses.right.fortran" } }, "comment": "Read/Write generic interface.", "end": "(?ix)\\b(end\\s*interface)\\b(?:\\s*\\b(?:(\\2)|(\\3))\\b\\s* (\\()\\s*(?:(\\4)|(\\5)|(\\S.*))\\s*(\\)))?", "endCaptures": { "1": { "name": "keyword.control.endinterface.fortran" }, "2": { "name": "keyword.other.read.fortran" }, "3": { "name": "keyword.other.write.fortran" }, "4": { "name": "punctuation.parentheses.left.fortran" }, "5": { "name": "keyword.other.formatted.fortran" }, "6": { "name": "keyword.other.unformatted.fortran" }, "7": { "name": "invalid.error.generic-interface-block-end.fortran" }, "8": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#interface-procedure-statement" }, { "include": "$base" }] }, { "begin": "(?i)\\G\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.function.fortran" } }, "comment": "Generic interface.", "end": "(?i)\\b(end\\s*interface)\\b(?:\\s*\\b(\\1)\\b)?", "endCaptures": { "1": { "name": "keyword.control.endinterface.fortran" }, "2": { "name": "entity.name.function.fortran" } }, "patterns": [{ "include": "#interface-procedure-statement" }, { "include": "$base" }] }] }, "goto-statement": { "begin": "(?i)\\s*\\b(go\\s*to)\\b", "beginCaptures": { "1": { "name": "keyword.control.goto.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.goto.fortran", "patterns": [{ "include": "$base" }] }, "if-construct": { "patterns": [{ "begin": "(?i)\\b(if)\\b", "beginCaptures": { "1": { "name": "keyword.control.if.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "#logical-control-expression" }, { "begin": "(?i)\\s*\\b(then)\\b", "beginCaptures": { "1": { "name": "keyword.control.then.fortran" } }, "contentName": "meta.block.if.fortran", "end": "(?i)\\b(end\\s*if)\\b", "endCaptures": { "1": { "name": "keyword.control.endif.fortran" } }, "patterns": [{ "begin": "(?i)\\b(else\\s*if)\\b", "beginCaptures": { "1": { "name": "keyword.control.elseif.fortran" } }, "comment": "else if statement", "end": "(?=[;!\\n])", "patterns": [{ "include": "#parentheses" }, { "captures": { "1": { "name": "keyword.control.then.fortran" }, "2": { "name": "meta.label.elseif.fortran" } }, "comment": "capture the label if present", "match": "(?i)\\b(then)\\b(\\s*[a-z]\\w*)?" }, { "include": "#invalid-word" }] }, { "begin": "(?i)\\b(else)\\b", "beginCaptures": { "1": { "name": "keyword.control.else.fortran" } }, "comment": "else block", "end": "(?i)(?=\\b(end\\s*if)\\b)", "patterns": [{ "begin": "(?!(\\s*(;|!|\\n)))", "comment": "rest of else line", "end": "(?=[;!\\n])", "patterns": [{ "captures": { "1": { "name": "meta.label.else.fortran" }, "2": { "name": "invalid.error.label.else.fortran" } }, "comment": "capture the label if present", "match": "\\s*([a-z]\\w*)?\\s*\\b(\\w*)\\b" }, { "include": "#invalid-word" }] }, { "begin": "(?i)(?!\\b(end\\s*if)\\b)", "end": "(?i)(?=\\b(end\\s*if)\\b)", "patterns": [{ "include": "$base" }] }] }, { "include": "$base" }] }, { "begin": "(?i)(?=\\s*[a-z])", "end": "(?=[;!\\n])", "name": "meta.statement.control.if.fortran", "patterns": [{ "include": "$base" }] }] }] }, "image-control-statement": { "patterns": [{ "include": "#sync-all-statement" }, { "include": "#sync-statement" }, { "include": "#event-statement" }, { "include": "#form-team-statement" }, { "include": "#fail-image-statement" }] }, "implicit-statement": { "begin": "(?i)\\b(implicit)\\b", "beginCaptures": { "1": { "name": "keyword.other.implicit.fortran" } }, "end": "(?=[;!\\n])", "name": "meta.statement.implicit.fortran", "patterns": [{ "captures": { "1": { "name": "keyword.other.none.fortran" } }, "match": "(?i)\\s*\\b(none)\\b" }, { "include": "$base" }] }, "import-statement": { "begin": "(?i)\\b(import)\\b", "beginCaptures": { "1": { "name": "keyword.control.include.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.include.fortran", "patterns": [{ "begin": "(?i)\\G\\s*(?:(::)|(?=[a-z]))", "beginCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "#name-list" }] }, { "begin": "\\G\\s*(,)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "captures": { "1": { "name": "keyword.other.all.fortran" } }, "match": "(?i)\\G\\s*\\b(all)\\b" }, { "captures": { "1": { "name": "keyword.other.none.fortran" } }, "match": "(?i)\\G\\s*\\b(none)\\b" }, { "begin": "(?i)\\G\\s*\\b(only)\\s*(:)", "beginCaptures": { "1": { "name": "keyword.other.only.fortran" }, "2": { "name": "keyword.other.colon.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "#name-list" }] }, { "include": "#invalid-word" }] }] }, "include-statement": { "begin": "(?i)\\b(include)\\b", "beginCaptures": { "1": { "name": "keyword.control.include.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.include.fortran", "patterns": [{ "include": "#string-constant" }, { "include": "#invalid-character" }] }, "intent-attribute": { "begin": "(?i)\\s*\\b(intent)\\s*(\\()", "beginCaptures": { "1": { "name": "storage.modifier.intent.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(\\))|(?=[;!\\n])", "endCaptures": { "1": { "name": "punctuation.parentheses.left.fortran" } }, "patterns": [{ "captures": { "1": { "name": "storage.modifier.intent.in-out.fortran" }, "2": { "name": "storage.modifier.intent.in.fortran" }, "3": { "name": "storage.modifier.intent.out.fortran" } }, "match": "(?i)\\b(?:(in\\s*out)|(in)|(out))\\b" }, { "include": "#invalid-word" }] }, "interface-block-constructs": { "patterns": [{ "include": "#abstract-interface-block-construct" }, { "include": "#explicit-interface-block-construct" }, { "include": "#generic-interface-block-construct" }] }, "interface-procedure-statement": { "begin": `(?i)(?=[^'";!\\n]*\\bprocedure\\b)`, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.procedure.fortran", "patterns": [{ "begin": "(?i)(?=\\G\\s*(?!\\bprocedure\\b))", "comment": "Attribute list.", "end": "(?i)(?=\\bprocedure\\b)", "name": "meta.attribute-list.interface.fortran", "patterns": [{ "include": "#module-attribute" }, { "include": "#invalid-word" }] }, { "begin": "(?i)\\s*\\b(procedure)\\b", "beginCaptures": { "1": { "name": "keyword.other.procedure.fortran" } }, "comment": "Procedure statement.", "end": "(?=[;!\\n])", "patterns": [{ "captures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "match": "\\G\\s*(::)" }, { "include": "#procedure-name-list" }] }] }, "intrinsic-attribute": { "captures": { "1": { "name": "storage.modifier.intrinsic.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "match": "(?i)\\s*\\b(intrinsic)\\b" }, "intrinsic-functions": { "patterns": [{ "begin": "(?ix)\\b(acosh|asinh|atanh|bge|bgt|ble|blt|dshiftl|dshiftr| findloc|hypot|iall|iany|image_index|iparity|is_contiguous|lcobound| leadz|mask[lr]|merge_bits|norm2|num_images|parity|popcnt|poppar| shift[alr]|storage_size|this_image|trailz|ucobound)\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Intrinsic functions introduced in the Fortran 2008 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b(bessel_[jy][01n]|erf(c(_scaled)?)?|gamma|log_gamma)\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Functions accessable through the intrinsic FORTRAN_SPECIAL_FUNCTIONS module. Introduced in the Fortran 2008 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b(command_argument_count|extends_type_of|is_iostat_end| is_iostat_eor|new_line|same_type_as|selected_char_kind)\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Intrinsic functions introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b(ieee_( class|copy_sign|is_(finite|nan|negative|normal)|logb|next_after|rem| rint|scalb|selected_real_kind| support_(datatype|denormal|divide|inf|io|nan|rounding|sqrt|standard|underflow_control)| unordered|value))\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Functions accessable through the intrinsic IEEE_ARITHMETIC module. Introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b(ieee_support_(flag|halting))\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Functions accessable through the intrinsic IEEE_EXCEPTIONS module. Introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b(c_(associated|funloc|loc|sizeof))\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" } }, "comment": "Functions accessable through the intrinsic ISO_C_BINDING module. Introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b(compiler_(options|version))\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Functions accessable through the intrinsic ISO_FORTRAN_ENV module. Introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b(null)\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Intrinsic functions introduced in the Fortran 1995 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b(achar|adjustl|adjustr|all|allocated|associated|any|bit_size|btest|ceiling|count|cshift|digits|dot_product|eoshift|epsilon|exponent|floor|fraction|huge|iachar|iand|ibclr|ibits|ibset|ieor|ior|ishftc?| kind|lbound|len_trim|logical|matmul|maxexponent|maxloc|maxval|merge|minexponent|minloc|minval|modulo|nearest|not|pack|precision|present|product|radix|range|repeat|reshape|rrspacing|scale|scan|selected_(int|real)_kind|set_exponent|shape|size|spacing|spread|sum|tiny|transfer|transpose|trim|ubound|unpack|verify)\\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Intrinsic functions introduced in the Fortran 1990 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\b([icd]?abs|acos|[ad]int|[ad]nint|aimag|amax[01]| amin[01]|d?asin|d?atan|d?atan2|char|conjg|[cd]?cos|d?cosh|cmplx|dble| i?dim|dmax1|dmin1|dprod|[cd]?exp|float|ichar|idint|ifix|index|int|len| lge|lgt|lle|llt|[acd]?log|[ad]?log10|max[01]?|min[01]?|[ad]?mod| (id)?nint|real|[di]?sign|[cd]?sin|d?sinh|sngl|[cd]?sqrt|d?tan|d?tanh) \\s*(?=\\()", "beginCaptures": { "1": { "name": "support.function.intrinsic.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Intrinsic functions introduced in the Fortran 1977 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }] }, "intrinsic-subroutines": { "patterns": [{ "begin": "(?ix)\\G\\s*\\b(date_and_time|mvbits|random_number|random_seed| system_clock)\\s*(?=\\()", "beginCaptures": { "1": { "name": "entity.name.function.subroutine.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Intrinsic subroutines introduced in the Fortran 1990 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?i)\\G\\s*\\b(cpu_time)\\s*(?=\\()", "beginCaptures": { "1": { "name": "entity.name.function.subroutine.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Intrinsic subroutines introduced in the Fortran 1995 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?i)\\G\\s*\\b(ieee_(get|set)_(rounding|underflow)_mode)\\s*(?=\\()", "beginCaptures": { "1": { "name": "entity.name.function.subroutine.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Subroutines accessable through the intrinsic IEEE_ARITHMETIC module. Introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?i)\\G\\s*\\b(ieee_(get|set)_(flag|halting_mode|status))\\s*(?=\\()", "beginCaptures": { "1": { "name": "entity.name.function.subroutine.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Subroutines accessable through the intrinsic IEEE_EXCEPTIONS module. Introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?i)\\G\\s*\\b(c_f_(pointer|procpointer))\\s*(?=\\()", "beginCaptures": { "1": { "name": "entity.name.function.subroutine.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Subroutines accessable through the intrinsic ISO_C_BINDING module. Introduced in the Fortran 2003 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "begin": "(?ix)\\G\\s*\\b(execute_command_line|get_command| get_command_argument|get_environment_variable|move_alloc)\\s*(?=\\()", "beginCaptures": { "1": { "name": "entity.name.function.subroutine.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Intrinsic subroutines introduced in the Fortran 2008 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }] }, "invalid-character": { "match": "(?i)[^\\s;!\\n]+", "name": "invalid.error.character.fortran" }, "invalid-word": { "match": "(?i)\\b\\w+\\b", "name": "invalid.error.word.fortran" }, "language-binding-attribute": { "begin": "(?i)\\s*\\b(bind)\\s*\\(", "beginCaptures": { "1": { "name": "storage.modifier.bind.fortran" } }, "comment": "Introduced in Fortran 2003 standard.", "end": "(?:\\)|(?=\\n))", "patterns": [{ "match": "(?i)\\b(c)\\b", "name": "variable.parameter.fortran" }, { "include": "#dummy-variable" }, { "include": "$base" }] }, "line-continuation-operator": { "comment": "Operator that allows a line to be continued on the next line.", "patterns": [{ "captures": { "1": { "name": "keyword.operator.line-continuation.fortran" } }, "match": "(?:^|(?<=;))\\s*(&)" }, { "begin": "\\s*(&)", "beginCaptures": { "1": { "name": "keyword.operator.line-continuation.fortran" } }, "contentName": "meta.line-continuation.fortran", "end": "(?i)^(?:\\s*(&))?", "endCaptures": { "1": { "name": "keyword.operator.line-continuation.fortran" } }, "patterns": [{ "include": "#comments" }, { "match": "\\S[^!]*", "name": "invalid.error.line-cont.fortran" }] }] }, "logical-constant": { "captures": { "1": { "name": "constant.language.logical.false.fortran" }, "2": { "name": "constant.language.logical.true.fortran" } }, "comment": "Logical constants", "match": "(?i)\\s*(?:(\\.false\\.)|(\\.true\\.))" }, "logical-control-expression": { "begin": "\\G(?=\\s*\\()", "end": "(?<!\\G)", "name": "meta.expression.control.logical.fortran", "patterns": [{ "include": "#parentheses" }] }, "logical-operators": { "patterns": [{ "comment": "Introduced in the Fortran 1977 standard.", "match": "(?ix)(\\s*\\.(and|eq|eqv|le|lt|ge|gt|ne|neqv|not|or)\\.)", "name": "keyword.logical.fortran" }, { "comment": "Introduced in the Fortran 1990 standard.", "match": "(\\=\\=|\\/\\=|\\>\\=|(?<!\\=)\\>|\\<\\=|\\<)", "name": "keyword.logical.fortran.modern" }] }, "logical-type": { "comment": "Introduced in the Fortran 1977 standard.", "patterns": [{ "begin": "(?i)\\b(logical)\\s*(?=\\()", "beginCaptures": { "1": { "name": "storage.type.logical.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "contentName": "meta.type-spec.fortran", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "captures": { "1": { "name": "storage.type.character.fortran" }, "2": { "name": "keyword.operator.multiplication.fortran" }, "3": { "name": "constant.numeric.fortran" } }, "match": "(?i)\\b(logical)\\b(?:\\s*(\\*)\\s*(\\d*))?" }] }, "module-attribute": { "captures": { "1": { "name": "storage.modifier.module.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": `(?ix)\\s*\\b(module)\\b(?=\\s*(?:[;!\\n]| [^'";!\\n]*\\b(?:function|procedure|subroutine)\\b))` }, "module-definition": { "begin": `(?ix)(?=\\b(module)\\b)(?![^'";!\\n]* \\b(?:function|procedure|subroutine)\\b)`, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "name": "meta.module.fortran", "patterns": [{ "captures": { "1": { "name": "keyword.other.program.fortran" } }, "match": "(?i)\\G\\s*\\b(module)\\b" }, { "applyEndPatternLast": 1, "begin": "(?i)\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.class.module.fortran" } }, "comment": "Module body.", "end": "(?ix)\\b(?:(end\\s*module)(?:\\s+([a-z_]\\w*))?|(end))\\b \\s*([^;!\\n]+)?(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.other.endmodule.fortran" }, "2": { "name": "entity.name.class.module.fortran" }, "3": { "name": "keyword.other.endmodule.fortran" }, "4": { "name": "invalid.error.module-definition.fortran" } }, "patterns": [{ "begin": "\\G", "comment": "Module specification block.", "end": "(?i)(?=\\b(?:end\\s*[;!\\n]|end\\s*module\\b))", "name": "meta.block.specification.module.fortran", "patterns": [{ "begin": "(?i)\\b(contains)\\b", "beginCaptures": { "1": { "name": "keyword.control.contains.fortran" } }, "comment": "Module contains block.", "end": "(?i)(?=\\s*(?:end\\s*[;!\\n]|end\\s*module\\b))", "name": "meta.block.contains.fortran", "patterns": [{ "include": "$base" }] }, { "include": "$base" }] }] }] }, "name-list": { "begin": "(?i)(?=\\s*[a-z])", "comment": "Name list.", "contentName": "meta.name-list.fortran", "end": "(?=[\\);!\\n])", "patterns": [{ "include": "#constants" }, { "include": "#operators" }, { "include": "#intrinsic-functions" }, { "include": "#array-constructor" }, { "include": "#parentheses" }, { "include": "#brackets" }, { "include": "#assignment-keyword" }, { "include": "#operator-keyword" }, { "include": "#variable" }] }, "named-control-constructs": { "applyEndPatternLast": 1, "begin": "(?ix)([a-z]\\w*)\\s*(:)(?=\\s*(?:associate|block(?!\\s*data)|critical|do|forall|if|select\\s*case|select\\s*type|select\\s*rank|where)\\b)", "comment": "Introduced in the Fortran 1990 standard.", "contentName": "meta.named-construct.fortran.modern", "end": "(?i)(?!\\s*\\b(?:associate|block(?!\\s*data)|critical|do|forall|if|select\\s*case|select\\s*type|select\\s*rank|where)\\b)(?:\\b(\\1)\\b)?([^\\s;!\\n]*?)?(?=\\s*[;!\\n])", "endCaptures": { "1": { "name": "meta.label.end.name.fortran" }, "2": { "name": "invalid.error.named-control-constructs.fortran.modern" } }, "patterns": [{ "include": "#unnamed-control-constructs" }] }, "namelist-statement": { "begin": "(?i)\\b(namelist)\\b", "beginCaptures": { "1": { "name": "keyword.control.namelist.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "patterns": [{ "include": "$base" }] }, "non-intrinsic-attribute": { "captures": { "1": { "name": "storage.modifier.non-intrinsic.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": "(?i)\\s*\\b(non_intrinsic)\\b" }, "non-overridable-attribute": { "captures": { "1": { "name": "storage.modifier.non-overridable.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\s*\\b(non_overridable)\\b" }, "nopass-attribute": { "captures": { "1": { "name": "storage.modifier.nopass.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\s*\\b(nopass)\\b" }, "nullify-statement": { "begin": "(?i)\\b(nullify)\\s*(?=\\()", "beginCaptures": { "1": { "name": "keyword.control.nullify.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.statement.nullify.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "numeric-constant": { "comment": "Numeric constants", "match": "(?ix)[\\+\\-]?(\\b\\d+\\.?\\d*|\\.\\d+) (_\\w+|d[\\+\\-]?\\d+|e[\\+\\-]?\\d+(_\\w+)?)?(?![a-z_])", "name": "constant.numeric.fortran" }, "numeric-type": { "comment": "Introduced in the Fortran 1977 standard.", "patterns": [{ "begin": "(?i)\\b(?:(complex)|(double\\s*precision)|(double\\s*complex)|(integer)|(real))\\s*(?=\\()", "beginCaptures": { "1": { "name": "storage.type.complex.fortran" }, "2": { "name": "storage.type.double.fortran" }, "3": { "name": "storage.type.doublecomplex.fortran" }, "4": { "name": "storage.type.integer.fortran" }, "5": { "name": "storage.type.real.fortran" }, "6": { "name": "punctuation.parentheses.left.fortran" } }, "contentName": "meta.type-spec.fortran", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#parentheses-dummy-variables" }] }, { "captures": { "1": { "name": "storage.type.complex.fortran" }, "2": { "name": "storage.type.double.fortran" }, "3": { "name": "storage.type.doublecomplex.fortran" }, "4": { "name": "storage.type.integer.fortran" }, "5": { "name": "storage.type.real.fortran" }, "6": { "name": "storage.type.dimension.fortran" }, "7": { "name": "keyword.operator.multiplication.fortran" }, "8": { "name": "constant.numeric.fortran" } }, "match": "(?ix)\\b(?:(complex)|(double\\s*precision)|(double\\s*complex)|(integer)|(real)|(dimension))\\b(?:\\s*(\\*)\\s*(\\d*))?" }] }, "operator-keyword": { "begin": "(?i)\\s*\\b(operator)\\s*(\\()", "beginCaptures": { "1": { "name": "keyword.control.generic-spec.operator.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Operator generic specification.", "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#arithmetic-operators" }, { "include": "#logical-operators" }, { "include": "#user-defined-operators" }, { "include": "#invalid-word" }] }, "operators": { "patterns": [{ "include": "#arithmetic-operators" }, { "include": "#assignment-operator" }, { "include": "#derived-type-operators" }, { "include": "#logical-operators" }, { "include": "#pointer-operators" }, { "include": "#string-operators" }, { "include": "#user-defined-operators" }] }, "optional-attribute": { "captures": { "1": { "name": "storage.modifier.optional.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": "(?i)\\s*\\b(optional)\\b" }, "parameter-attribute": { "captures": { "1": { "name": "storage.modifier.parameter.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "match": "(?i)\\s*\\b(parameter)\\b" }, "parentheses": { "begin": "\\s*(\\()", "beginCaptures": { "1": { "name": "punctuation.parentheses.left.fortran" } }, "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#comments" }, { "include": "#constants" }, { "include": "#operators" }, { "include": "#array-constructor" }, { "include": "#parentheses" }, { "include": "#intrinsic-functions" }, { "include": "#variable" }] }, "parentheses-dummy-variables": { "begin": "\\s*(\\()", "beginCaptures": { "1": { "name": "punctuation.parentheses.left.fortran" } }, "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#procedure-call-dummy-variable" }, { "include": "#comments" }, { "include": "#constants" }, { "include": "#operators" }, { "include": "#array-constructor" }, { "include": "#parentheses" }, { "include": "#intrinsic-functions" }, { "include": "#variable" }] }, "pass-attribute": { "comment": "Introduced in the Fortran 2003 standard.", "patterns": [{ "begin": "(?i)\\s*\\b(pass)\\s*\\(", "beginCaptures": { "1": { "name": "storage.modifier.pass.fortran" } }, "comment": "Pass attribute with argument.", "end": "\\)|(?=\\n)", "patterns": [] }, { "captures": { "1": { "name": "storage.modifier.pass.fortran" } }, "comment": "Pass attribute without argument.", "match": "(?i)\\s*\\b(pass)\\b" }] }, "pause-statement": { "begin": "(?i)\\s*\\b(pause)\\b", "beginCaptures": { "1": { "name": "keyword.control.pause.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.pause.fortran", "patterns": [{ "include": "#constants" }, { "include": "#invalid-character" }] }, "pointer-attribute": { "captures": { "1": { "name": "storage.modifier.pointer.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": "(?i)\\s*\\b(pointer)\\b" }, "pointer-operators": { "comment": "Introduced in the Fortran 1990 standard.", "match": "(\\=\\>)", "name": "keyword.other.point.fortran" }, "preprocessor": { "begin": "^\\s*(#:?)", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.indicator.fortran" } }, "end": "\\n", "name": "meta.preprocessor", "patterns": [{ "include": "#preprocessor-if-construct" }, { "include": "#preprocessor-statements" }] }, "preprocessor-arithmetic-operators": { "captures": { "1": { "name": "keyword.operator.subtraction.fortran" }, "2": { "name": "keyword.operator.addition.fortran" }, "3": { "name": "keyword.operator.division.fortran" }, "4": { "name": "keyword.operator.multiplication.fortran" } }, "comment": "division regex is different than in main fortran", "match": "(\\-)|(\\+)|(\\/)|(\\*)" }, "preprocessor-assignment-operator": { "comment": "assignments with = are not allowed", "match": "(?<!\\=)(\\=)(?!\\=)", "name": "keyword.operator.assignment.preprocessor.fortran" }, "preprocessor-comments": { "begin": "/\\*", "end": "\\*/", "name": "comment.preprocessor" }, "preprocessor-constants": { "patterns": [{ "include": "#cpp-numeric-constant" }, { "include": "#preprocessor-string-constant" }] }, "preprocessor-define-statement": { "begin": "(?i)\\G\\s*\\b(define)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.define.fortran" } }, "end": "(?=\\n)", "name": "meta.preprocessor.macro.fortran", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#preprocessor-constants" }, { "include": "#preprocessor-line-continuation-operator" }] }, "preprocessor-defined-function": { "captures": { "1": { "name": "keyword.control.preprocessor.defined.fortran" } }, "match": "(?i)\\b(defined)\\b" }, "preprocessor-error-statement": { "begin": "(?i)\\G\\s*(error)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.error.fortran" } }, "end": "(?=\\n)", "name": "meta.preprocessor.macro.fortran", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#preprocessor-string-constant" }, { "include": "#preprocessor-line-continuation-operator" }] }, "preprocessor-if-construct": { "patterns": [{ "begin": "(?i)\\G\\s*\\b(if)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.if.fortran" } }, "end": "(?=\\n)", "name": "meta.preprocessor.conditional.fortran", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#cpp-numeric-constant" }, { "include": "#preprocessor-logical-operators" }, { "include": "#preprocessor-arithmetic-operators" }, { "include": "#preprocessor-defined-function" }, { "include": "#preprocessor-line-continuation-operator" }] }, { "begin": "(?i)\\G\\s*\\b(ifdef)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.ifdef.fortran" } }, "end": "(?=\\n)", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#cpp-numeric-constant" }, { "include": "#preprocessor-logical-operators" }, { "include": "#preprocessor-arithmetic-operators" }, { "include": "#preprocessor-line-continuation-operator" }] }, { "begin": "(?i)\\G\\s*\\b(ifndef)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.ifndef.fortran" } }, "end": "(?=\\n)", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#cpp-numeric-constant" }, { "include": "#preprocessor-logical-operators" }, { "include": "#preprocessor-arithmetic-operators" }, { "include": "#preprocessor-line-continuation-operator" }] }, { "begin": "(?i)\\G\\s*\\b(else)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.else.fortran" } }, "end": "(?=\\n)", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#cpp-numeric-constant" }] }, { "begin": "(?i)\\G\\s*\\b(elif)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.elif.fortran" } }, "end": "(?=\\n)", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#cpp-numeric-constant" }, { "include": "#preprocessor-logical-operators" }, { "include": "#preprocessor-arithmetic-operators" }, { "include": "#preprocessor-defined-function" }, { "include": "#preprocessor-line-continuation-operator" }] }, { "begin": "(?i)\\G\\s*\\b(endif)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.endif.fortran" } }, "end": "(?=\\n)", "patterns": [{ "include": "#preprocessor-comments" }] }] }, "preprocessor-include-statement": { "begin": "(?i)\\G\\s*(include)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.include.fortran" } }, "end": "(?=\\n)", "name": "meta.preprocessor.include.fortran", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#preprocessor-string-constant" }, { "begin": "<", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.preprocessor.fortran" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.definition.string.end.preprocessor.fortran" } }, "name": "string.quoted.other.lt-gt.include.preprocessor.fortran" }, { "include": "#line-continuation-operator" }] }, "preprocessor-line-continuation-operator": { "begin": "\\s*(\\\\)", "beginCaptures": { "1": { "name": "constant.character.escape.line-continuation.preprocessor.fortran" } }, "end": "(?i)^" }, "preprocessor-logical-operators": { "captures": { "1": { "name": "keyword.operator.logical.preprocessor.and.fortran" }, "2": { "name": "keyword.operator.logical.preprocessor.equals.fortran" }, "3": { "name": "keyword.operator.logical.preprocessor.not_equals.fortran" }, "4": { "name": "keyword.operator.logical.preprocessor.or.fortran" }, "5": { "name": "keyword.operator.logical.preprocessor.less_eq.fortran" }, "6": { "name": "keyword.operator.logical.preprocessor.more_eq.fortran" }, "7": { "name": "keyword.operator.logical.preprocessor.less.fortran" }, "8": { "name": "keyword.operator.logical.preprocessor.more.fortran" }, "9": { "name": "keyword.operator.logical.preprocessor.complementary.fortran" }, "10": { "name": "keyword.operator.logical.preprocessor.xor.fortran" }, "11": { "name": "keyword.operator.logical.preprocessor.bitand.fortran" }, "12": { "name": "keyword.operator.logical.preprocessor.not.fortran" }, "13": { "name": "keyword.operator.logical.preprocessor.bitor.fortran" } }, "comment": "and:&&, bitand:&, or:||, bitor:|, not eq:!=, not:!, xor:^, compl:~", "match": "(&&)|(==)|(\\!=)|(\\|\\|)|(\\<\\=)|(\\>=)|(\\<)|(\\>)|(~)|(\\^)|(&)|(\\!)|(\\|)", "name": "keyword.operator.logical.preprocessor.fortran" }, "preprocessor-operators": { "patterns": [{ "include": "#preprocessor-line-continuation-operator" }, { "include": "#preprocessor-logical-operators" }, { "include": "#preprocessor-arithmetic-operators" }] }, "preprocessor-pragma-statement": { "begin": "(?i)\\G\\s*\\b(pragma)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.pragma.fortran" } }, "end": "(?=\\n)", "name": "meta.preprocessor.pragma.fortran", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#preprocessor-string-constant" }] }, "preprocessor-statements": { "patterns": [{ "include": "#preprocessor-define-statement" }, { "include": "#preprocessor-error-statement" }, { "include": "#preprocessor-include-statement" }, { "include": "#preprocessor-preprocessor-pragma-statement" }, { "include": "#preprocessor-undefine-statement" }] }, "preprocessor-string-constant": { "patterns": [{ "begin": '"', "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.preprocessor.fortran" } }, "comment": "Double quote string", "end": '"', "endCaptures": { "0": { "name": "punctuation.definition.string.end.preprocessor.fortran" } }, "name": "string.quoted.double.include.preprocessor.fortran" }, { "begin": "'", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.preprocessor.fortran" } }, "comment": "Single quote string", "end": "'", "endCaptures": { "0": { "name": "punctuation.definition.string.end.preprocessor.fortran" } }, "name": "string.quoted.single.include.preprocessor.fortran" }] }, "preprocessor-undefine-statement": { "begin": "(?i)\\G\\s*\\b(undef)\\b", "beginCaptures": { "1": { "name": "keyword.control.preprocessor.undef.fortran" } }, "end": "(?=\\n)", "name": "meta.preprocessor.undef.fortran", "patterns": [{ "include": "#preprocessor-comments" }, { "include": "#preprocessor-line-continuation-operator" }] }, "private-attribute": { "captures": { "1": { "name": "storage.modifier.private.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": "(?i)\\s*\\b(private)\\b" }, "procedure-call-dummy-variable": { "match": "(?i)\\s*([a-z]\\w*)(?=\\s*\\=)(?!\\s*\\=\\=)", "name": "variable.parameter.dummy-variable.fortran.modern" }, "procedure-definition": { "begin": `(?i)(?=[^'";!\\n]*\\bmodule\\s+procedure\\b)`, "comment": "Procedure program unit. Introduced in the Fortran 2008 standard.", "end": "(?=[;!\\n])", "name": "meta.procedure.fortran", "patterns": [{ "begin": "(?i)\\s*\\b(module\\s+procedure)\\b", "beginCaptures": { "1": { "name": "keyword.other.procedure.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "begin": "(?i)\\G\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.function.procedure.fortran" } }, "comment": "Procedure body.", "end": "(?ix)\\s*\\b(?:(end\\s*procedure)(?:\\s+([a-z_]\\w*))?|(end))\\b \\s*([^;!\\n]+)?(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.other.endprocedure.fortran" }, "2": { "name": "entity.name.function.procedure.fortran" }, "3": { "name": "keyword.other.endprocedure.fortran" }, "4": { "name": "invalid.error.procedure-definition.fortran" } }, "patterns": [{ "begin": "\\G(?!\\s*[;!\\n])", "comment": "Rest of the first line in procedure construct - should be empty.", "end": "(?=[;!\\n])", "name": "meta.first-line.fortran", "patterns": [{ "include": "#invalid-character" }] }, { "begin": "(?i)(?!\\s*(?:contains\\b|end\\s*[;!\\n]|end\\s*procedure\\b))", "comment": "Specification and execution block.", "end": "(?i)(?=\\s*(?:contains\\b|end\\s*[;!\\n]|end\\s*procedure\\b))", "name": "meta.block.specification.procedure.fortran", "patterns": [{ "include": "$self" }] }, { "begin": "(?i)\\s*(contains)\\b", "beginCaptures": { "1": { "name": "keyword.control.contains.fortran" } }, "comment": "Contains block.", "end": "(?i)(?=\\s*(?:end\\s*[;!\\n]|end\\s*procedure\\b))", "name": "meta.block.contains.fortran", "patterns": [{ "include": "$self" }] }] }] }] }, "procedure-name": { "captures": { "1": { "name": "entity.name.function.procedure.fortran" } }, "comment": "Procedure name.", "match": "(?i)\\s*\\b([a-z]\\w*)\\b" }, "procedure-name-list": { "begin": "(?i)(?=\\s*[a-z])", "comment": "Name list.", "contentName": "meta.name-list.fortran", "end": "(?=[;!\\n])", "patterns": [{ "begin": "(?!\\s*\\n)", "end": "(,)|(?=[!;\\n])", "endCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "patterns": [{ "include": "#procedure-name" }, { "include": "#pointer-operators" }] }] }, "procedure-specification-statement": { "begin": "(?i)(?=\\b(?:procedure)\\b)", "comment": "Introduced in the Fortran 2003 standard.", "end": "(?=[;!\\n])", "name": "meta.specification.procedure.fortran", "patterns": [{ "include": "#procedure-type" }, { "begin": "(?=\\s*(,|::|\\())", "comment": "Attribute list.", "contentName": "meta.attribute-list.procedure.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "begin": "(,)|^|(?<=&)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[,&;!\\n])", "patterns": [{ "include": "#access-attribute" }, { "include": "#intent-attribute" }, { "include": "#optional-attribute" }, { "include": "#pointer-attribute" }, { "include": "#protected-attribute" }, { "include": "#save-attribute" }, { "include": "#invalid-word" }] }] }, { "include": "#procedure-name-list" }] }, "procedure-type": { "comment": "Introduced in the Fortran ???? standard.", "patterns": [{ "begin": "(?i)\\b(procedure)\\s*(\\()", "beginCaptures": { "1": { "name": "storage.type.procedure.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "contentName": "meta.type-spec.fortran", "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#types" }, { "include": "#procedure-name" }] }, { "captures": { "1": { "name": "storage.type.procedure.fortran" } }, "match": "(?i)\\b(procedure)\\b" }] }, "program-definition": { "begin": "(?i)(?=\\b(program)\\b)", "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.program.fortran", "patterns": [{ "captures": { "1": { "name": "keyword.control.program.fortran" } }, "match": "(?i)\\G\\s*\\b(program)\\b" }, { "applyEndPatternLast": 1, "begin": "(?i)\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.program.fortran" } }, "comment": "Program body.", "end": "(?ix)\\b(?:(end\\s*program)(?:\\s+([a-z_]\\w*))?|(end))\\b\\s*([^;!\\n]+)?(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.control.endprogram.fortran" }, "2": { "name": "entity.name.program.fortran" }, "3": { "name": "keyword.control.endprogram.fortran" }, "4": { "name": "invalid.error.program-definition.fortran" } }, "patterns": [{ "begin": "\\G", "comment": "Program specification block.", "end": "(?i)(?=\\b(?:end\\s*[;!\\n]|end\\s*program\\b))", "name": "meta.block.specification.program.fortran", "patterns": [{ "begin": "(?i)\\b(contains)\\b", "beginCaptures": { "1": { "name": "keyword.control.contains.fortran" } }, "comment": "Program contains block.", "end": "(?i)(?=(?:end\\s*[;!\\n]|end\\s*program\\b))", "name": "meta.block.contains.fortran", "patterns": [{ "include": "$base" }] }, { "include": "$base" }] }] }] }, "protected-attribute": { "captures": { "1": { "name": "storage.modifier.protected.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\s*\\b(protected)\\b" }, "public-attribute": { "captures": { "1": { "name": "storage.modifier.public.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": "(?i)\\s*\\b(public)\\b" }, "pure-attribute": { "captures": { "1": { "name": "storage.modifier.impure.fortran" }, "2": { "name": "storage.modifier.pure.fortran" } }, "comment": "Introduced in the Fortran 1995 standard.", "match": "(?i)\\s*\\b(?:(impure)|(pure))\\b" }, "recursive-attribute": { "captures": { "1": { "name": "storage.modifier.non_recursive.fortran" }, "2": { "name": "storage.modifier.recursive.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "match": "(?i)\\s*\\b(?:(non_recursive)|(recursive))\\b" }, "result-statement": { "begin": "(?i)\\s*\\b(result)\\s*(\\()", "beginCaptures": { "1": { "name": "keyword.control.result.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "patterns": [{ "include": "#dummy-variable" }] }, "return-statement": { "begin": "(?i)\\s*\\b(return)\\b", "beginCaptures": { "1": { "name": "keyword.control.return.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.return.fortran", "patterns": [{ "include": "#invalid-character" }] }, "save-attribute": { "captures": { "1": { "name": "storage.modifier.save.fortran" } }, "comment": "Introduced in the Fortran 1977 standard.", "match": "(?i)\\s*\\b(save)\\b" }, "select-case-construct": { "begin": "(?i)\\b(select\\s*case)\\b", "beginCaptures": { "1": { "name": "keyword.control.selectcase.fortran" } }, "comment": "Select case construct. Introduced in the Fortran 1990 standard.", "end": "(?i)\\b(end\\s*select)\\b", "endCaptures": { "1": { "name": "keyword.control.endselect.fortran" } }, "name": "meta.block.select.case.fortran", "patterns": [{ "include": "#parentheses" }, { "begin": "(?i)\\b(case)\\b", "beginCaptures": { "1": { "name": "keyword.control.case.fortran" } }, "end": "(?i)(?=[;!\\n])", "patterns": [{ "captures": { "1": { "name": "keyword.control.default.fortran" } }, "match": "(?i)\\G\\s*\\b(default)\\b" }, { "include": "#parentheses" }, { "include": "#invalid-word" }] }, { "include": "$base" }] }, "select-rank-construct": { "begin": "(?i)\\b(select\\s*rank)\\b", "beginCaptures": { "1": { "name": "keyword.control.selectrank.fortran" } }, "comment": "Select rank construct. Introduced in the Fortran 2008 standard.", "end": "(?i)\\b(end\\s*select)\\b", "endCaptures": { "1": { "name": "keyword.control.endselect.fortran" } }, "name": "meta.block.select.rank.fortran", "patterns": [{ "include": "#parentheses" }, { "begin": "(?i)\\b(rank)\\b", "beginCaptures": { "1": { "name": "keyword.control.rank.fortran" } }, "end": "(?i)(?=[;!\\n])", "patterns": [{ "captures": { "1": { "name": "keyword.control.default.fortran" } }, "match": "(?i)\\G\\s*\\b(default)\\b" }, { "include": "#parentheses" }, { "include": "#invalid-word" }] }, { "include": "$base" }] }, "select-type-construct": { "begin": "(?i)\\b(select\\s*type)\\b", "beginCaptures": { "1": { "name": "keyword.control.selecttype.fortran" } }, "comment": "Select type construct. Introduced in the Fortran 2003 standard.", "end": "(?i)\\b(end\\s*select)\\b", "endCaptures": { "1": { "name": "keyword.control.endselect.fortran" } }, "name": "meta.block.select.type.fortran", "patterns": [{ "include": "#parentheses" }, { "begin": "(?i)\\b(?:(class)|(type))\\b", "beginCaptures": { "1": { "name": "keyword.control.class.fortran" }, "2": { "name": "keyword.control.type.fortran" } }, "end": "(?i)(?=[;!\\n])", "patterns": [{ "captures": { "1": { "name": "keyword.control.default.fortran" } }, "match": "(?i)\\G\\s*\\b(default)\\b" }, { "captures": { "1": { "name": "keyword.control.is.fortran" } }, "match": "(?i)\\G\\s*\\b(is)\\b" }, { "include": "#parentheses" }, { "include": "#invalid-word" }] }, { "include": "$base" }] }, "sequence-attribute": { "captures": { "1": { "name": "storage.modifier.sequence.fortran" } }, "comment": "Introduced in the Fortran 20?? standard.", "match": "(?i)\\s*\\b(sequence)\\b" }, "specification-statements": { "patterns": [{ "include": "#attribute-specification-statement" }, { "include": "#common-statement" }, { "include": "#data-statement" }, { "include": "#equivalence-statement" }, { "include": "#implicit-statement" }, { "include": "#namelist-statement" }, { "include": "#use-statement" }] }, "stop-statement": { "begin": "(?i)\\s*\\b(stop)\\b(?:\\s*\\b([a-z]\\w*)\\b)?", "beginCaptures": { "1": { "name": "keyword.control.stop.fortran" }, "2": { "name": "meta.label.stop.stop" } }, "comment": "Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.control.stop.fortran", "patterns": [{ "include": "#constants" }, { "include": "#string-operators" }, { "include": "#invalid-character" }] }, "string-constant": { "comment": "Introduced in the Fortran 1977 standard.", "patterns": [{ "applyEndPatternLast": 1, "begin": "'", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.fortran" } }, "comment": "String", "end": "'", "endCaptures": { "0": { "name": "punctuation.definition.string.end.fortran" } }, "name": "string.quoted.single.fortran", "patterns": [{ "match": "''", "name": "constant.character.escape.apostrophe.fortran" }] }, { "applyEndPatternLast": 1, "begin": '"', "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.fortran" } }, "comment": "String", "end": '"', "endCaptures": { "0": { "name": "punctuation.definition.string.end.fortran" } }, "name": "string.quoted.double.fortran", "patterns": [{ "match": '""', "name": "constant.character.escape.quote.fortran" }] }] }, "string-line-continuation-operator": { "begin": "(&)(?=\\s*\\n)", "beginCaptures": { "1": { "name": "keyword.operator.line-continuation.fortran" } }, "comment": "Operator that allows a line to be continued on the next line.", "end": "(?i)^(?:(?=\\s*[^\\s!&])|\\s*(&))", "endCaptures": { "1": { "name": "keyword.operator.line-continuation.fortran" } }, "patterns": [{ "include": "#comments" }, { "match": "\\S.*", "name": "invalid.error.string-line-cont.fortran" }] }, "string-operators": { "comment": "Introduced in the Fortran 19?? standard.", "match": "(\\/\\/)", "name": "keyword.other.concatination.fortran" }, "submodule-definition": { "begin": "(?i)(?=\\b(submodule)\\s*\\()", "comment": "Introduced in the Fortran 2008 standard.", "end": "(?=[;!\\n])", "name": "meta.submodule.fortran", "patterns": [{ "begin": "(?i)\\G\\s*\\b(submodule)\\s*(\\()\\s*(\\w+)", "beginCaptures": { "1": { "name": "keyword.other.submodule.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" }, "3": { "name": "entity.name.class.submodule.fortran" } }, "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.parentheses.left.fortran" } }, "patterns": [] }, { "applyEndPatternLast": 1, "begin": "(?i)\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.module.submodule.fortran" } }, "comment": "Submodule body.", "end": "(?ix)\\s*\\b(?:(end\\s*submodule)(?:\\s+([a-z_]\\w*))?|(end))\\b \\s*([^;!\\n]+)?(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.other.endsubmodule.fortran" }, "2": { "name": "entity.name.module.submodule.fortran" }, "3": { "name": "keyword.other.endsubmodule.fortran" }, "4": { "name": "invalid.error.submodule.fortran" } }, "patterns": [{ "begin": "\\G", "comment": "Submodule specification block.", "end": "(?i)(?=\\b(?:end\\s*[;!\\n]|end\\s*submodule\\b))", "name": "meta.block.specification.submodule.fortran", "patterns": [{ "begin": "(?i)\\b(contains)\\b", "beginCaptures": { "1": { "name": "keyword.control.contains.fortran" } }, "comment": "Submodule contains block.", "end": "(?i)(?=\\s*(?:end\\s*[;!\\n]|end\\s*submodule\\b))", "name": "meta.block.contains.fortran", "patterns": [{ "include": "$base" }] }, { "include": "$base" }] }] }] }, "subroutine-definition": { "begin": `(?i)(?=([^:'";!\\n](?!\\bend))*\\bsubroutine\\b)`, "comment": "Subroutine program unit. Introduced in the Fortran 1977 standard.", "end": "(?=[;!\\n])", "name": "meta.subroutine.fortran", "patterns": [{ "begin": "(?i)(?=\\G\\s*(?!\\bsubroutine\\b))", "comment": "Attribute list.", "end": "(?i)(?=\\bsubroutine\\b)", "name": "meta.attribute-list.subroutine.fortran", "patterns": [{ "include": "#elemental-attribute" }, { "include": "#module-attribute" }, { "include": "#pure-attribute" }, { "include": "#recursive-attribute" }, { "include": "#invalid-word" }] }, { "begin": "(?i)\\s*\\b(subroutine)\\b", "beginCaptures": { "1": { "name": "keyword.other.subroutine.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "begin": "(?i)\\G\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.function.subroutine.fortran" } }, "comment": "Subroutine body.", "end": "(?ix)\\b(?:(end\\s*subroutine)(?:\\s+([a-z_]\\w*))?|(end))\\b \\s*([^;!\\n]+)?(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.other.endsubroutine.fortran" }, "2": { "name": "entity.name.function.subroutine.fortran" }, "3": { "name": "keyword.other.endsubroutine.fortran" }, "4": { "name": "invalid.error.subroutine.fortran" } }, "patterns": [{ "begin": "\\G(?!\\s*[;!\\n])", "comment": "Rest of the first line in subroutine construct.", "end": "(?=[;!\\n])", "name": "meta.first-line.fortran", "patterns": [{ "include": "#dummy-variable-list" }, { "include": "#language-binding-attribute" }] }, { "begin": "(?i)(?!\\b(?:end\\s*[;!\\n]|end\\s*subroutine\\b))", "comment": "Specification and execution block.", "end": "(?i)(?=\\b(?:end\\s*[;!\\n]|end\\s*subroutine\\b))", "name": "meta.block.specification.subroutine.fortran", "patterns": [{ "begin": "(?i)\\b(contains)\\b", "beginCaptures": { "1": { "name": "keyword.control.contains.fortran" } }, "comment": "Contains block.", "end": "(?i)(?=(?:end\\s*[;!\\n]|end\\s*subroutine\\b))", "name": "meta.block.contains.fortran", "patterns": [{ "include": "$base" }] }, { "include": "$base" }] }] }] }] }, "sync-all-statement": { "begin": "(?i)\\b(sync all|sync memory)(\\s*(?=\\())?", "beginCaptures": { "1": { "name": "keyword.control.sync-all-memory.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 2018 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.statement.sync-all-memory.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "sync-statement": { "begin": "(?i)\\b(sync images|sync team)\\s*(?=\\()", "beginCaptures": { "1": { "name": "keyword.control.sync-images-team.fortran" }, "2": { "name": "punctuation.parentheses.left.fortran" } }, "comment": "Introduced in the Fortran 2018 standard.", "end": "(?<!\\G)", "endCaptures": { "1": { "name": "punctuation.parentheses.right.fortran" } }, "name": "meta.statement.sync-images-team.fortran", "patterns": [{ "include": "#parentheses-dummy-variables" }] }, "target-attribute": { "captures": { "1": { "name": "storage.modifier.target.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "match": "(?i)\\s*\\b(target)\\b" }, "type-specification-statements": { "begin": `(?ix)(?=\\b(?:character|class|complex|double\\s*precision|double\\s*complex|integer|logical|real|type|dimension)\\b(?![^'";!\\n:]*\\bfunction\\b))`, "comment": "Supported types for function and escape :: if function is used as a variable name (which is bad practice).", "end": "(?=[\\);!\\n])", "name": "meta.specification.type.fortran", "patterns": [{ "include": "#types" }, { "begin": "(?=\\s*(,|::))", "comment": "Attribute list.", "contentName": "meta.attribute-list.type-specification-statements.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "begin": "(,)|^|(?<=&)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[,&;!\\n])", "patterns": [{ "include": "#access-attribute" }, { "include": "#allocatable-attribute" }, { "include": "#asynchronous-attribute" }, { "include": "#codimension-attribute" }, { "include": "#contiguous-attribute" }, { "include": "#dimension-attribute" }, { "include": "#external-attribute" }, { "include": "#intent-attribute" }, { "include": "#intrinsic-attribute" }, { "include": "#language-binding-attribute" }, { "include": "#optional-attribute" }, { "include": "#parameter-attribute" }, { "include": "#pointer-attribute" }, { "include": "#protected-attribute" }, { "include": "#save-attribute" }, { "include": "#target-attribute" }, { "include": "#value-attribute" }, { "include": "#volatile-attribute" }, { "include": "#invalid-word" }] }] }, { "include": "#name-list" }] }, "types": { "patterns": [{ "include": "#character-type" }, { "include": "#derived-type" }, { "include": "#logical-type" }, { "include": "#numeric-type" }] }, "unnamed-control-constructs": { "patterns": [{ "include": "#associate-construct" }, { "include": "#block-construct" }, { "include": "#critical-construct" }, { "include": "#do-construct" }, { "include": "#forall-construct" }, { "include": "#if-construct" }, { "include": "#select-case-construct" }, { "include": "#select-type-construct" }, { "include": "#select-rank-construct" }, { "include": "#where-construct" }] }, "use-statement": { "begin": "(?i)\\b(use)\\b", "beginCaptures": { "1": { "name": "keyword.control.use.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?=[;!\\n])", "name": "meta.statement.use.fortran", "patterns": [{ "begin": "(?=\\s*(,|::|\\())", "comment": "Attribute list.", "contentName": "meta.attribute-list.namelist.fortran", "end": "(::)|(?=[;!\\n])", "endCaptures": { "1": { "name": "keyword.operator.double-colon.fortran" } }, "patterns": [{ "begin": "(,)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[,;!\\n])", "patterns": [{ "include": "#intrinsic-attribute" }, { "include": "#non-intrinsic-attribute" }, { "include": "#invalid-word" }] }] }, { "begin": "(?i)\\s*\\b([a-z]\\w*)\\b", "beginCaptures": { "1": { "name": "entity.name.class.module.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "begin": "(,)", "beginCaptures": { "1": { "name": "punctuation.comma.fortran" } }, "end": "(?=::|[;!\\n])", "patterns": [{ "begin": "(?i)\\s*\\b(only\\s*:)", "beginCaptures": { "1": { "name": "keyword.control.only.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "#operator-keyword" }, { "include": "$base" }] }, { "begin": "(?i)(?=\\s*[a-z])", "contentName": "meta.name-list.fortran", "end": "(?=[;!\\n])", "patterns": [{ "include": "#operator-keyword" }, { "include": "$base" }] }] }] }] }, "user-defined-operators": { "captures": { "1": { "name": "keyword.operator.user-defined.fortran" } }, "match": "(?i)\\s*(\\.[a-z]+\\.)" }, "value-attribute": { "captures": { "1": { "name": "storage.modifier.value.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\s*\\b(value)\\b" }, "variable": { "applyEndPatternLast": 1, "begin": "(?i)\\b(?=[a-z])", "end": "(?<!\\G)", "name": "meta.parameter.fortran", "patterns": [{ "include": "#brackets" }, { "include": "#derived-type-operators" }, { "include": "#parentheses-dummy-variables" }, { "include": "#word" }] }, "volatile-attribute": { "captures": { "1": { "name": "storage.modifier.volatile.fortran" } }, "comment": "Introduced in the Fortran 2003 standard.", "match": "(?i)\\s*\\b(volatile)\\b" }, "where-construct": { "patterns": [{ "applyEndPatternLast": 1, "begin": "(?i)\\b(where)\\b", "beginCaptures": { "1": { "name": "keyword.control.where.fortran" } }, "comment": "Introduced in the Fortran 1990 standard.", "end": "(?<!\\G)", "patterns": [{ "include": "#logical-control-expression" }, { "begin": "(?<=\\))(?=\\s*[;!\\n])", "end": "(?i)\\b(end\\s*where)\\b", "endCaptures": { "1": { "name": "keyword.control.endwhere.fortran" } }, "name": "meta.block.where.fortran", "patterns": [{ "begin": "(?i)\\s*\\b(else\\s*where)\\b", "beginCaptures": { "1": { "name": "keyword.control.elsewhere.fortran" } }, "end": "(?=[;!\\n])", "patterns": [{ "include": "#parentheses" }, { "include": "#invalid-word" }] }, { "include": "$base" }] }, { "begin": "(?i)(?<=\\))(?!\\s*[;!\\n])", "end": "\\n", "name": "meta.statement.control.where.fortran", "patterns": [{ "include": "$base" }] }] }] }, "while-attribute": { "begin": "(?i)\\G\\s*\\b(while)\\b", "beginCaptures": { "1": { "name": "keyword.control.while.fortran" } }, "comment": "Introduced in the Fortran 1995 standard.", "end": "(?=[;!\\n])", "patterns": [{ "include": "#parentheses" }, { "include": "#invalid-word" }] }, "word": { "patterns": [{ "match": "(?i)(?:\\G|(?<=\\%))\\s*\\b([a-z]\\w*)\\b" }] } }, "scopeName": "source.fortran.free", "aliases": ["f90", "f95", "f03", "f08", "f18"] });
|
|
var fortran_free_form = [
|
|
lang
|
|
];
|
|
|
|
export { fortran_free_form as default };
|