@wooorm/starry-night
Version:
Syntax highlighting, like GitHub
1,071 lines (1,068 loc) • 36.2 kB
JavaScript
// This is a TextMate grammar distributed by `starry-night`.
// This grammar is developed at
// <https://github.com/c3lang/vscode-c3>
// and licensed `mit`.
// See <https://github.com/wooorm/starry-night> 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: '\\[<?',
beginCaptures: {0: {name: 'punctuation.section.brackets.begin.c3'}},
end: '>?\\]',
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: '(?<!#)\\$?(?:\\b_*[a-z][_a-zA-Z0-9]*\\b)',
beginCaptures: {0: {name: 'variable.other.c3'}},
end: '(?=[^{ \\t])|(?<=\\})',
patterns: [{include: '#generic_params'}]
}
},
scopeName: 'source.c3'
}
export default grammar