// This is a TextMate grammar distributed by `starry-night`. // This grammar is developed at // // and licensed `mit`. // See for more info. /** * @import {Grammar} from '@wooorm/starry-night' */ /** @type {Grammar} */ const grammar = { extensions: ['.c3'], names: ['c3'], patterns: [{include: '#top_level'}, {include: '#statements'}], repository: { assign_right_expression: { begin: '=', beginCaptures: {0: {name: 'keyword.operator.assignment.c3'}}, end: '(?=;)', patterns: [{include: '#comments'}, {include: '#expression'}] }, attribute: { patterns: [ { begin: '@(?:(?:align|allow_deprecated|benchmark|bigendian|builtin|callconv|cname|compact|const|deprecated|dynamic|export|extern|finalizer|format|if|inline|init|jump|link|littleendian|local|maydiscard|naked|noalias|nodiscard|noinit|noinline|nopadding|norecurse|noreturn|nosanitize|nostrip|obfuscate|operator|operator_r|operator_s|optional|overlap|packed|private|public|pure|reflect|safeinfer|safemacro|simd|section|structlike|tag|test|unused|used|wasm|weak|winmain)\\b|(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b))', beginCaptures: {0: {name: 'keyword.annotation.c3'}}, end: '(?=[^ \\t(])|(?<=\\))', name: 'meta.annotation.c3', patterns: [{include: '#parens'}] } ] }, block: { patterns: [ { begin: '\\{', beginCaptures: {0: {name: 'punctuation.section.block.begin.c3'}}, end: '\\}', endCaptures: {0: {name: 'punctuation.section.block.end.c3'}}, name: 'meta.block.c3', patterns: [{include: '#statements'}] } ] }, block_comment: { begin: '/\\*', beginCaptures: {0: {name: 'punctuation.definition.comment.begin.c3'}}, end: '\\*/', endCaptures: {0: {name: 'punctuation.definition.comment.end.c3'}}, name: 'comment.block.c3', patterns: [{include: '#block_comment_body'}] }, block_comment_body: { patterns: [ { begin: '/\\*', end: '\\*/', patterns: [{include: '#block_comment_body'}] } ] }, brackets: { patterns: [ { begin: '\\[?\\]', endCaptures: {0: {name: 'punctuation.section.brackets.end.c3'}}, name: 'meta.brackets.c3', patterns: [{include: '#expression'}] } ] }, builtin: { patterns: [ { captures: { 1: {name: 'constant.language.c3'}, 2: {name: 'entity.name.function.builtin.c3'} }, match: '(\\$\\$(?:\\b_*[A-Z][_A-Z0-9]*\\b))|(\\$\\$(?:\\b_*[a-z][_a-zA-Z0-9]*\\b))' } ] }, bytes_literal: { patterns: [ { begin: '(x)(["\'`])', beginCaptures: { 1: {name: 'keyword.other.c3'}, 2: {name: 'punctuation.definition.string.begin.c3'} }, end: '\\2', endCaptures: {0: {name: 'punctuation.definition.string.end.c3'}}, name: 'string.quoted.other.c3', patterns: [ {match: '[\\sfA-Fa-f0-9]+', name: 'constant.numeric.integer.c3'} ] }, { begin: '(b64)(["\'`])', beginCaptures: { 1: {name: 'keyword.other.c3'}, 2: {name: 'punctuation.definition.string.begin.c3'} }, end: '\\2', endCaptures: {0: {name: 'punctuation.definition.string.end.c3'}}, name: 'string.quoted.other.c3', patterns: [ {match: '[\\sA-Za-z0-9+/=]+', name: 'constant.numeric.integer.c3'} ] } ] }, char_literal: { begin: "'", beginCaptures: {0: {name: 'punctuation.definition.string.begin.c3'}}, end: "'", endCaptures: {0: {name: 'punctuation.definition.string.end.c3'}}, name: 'string.quoted.single.c3', patterns: [{include: '#escape_sequence'}] }, comments: { patterns: [ {include: '#line_comment'}, {include: '#block_comment'}, {include: '#doc_comment'} ] }, constants: { patterns: [ {match: '\\b(true|false|null)\\b', name: 'constant.language.c3'}, { begin: '(?:\\b_*[A-Z][_A-Z0-9]*\\b)', beginCaptures: {0: {name: 'variable.other.constant.c3'}}, end: '(?=[^{ \\t])|(?<=\\})', patterns: [{include: '#generic_params'}] } ] }, control_statements: { patterns: [ { begin: '\\$for\\b', beginCaptures: {0: {name: 'keyword.control.ct.c3'}}, end: ':', endCaptures: {0: {name: 'punctuation.separator.c3'}}, patterns: [{include: '#statements'}] }, { begin: '\\$foreach\\b', beginCaptures: {0: {name: 'keyword.control.ct.c3'}}, end: '(?<=:)', patterns: [ {include: '#comments'}, { match: '\\$(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', name: 'variable.other.c3' }, {match: ',', name: 'punctuation.separator.c3'}, { begin: ':', beginCaptures: {0: {name: 'keyword.operator.c3'}}, end: ':', endCaptures: {0: {name: 'punctuation.separator.c3'}}, patterns: [{include: '#expression'}] } ] }, { begin: '\\bfor\\b', beginCaptures: {0: {name: 'keyword.control.c3'}}, end: '(?<=\\))', patterns: [ {include: '#comments'}, { begin: '\\(', beginCaptures: {0: {name: 'punctuation.section.group.begin.c3'}}, end: '\\)', endCaptures: {0: {name: 'punctuation.section.group.end.c3'}}, patterns: [{include: '#statements'}] } ] }, { begin: '\\$(?:switch|case|default|if)\\b', beginCaptures: {0: {name: 'keyword.control.ct.c3'}}, end: ':', endCaptures: {0: {name: 'punctuation.separator.c3'}}, patterns: [{include: '#expression'}] }, { begin: '\\b(?:case|default)\\b', beginCaptures: {0: {name: 'keyword.control.c3'}}, end: ':', endCaptures: {0: {name: 'punctuation.separator.c3'}}, patterns: [{include: '#expression'}] } ] }, doc_comment: { begin: '(?=<\\*)', end: '(\\*>)', endCaptures: { 0: {name: 'comment.block.documentation.c3'}, 1: {name: 'punctuation.definition.comment.end.c3'} }, patterns: [{include: '#doc_comment_body'}] }, doc_comment_body: { patterns: [ { begin: '(<\\*)\\s*(?=@)', beginCaptures: { 0: {name: 'comment.block.documentation.c3'}, 1: {name: 'punctuation.definition.comment.begin.c3'} }, end: '(?=\\*>)', patterns: [ { captures: { 0: {name: 'comment.block.documentation.c3'}, 1: {name: 'variable.parameter.c3'}, 2: {name: 'support.type.c3'}, 3: {name: 'keyword.operator.variadic.c3'} }, match: '@param(?:\\s*\\[&?(?:in|out|inout)\\])?\\s*(?:([$#]?(?:\\b_*[a-z][_a-zA-Z0-9]*\\b))|(\\$(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b))|(\\.\\.\\.))' }, { begin: '@(?:require\\b|ensure\\b|return\\?)', beginCaptures: {0: {name: 'comment.block.documentation.c3'}}, end: '(?=:|\\*>|$)', patterns: [{include: '#expression'}] }, { match: '@(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', name: 'comment.block.documentation.c3' }, {match: ':', name: 'comment.block.documentation.c3'}, { begin: '(["`])', end: '\\\\1', name: 'comment.block.documentation.c3' } ] }, { begin: '(<\\*)', beginCaptures: { 0: {name: 'comment.block.documentation.c3'}, 1: {name: 'punctuation.definition.comment.begin.c3'} }, end: '(?=^\\s*@|\\*>)', name: 'comment.block.documentation.c3' }, { end: '(?=\\*>)', patterns: [ { captures: { 0: {name: 'comment.block.documentation.c3'}, 1: {name: 'variable.parameter.c3'}, 2: {name: 'support.type.c3'}, 3: {name: 'keyword.operator.variadic.c3'} }, match: '^\\s*@param(?:\\s*\\[&?(?:in|out|inout)\\])?\\s*(?:([$#]?(?:\\b_*[a-z][_a-zA-Z0-9]*\\b))|(\\$(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b))|(\\.\\.\\.))' }, { begin: '^\\s*@(?:require\\b|ensure\\b|return\\?)', beginCaptures: {0: {name: 'comment.block.documentation.c3'}}, end: '(?=:|\\*>|$)', patterns: [{include: '#expression'}] }, { match: '^\\s*@(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', name: 'comment.block.documentation.c3' }, {match: ':', name: 'comment.block.documentation.c3'}, { begin: '(["`])', end: '\\\\1', name: 'comment.block.documentation.c3' } ] } ] }, escape_sequence: { match: '\\\\([0abefnrtv\'"\\\\]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})', name: 'constant.character.escape.c3' }, expression: { patterns: [ {include: '#comments'}, {include: '#function'}, {include: '#constants'}, {include: '#builtin'}, {include: '#literals'}, {include: '#operators'}, {include: '#keywords'}, {include: '#type'}, {include: '#path'}, {include: '#function_call'}, {include: '#variable'}, {include: '#parens'}, {include: '#brackets'}, {include: '#block'}, {include: '#punctuation'}, {include: '#leftover_at_ident'} ] }, function: { begin: '(?=\\b(fn|macro)\\b)', end: '(?=[={;])', patterns: [ { begin: '\\b(fn|macro)\\b', beginCaptures: {1: {name: 'keyword.declaration.function.c3'}}, end: '(?=\\()', name: 'meta.function.c3', patterns: [{include: '#comments'}, {include: '#function_header'}] }, { begin: '\\(', beginCaptures: {0: {name: 'punctuation.section.group.begin.c3'}}, end: '\\)', endCaptures: {0: {name: 'punctuation.section.group.end.c3'}}, name: 'meta.function.parameters.c3', patterns: [{include: '#parameters'}] }, { begin: '(?<=\\))', contentName: 'meta.function.c3', end: '(?=[{=;])', patterns: [{include: '#comments'}, {include: '#attribute'}] } ] }, function_call: { begin: '([@#]?(?:\\b_*[a-z][_a-zA-Z0-9]*\\b))(?=\\s*(\\{.*\\})?\\s*\\()', beginCaptures: {1: {name: 'entity.name.function.c3'}}, end: '(?<=\\))', name: 'meta.function_call.c3', patterns: [ {include: '#generic_params'}, { begin: '\\(', beginCaptures: {0: {name: 'punctuation.section.group.begin.c3'}}, end: '\\)', endCaptures: {0: {name: 'punctuation.section.group.end.c3'}}, name: 'meta.group.c3', patterns: [ {include: '#comments'}, { begin: '([$#]?(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)|\\$(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b))\\s*(:)(?!:)', beginCaptures: { 1: {name: 'variable.parameter.c3'}, 2: {name: 'punctuation.separator.c3'} }, end: '(?=\\))|([;,])', endCaptures: {1: {name: 'punctuation.separator.c3'}}, patterns: [{include: '#expression'}] }, { begin: '(?=\\S)', end: '(?=\\))|([;,])', endCaptures: {1: {name: 'punctuation.separator.c3'}}, patterns: [{include: '#expression'}] }, {match: ';', name: 'punctuation.separator.c3'} ] } ] }, function_header: { patterns: [ {include: '#type'}, {match: '\\.', name: 'punctuation.accessor.c3'}, { match: '@?(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', name: 'entity.name.function.c3' } ] }, generic_params: { patterns: [ { begin: '\\{', beginCaptures: {0: {name: 'punctuation.definition.generic.begin.c3'}}, end: '\\}', endCaptures: {0: {name: 'punctuation.definition.generic.end.c3'}}, name: 'meta.generic.c3', patterns: [{include: '#expression'}] } ] }, integer_literal: { match: '\\b(?:0[xX][a-fA-F0-9](?:_?[a-fA-F0-9])*|0[oO][0-7](_?[0-7])*|0[bB][0-1](_?[0-1])*|[0-9](?:_?[0-9])*)(?:[UuIi](?:8|16|32|64|128)|[Uu][Ll]{0,2}|[Ll]{1,2})?', name: 'constant.numeric.integer.c3' }, keywords: { patterns: [ { match: '\\$(?:alignof|assert|assignable|default|defined|echo|embed|eval|error|exec|extnameof|feature|include|is_const|kindof|nameof|offsetof|qnameof|sizeof|stringify|vacount|vaconst|vaarg|vaexpr|vasplat)\\b', name: 'keyword.other.ct.c3' }, { match: '\\$(?:case|else|endfor|endforeach|endif|endswitch|for|foreach|if|switch)\\b', name: 'keyword.control.ct.c3' }, { match: '\\b(?:assert|asm|catch|inline|import|module|interface|try|var)\\b', name: 'keyword.other.c3' }, { match: '\\b(?:break|case|continue|default|defer|do|else|for|foreach|foreach_r|if|nextcase|return|switch|while)\\b', name: 'keyword.control.c3' } ] }, leftover_at_ident: { patterns: [ { captures: {0: {name: 'keyword.annotation.c3'}}, match: '@(?:pure|inline|noinline)', name: 'meta.annotation.c3' }, { begin: '@(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', beginCaptures: {0: {name: 'entity.name.function.c3'}}, end: '(?=[^{ \\t])|(?<=\\})', patterns: [{include: '#generic_params'}] } ] }, line_comment: {match: '//.*$', name: 'comment.line.double-slash.c3'}, literals: { patterns: [ {include: '#string_literal'}, {include: '#char_literal'}, {include: '#raw_string_literal'}, {include: '#real_literal'}, {include: '#integer_literal'}, {include: '#bytes_literal'} ] }, modifier_keywords: { patterns: [ { match: '\\b(?:const|extern|static|tlocal|inline)\\b', name: 'storage.modifier.c3' } ] }, module_path: { patterns: [ {include: '#path'}, { captures: {1: {name: 'entity.name.scope-resolution.c3'}}, match: '((?:\\b_*[a-z][_a-zA-Z0-9]*\\b))', name: 'meta.path.c3' } ] }, operators: { patterns: [ {match: '=>', name: 'keyword.declaration.function.arrow.c3'}, { match: '(?:[-%&*+/^|]|>>|<<|\\+\\+\\+)=', name: 'keyword.operator.assignment.augmented.c3' }, {match: '<=|>=|==|<|>|!=', name: 'keyword.operator.comparison.c3'}, {match: '\\.\\.\\.', name: 'keyword.operator.variadic.c3'}, {match: '\\.\\.', name: 'keyword.operator.range.c3'}, {match: '\\+\\+\\+?|--', name: 'keyword.operator.arithmetic.c3'}, { match: '<<|>>|&&&?|\\|\\|\\|?', name: 'keyword.operator.arithmetic.c3' }, {match: '[-%+/^|~]', name: 'keyword.operator.arithmetic.c3'}, {match: '=', name: 'keyword.operator.assignment.c3'}, {match: '\\?\\?\\??|\\?:|[!?]|[&*:]', name: 'keyword.operator.c3'} ] }, parameters: { patterns: [ {include: '#comments'}, { begin: '\\$(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)', beginCaptures: {0: {name: 'support.type.c3'}}, end: '(?=[;,)])', patterns: [ {include: '#comments'}, {include: '#attribute'}, { begin: '=', beginCaptures: {0: {name: 'keyword.operator.assignment.c3'}}, end: '(?=[;,)])', patterns: [{include: '#expression'}] } ] }, {include: '#type'}, {include: '#punctuation'}, {match: '\\.\\.\\.', name: 'keyword.operator.variadic.c3'}, {match: '&', name: 'keyword.operator.address.c3'}, { begin: ';', beginCaptures: {0: {name: 'punctuation.separator.c3'}}, end: '(?=\\))', patterns: [ {include: '#comments'}, { match: '@(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', name: 'entity.name.function.c3' }, {include: '#parameters'} ] }, { begin: '[$#]?(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', beginCaptures: {0: {name: 'variable.parameter.c3'}}, end: '(?=[;,)])', patterns: [ {include: '#comments'}, {include: '#attribute'}, {match: '\\.\\.\\.', name: 'keyword.operator.variadic.c3'}, { begin: '=', beginCaptures: {0: {name: 'keyword.operator.assignment.c3'}}, end: '(?=[;,)])', patterns: [{include: '#expression'}] } ] } ] }, parens: { patterns: [ { begin: '\\(', beginCaptures: {0: {name: 'punctuation.section.group.begin.c3'}}, end: '\\)', endCaptures: {0: {name: 'punctuation.section.group.end.c3'}}, name: 'meta.group.c3', patterns: [{include: '#expression'}] } ] }, path: { captures: { 1: {name: 'entity.name.scope-resolution.c3'}, 2: {name: 'punctuation.separator.scope-resolution.c3'} }, match: '((?:\\b_*[a-z][_a-zA-Z0-9]*\\b))\\s*(::)', name: 'meta.path.c3' }, punctuation: { patterns: [ {match: ',', name: 'punctuation.separator.c3'}, {match: ':', name: 'punctuation.separator.c3'}, {match: '\\.(?!\\.\\.)', name: 'punctuation.accessor.c3'} ] }, raw_string_literal: { begin: '`', beginCaptures: {0: {name: 'punctuation.definition.string.begin.c3'}}, end: '`(?!`)', endCaptures: {0: {name: 'punctuation.definition.string.end.c3'}}, name: 'string.quoted.other.c3', patterns: [{match: '``', name: 'constant.character.escape.c3'}] }, real_literal: { patterns: [ { match: '\\b[0-9](?:_?[0-9])*(?:[Ff](?:16|32|64|128)?|[Dd])', name: 'constant.numeric.float.c3' }, { match: '\\b(?:[0-9](?:_?[0-9])*[Ee][+-]?[0-9]+|[0-9](?:_?[0-9])*\\.(?!\\.)(?:[0-9](?:_?[0-9])*)?(?:[Ee][+-]?[0-9]+)?)(?:[Ff](?:16|32|64|128)?|[Dd])?', name: 'constant.numeric.float.c3' }, { match: '\\b0[xX][a-fA-F0-9](?:_?[a-fA-F0-9])*(?:\\.(?:[a-fA-F0-9](?:_?[a-fA-F0-9])*)?)?[Pp][+-]?[0-9]+(?:[Ff](?:16|32|64|128)?|[Dd])?', name: 'constant.numeric.float.c3' } ] }, statements: { patterns: [ {include: '#comments'}, {include: '#modifier_keywords'}, {match: ';', name: 'punctuation.terminator.c3'}, {include: '#control_statements'}, {include: '#attribute'}, {include: '#block'}, {include: '#expression'} ] }, string_literal: { begin: '"', beginCaptures: {0: {name: 'punctuation.definition.string.begin.c3'}}, end: '"', endCaptures: {0: {name: 'punctuation.definition.string.end.c3'}}, name: 'string.quoted.double.c3', patterns: [{include: '#escape_sequence'}] }, structlike: { begin: '(?=\\b(?:(struct|bitstruct)|(union))\\b)', end: '(?<=\\})', patterns: [ { begin: '\\b(?:(struct|bitstruct)|(union))\\b', beginCaptures: { 1: {name: 'keyword.declaration.struct.c3'}, 2: {name: 'keyword.declaration.union.c3'} }, end: '(?=\\{)', name: 'meta.struct.c3', patterns: [ {include: '#comments'}, { match: '(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)', name: 'entity.name.type.struct.c3' }, { match: '(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', name: 'variable.other.member.c3' }, {include: '#attribute'}, { begin: ':', beginCaptures: {0: {name: 'punctuation.separator.c3'}}, end: '(?=\\{)', patterns: [ {include: '#comments'}, {include: '#type_no_generics'}, {include: '#attribute'} ] }, { begin: '\\(', beginCaptures: {0: {name: 'punctuation.section.group.begin.c3'}}, end: '\\)', endCaptures: {0: {name: 'punctuation.section.group.end.c3'}}, name: 'meta.group.c3', patterns: [ {include: '#comments'}, {include: '#path'}, {include: '#type'}, {include: '#punctuation'} ] } ] }, { begin: '\\{', beginCaptures: {0: {name: 'punctuation.section.block.begin.c3'}}, end: '\\}', endCaptures: {0: {name: 'punctuation.section.block.end.c3'}}, name: 'meta.struct.body.c3', patterns: [ {include: '#comments'}, {include: '#structlike'}, {include: '#modifier_keywords'}, {include: '#type'}, { match: '(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)', name: 'variable.other.member.c3' }, {include: '#attribute'}, {match: ';', name: 'punctuation.terminator.c3'}, { begin: ':', beginCaptures: {0: {name: 'punctuation.separator.c3'}}, end: '(?=;)', patterns: [{include: '#attribute'}, {include: '#expression'}] } ] } ] }, top_level: { patterns: [ {include: '#comments'}, {include: '#modifier_keywords'}, { begin: '\\$(?:assert|include|echo|exec)\\b', beginCaptures: {0: {name: 'keyword.other.c3'}}, end: ';', endCaptures: {0: {name: 'punctuation.terminator.c3'}}, patterns: [{include: '#comments'}, {include: '#expression'}] }, { begin: '\\bmodule\\b', beginCaptures: {0: {name: 'keyword.declaration.module.c3'}}, end: ';', endCaptures: {0: {name: 'punctuation.terminator.c3'}}, name: 'meta.module.c3', patterns: [ {include: '#comments'}, {include: '#attribute'}, {include: '#module_path'}, {include: '#generic_params'} ] }, { begin: '\\bimport\\b', beginCaptures: {0: {name: 'keyword.declaration.import.c3'}}, end: ';', endCaptures: {0: {name: 'punctuation.terminator.c3'}}, name: 'meta.import.c3', patterns: [ {include: '#comments'}, {include: '#attribute'}, {include: '#module_path'}, {match: ',', name: 'punctuation.separator.c3'} ] }, {include: '#function'}, { begin: '\\balias\\b', beginCaptures: {0: {name: 'keyword.declaration.alias.c3'}}, end: ';', endCaptures: {0: {name: 'punctuation.terminator.c3'}}, name: 'meta.alias.c3', patterns: [ {include: '#comments'}, { begin: '(?=((?:\\b_*[a-z][_a-zA-Z0-9]*\\b))\\s*=\\s*module)', end: '(?=;)', patterns: [ { begin: '((?:\\b_*[a-z][_a-zA-Z0-9]*\\b))', end: '(?=;)', patterns: [ {include: '#comments'}, {include: '#attribute'}, { begin: '=', beginCaptures: { 0: {name: 'keyword.operator.assignment.c3'} }, end: '(?=;)', patterns: [ {include: '#comments'}, { begin: 'module', beginCaptures: { 0: {name: 'keyword.declaration.module.c3'} }, end: '(?=;)', patterns: [ {include: '#comments'}, {include: '#module_path'} ] } ] } ] } ] }, { begin: '(@(?:\\b_*[a-z][_a-zA-Z0-9]*\\b))|((?:\\b_*[a-z][_a-zA-Z0-9]*\\b))|((?:\\b_*[A-Z][_A-Z0-9]*\\b))', beginCaptures: { 1: {name: 'entity.name.function.c3'}, 2: {name: 'variable.global.c3'}, 3: {name: 'variable.other.constant.c3'} }, end: '(?=;)', patterns: [ {include: '#comments'}, {include: '#attribute'}, {include: '#assign_right_expression'} ] }, { begin: '(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)', beginCaptures: {0: {name: 'entity.name.type.c3'}}, end: '(?=;)', patterns: [ {include: '#comments'}, {include: '#attribute'}, {include: '#assign_right_expression'} ] } ] }, { begin: '\\btypedef\\b', beginCaptures: {0: {name: 'keyword.declaration.typedef.c3'}}, end: ';', endCaptures: {0: {name: 'punctuation.terminator.c3'}}, name: 'meta.typedef.c3', patterns: [ {include: '#comments'}, { begin: '(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)', beginCaptures: {0: {name: 'entity.name.type.c3'}}, end: '(?=;)', patterns: [ {include: '#comments'}, {include: '#parens'}, {include: '#attribute'}, {include: '#assign_right_expression'} ] } ] }, { begin: '\\bfaultdef\\b', beginCaptures: {0: {name: 'keyword.declaration.faultdef.c3'}}, end: ';', endCaptures: {0: {name: 'punctuation.terminator.c3'}}, name: 'meta.faultdef.c3', patterns: [ {include: '#comments'}, {include: '#attribute'}, { match: '(?:\\b_*[A-Z][_A-Z0-9]*\\b)', name: 'variable.other.constant.c3' }, {match: ',', name: 'punctuation.separator.c3'} ] }, { begin: '\\battrdef\\b', beginCaptures: {0: {name: 'keyword.declaration.attrdef.c3'}}, end: ';', endCaptures: {0: {name: 'punctuation.terminator.c3'}}, name: 'meta.attrdef.c3', patterns: [ {include: '#comments'}, { begin: '@(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)', beginCaptures: {0: {name: 'keyword.annotation.c3'}}, end: '(?=;)', patterns: [ {include: '#comments'}, {include: '#attribute'}, { begin: '\\(', beginCaptures: { 0: {name: 'punctuation.section.group.begin.c3'} }, end: '\\)', endCaptures: {0: {name: 'punctuation.section.group.end.c3'}}, name: 'meta.group.c3', patterns: [{include: '#parameters'}] }, { begin: '=', beginCaptures: {0: {name: 'keyword.operator.assignment.c3'}}, end: '(?=;)', patterns: [ {include: '#comments'}, {include: '#attribute'}, {match: ',', name: 'punctuation.separator.c3'} ] } ] } ] }, {include: '#structlike'}, { begin: '(?=\\benum\\b)', end: '(?<=\\})', patterns: [ { begin: '\\benum\\b', beginCaptures: {0: {name: 'keyword.declaration.enum.c3'}}, end: '(?=\\{)', name: 'meta.enum.c3', patterns: [ {include: '#comments'}, { match: '(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)', name: 'entity.name.type.enum.c3' }, {include: '#attribute'}, { begin: ':', beginCaptures: {0: {name: 'punctuation.separator.c3'}}, end: '(?=\\{)', patterns: [ {include: '#comments'}, { match: '\\b(?:inline|const)\\b', name: 'storage.modifier.c3' }, {include: '#type_no_generics'}, { begin: '\\(', beginCaptures: { 0: {name: 'punctuation.section.group.begin.c3'} }, contentName: 'meta.group.c3', end: '\\)', endCaptures: { 0: {name: 'punctuation.section.group.end.c3'} }, patterns: [ {include: '#comments'}, { match: '\\b(?:inline|const)\\b', name: 'storage.modifier.c3' }, {include: '#parameters'} ] }, {include: '#attribute'} ] } ] }, { begin: '\\{', beginCaptures: {0: {name: 'punctuation.section.block.begin.c3'}}, end: '\\}', endCaptures: {0: {name: 'punctuation.section.block.end.c3'}}, name: 'meta.enum.body.c3', patterns: [ {include: '#comments'}, { begin: '=', beginCaptures: {0: {name: 'keyword.operator.assignment.c3'}}, end: '(?=,)', patterns: [{include: '#expression'}] }, {include: '#attribute'}, { match: '(?:\\b_*[A-Z][_A-Z0-9]*\\b)', name: 'variable.other.constant.c3' }, {match: ',', name: 'punctuation.separator.c3'} ] } ] }, { begin: '(?=\\binterface\\b)', end: '(?<=\\})', patterns: [ { begin: '\\binterface\\b', beginCaptures: {0: {name: 'keyword.declaration.interface.c3'}}, end: '(?=\\{)', name: 'meta.interface.c3', patterns: [ {include: '#comments'}, { match: '(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)', name: 'entity.name.type.interface.c3' }, {include: '#attribute'}, { begin: ':', beginCaptures: {0: {name: 'punctuation.separator.c3'}}, end: '(?=\\{)', patterns: [ {include: '#comments'}, {include: '#punctuation'}, {include: '#type_no_generics'} ] } ] }, { begin: '\\{', beginCaptures: {0: {name: 'punctuation.section.block.begin.c3'}}, end: '\\}', endCaptures: {0: {name: 'punctuation.section.block.end.c3'}}, name: 'meta.interface.body.c3', patterns: [ {include: '#comments'}, {match: ';', name: 'punctuation.terminator.c3'}, {include: '#function'} ] } ] } ] }, type: { patterns: [ {include: '#path'}, { begin: '\\b(void|bool|char|double|float|float16|bfloat|int128|ichar|int|iptr|isz|long|short|uint128|uint|ulong|uptr|ushort|usz|float128|any|fault|typeid)\\b|(\\$?\\b(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)\\b)', beginCaptures: { 1: {name: 'storage.type.built-in.primitive.c3'}, 2: {name: 'support.type.c3'} }, end: '(?=\\*>|[^ \\t*\\[?{])', patterns: [ {include: '#comments'}, {include: '#generic_params'}, {include: '#type_suffix'} ] }, {include: '#type_expr'} ] }, type_expr: { patterns: [ { begin: '\\$(?:typeof|typefrom|evaltype)\\b', beginCaptures: {0: {name: 'storage.type.c3'}}, end: '(?<=\\))', patterns: [{include: '#parens'}] }, { begin: '\\$vatype\\b', beginCaptures: {0: {name: 'storage.type.c3'}}, end: '(?<=\\])', patterns: [{include: '#brackets'}] }, {include: '#type_suffix'} ] }, type_no_generics: { patterns: [ {include: '#path'}, { begin: '\\b(void|bool|char|double|float|float16|bfloat|int128|ichar|int|iptr|isz|long|short|uint128|uint|ulong|uptr|ushort|usz|float128|any|fault|typeid)\\b|(\\$?\\b(?:\\b_*[A-Z][_A-Z0-9]*[a-z][_a-zA-Z0-9]*\\b)\\b)', beginCaptures: { 1: {name: 'storage.type.built-in.primitive.c3'}, 2: {name: 'support.type.c3'} }, end: '(?=[^ \\t*\\[?@])', patterns: [{include: '#comments'}, {include: '#type_suffix'}] }, {include: '#type_expr'} ] }, type_suffix: { patterns: [ {include: '#brackets'}, {match: '\\*', name: 'keyword.operator.address.c3'}, {match: '\\?', name: 'keyword.operator.c3'} ] }, variable: { begin: '(?