pythonLanguage top-level constant
Language
const pythonLanguage
Python (source.python).
Implementation
const pythonLanguage = Language(
name: 'python',
scopeName: 'source.python',
displayName: 'Python',
aliases: ['py'],
grammar: <String, Object?>{
'displayName': 'Python',
'name': 'python',
'patterns': [
{'include': '#statement'},
{'include': '#expression'},
],
'repository': {
'annotated-parameter': {
'begin': '\\b([_[:alpha:]]\\w*)\\s*(:)',
'beginCaptures': {
'1': {'name': 'variable.parameter.function.language.python'},
'2': {'name': 'punctuation.separator.annotation.python'},
},
'end': '(,)|(?=\\))',
'endCaptures': {
'1': {'name': 'punctuation.separator.parameters.python'},
},
'patterns': [
{'include': '#expression'},
{'match': '=(?!=)', 'name': 'keyword.operator.assignment.python'},
],
},
'assignment-operator': {
'match':
'<<=|>>=|//=|\\*\\*=|\\+=|-=|/=|@=|\\*=|%=|~=|\\^=|&=|\\|=|=(?!=)',
'name': 'keyword.operator.assignment.python',
},
'backticks': {
'begin': '`',
'end': '`|(?<!\\\\)(\\n)',
'name': 'invalid.deprecated.backtick.python',
'patterns': [
{'include': '#expression'},
],
},
'builtin-callables': {
'patterns': [
{'include': '#illegal-names'},
{'include': '#illegal-object-name'},
{'include': '#builtin-exceptions'},
{'include': '#builtin-functions'},
{'include': '#builtin-types'},
],
},
'builtin-exceptions': {
'match':
'(?<!\\.)\\b((Arithmetic|Assertion|Attribute|Buffer|BlockingIO|BrokenPipe|ChildProcess|(Connection(Aborted|Refused|Reset)?)|EOF|Environment|FileExists|FileNotFound|FloatingPoint|IO|Import|Indentation|Index|Interrupted|IsADirectory|NotADirectory|Permission|ProcessLookup|Timeout|Key|Lookup|Memory|Name|NotImplemented|OS|Overflow|Reference|Runtime|Recursion|Syntax|System|Tab|Type|UnboundLocal|Unicode(Encode|Decode|Translate)?|Value|Windows|ZeroDivision|ModuleNotFound)Error|((Pending)?Deprecation|Runtime|Syntax|User|Future|Import|Unicode|Bytes|Resource)?Warning|SystemExit|Stop(Async)?Iteration|KeyboardInterrupt|GeneratorExit|(Base)?Exception)\\b',
'name': 'support.type.exception.python',
},
'builtin-functions': {
'patterns': [
{
'match':
'(?<!\\.)\\b(__import__|abs|aiter|all|any|anext|ascii|bin|breakpoint|callable|chr|compile|copyright|credits|delattr|dir|divmod|enumerate|eval|exec|exit|filter|format|getattr|globals|hasattr|hash|help|hex|id|input|isinstance|issubclass|iter|len|license|locals|map|max|memoryview|min|next|oct|open|ord|pow|print|quit|range|reload|repr|reversed|round|setattr|sorted|sum|vars|zip)\\b',
'name': 'support.function.builtin.python',
},
{
'match':
'(?<!\\.)\\b(file|reduce|intern|raw_input|unicode|cmp|basestring|execfile|long|xrange)\\b',
'name': 'variable.legacy.builtin.python',
},
],
},
'builtin-possible-callables': {
'patterns': [
{'include': '#builtin-callables'},
{'include': '#magic-names'},
],
},
'builtin-types': {
'match':
'(?<!\\.)\\b(bool|bytearray|bytes|classmethod|complex|dict|float|frozenset|int|list|object|property|set|slice|staticmethod|str|tuple|type|super)\\b',
'name': 'support.type.python',
},
'call-wrapper-inheritance': {
'begin': '\\b(?=([_[:alpha:]]\\w*)\\s*(\\())',
'end': '(\\))',
'endCaptures': {
'1': {'name': 'punctuation.definition.arguments.end.python'},
},
'name': 'meta.function-call.python',
'patterns': [
{'include': '#inheritance-name'},
{'include': '#function-arguments'},
],
},
'class-declaration': {
'patterns': [
{
'begin': '\\s*(class)\\s+(?=[_[:alpha:]]\\w*\\s*([(:]))',
'beginCaptures': {
'1': {'name': 'storage.type.class.python'},
},
'end': '(:)',
'endCaptures': {
'1': {'name': 'punctuation.section.class.begin.python'},
},
'name': 'meta.class.python',
'patterns': [
{'include': '#class-name'},
{'include': '#class-inheritance'},
],
},
],
},
'class-inheritance': {
'begin': '(\\()',
'beginCaptures': {
'1': {'name': 'punctuation.definition.inheritance.begin.python'},
},
'end': '(\\))',
'endCaptures': {
'1': {'name': 'punctuation.definition.inheritance.end.python'},
},
'name': 'meta.class.inheritance.python',
'patterns': [
{
'match': '(\\*\\*?)',
'name': 'keyword.operator.unpacking.arguments.python',
},
{'match': ',', 'name': 'punctuation.separator.inheritance.python'},
{'match': '=(?!=)', 'name': 'keyword.operator.assignment.python'},
{'match': '\\bmetaclass\\b', 'name': 'support.type.metaclass.python'},
{'include': '#illegal-names'},
{'include': '#class-kwarg'},
{'include': '#call-wrapper-inheritance'},
{'include': '#expression-base'},
{'include': '#member-access-class'},
{'include': '#inheritance-identifier'},
],
},
'class-kwarg': {
'captures': {
'1': {
'name':
'entity.other.inherited-class.python variable.parameter.class.python',
},
'2': {'name': 'keyword.operator.assignment.python'},
},
'match': '\\b([_[:alpha:]]\\w*)\\s*(=)(?!=)',
},
'class-name': {
'patterns': [
{'include': '#illegal-object-name'},
{'include': '#builtin-possible-callables'},
{
'match': '\\b([_[:alpha:]]\\w*)\\b',
'name': 'entity.name.type.class.python',
},
],
},
'codetags': {
'captures': {
'1': {'name': 'keyword.codetag.notation.python'},
},
'match': '\\b(NOTE|XXX|HACK|FIXME|BUG|TODO)\\b',
},
'comments': {
'patterns': [
{
'begin': '#\\s*(type:)\\s*+(?!\$|#)',
'beginCaptures': {
'0': {'name': 'meta.typehint.comment.python'},
'1': {'name': 'comment.typehint.directive.notation.python'},
},
'contentName': 'meta.typehint.comment.python',
'end': '\$|(?=#)',
'name': 'comment.line.number-sign.python',
'patterns': [
{
'match': '\\Gignore(?=\\s*(?:\$|#))',
'name': 'comment.typehint.ignore.notation.python',
},
{
'match':
'(?<!\\.)\\b(bool|bytes|float|int|object|str|List|Dict|Iterable|Sequence|Set|FrozenSet|Callable|Union|Tuple|Any|None)\\b',
'name': 'comment.typehint.type.notation.python',
},
{
'match': '([]()*,.=\\[]|(->))',
'name': 'comment.typehint.punctuation.notation.python',
},
{
'match': '([_[:alpha:]]\\w*)',
'name': 'comment.typehint.variable.notation.python',
},
],
},
{'include': '#comments-base'},
],
},
'comments-base': {
'begin': '(#)',
'beginCaptures': {
'1': {'name': 'punctuation.definition.comment.python'},
},
'end': '\$()',
'name': 'comment.line.number-sign.python',
'patterns': [
{'include': '#codetags'},
],
},
'comments-string-double-three': {
'begin': '(#)',
'beginCaptures': {
'1': {'name': 'punctuation.definition.comment.python'},
},
'end': '(\$|(?="""))',
'name': 'comment.line.number-sign.python',
'patterns': [
{'include': '#codetags'},
],
},
'comments-string-single-three': {
'begin': '(#)',
'beginCaptures': {
'1': {'name': 'punctuation.definition.comment.python'},
},
'end': '(\$|(?=\'\'\'))',
'name': 'comment.line.number-sign.python',
'patterns': [
{'include': '#codetags'},
],
},
'curly-braces': {
'begin': '\\{',
'beginCaptures': {
'0': {'name': 'punctuation.definition.dict.begin.python'},
},
'end': '}',
'endCaptures': {
'0': {'name': 'punctuation.definition.dict.end.python'},
},
'patterns': [
{'match': ':', 'name': 'punctuation.separator.dict.python'},
{'include': '#expression'},
],
},
'decorator': {
'begin': '^\\s*((@))\\s*(?=[_[:alpha:]]\\w*)',
'beginCaptures': {
'1': {'name': 'entity.name.function.decorator.python'},
'2': {'name': 'punctuation.definition.decorator.python'},
},
'end': '(\\))(.*?)(?=\\s*(?:#|\$))|(?=[\\n#])',
'endCaptures': {
'1': {'name': 'punctuation.definition.arguments.end.python'},
'2': {'name': 'invalid.illegal.decorator.python'},
},
'name': 'meta.function.decorator.python',
'patterns': [
{'include': '#decorator-name'},
{'include': '#function-arguments'},
],
},
'decorator-name': {
'patterns': [
{'include': '#builtin-callables'},
{'include': '#illegal-object-name'},
{
'captures': {
'2': {'name': 'punctuation.separator.period.python'},
},
'match': '([_[:alpha:]]\\w*)|(\\.)',
'name': 'entity.name.function.decorator.python',
},
{'include': '#line-continuation'},
{
'captures': {
'1': {'name': 'invalid.illegal.decorator.python'},
},
'match': '\\s*([^#(.\\\\_[:alpha:]\\s].*?)(?=#|\$)',
'name': 'invalid.illegal.decorator.python',
},
],
},
'docstring': {
'patterns': [
{
'begin': '(\'\'\'|""")',
'beginCaptures': {
'1': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\1)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
},
'name': 'string.quoted.docstring.multi.python',
'patterns': [
{'include': '#docstring-prompt'},
{'include': '#codetags'},
{'include': '#docstring-guts-unicode'},
],
},
{
'begin': '([Rr])(\'\'\'|""")',
'beginCaptures': {
'1': {'name': 'storage.type.string.python'},
'2': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\2)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
},
'name': 'string.quoted.docstring.raw.multi.python',
'patterns': [
{'include': '#string-consume-escape'},
{'include': '#docstring-prompt'},
{'include': '#codetags'},
],
},
{
'begin': '(["\'])',
'beginCaptures': {
'1': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\1)|(\\n)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.docstring.single.python',
'patterns': [
{'include': '#codetags'},
{'include': '#docstring-guts-unicode'},
],
},
{
'begin': '([Rr])(["\'])',
'beginCaptures': {
'1': {'name': 'storage.type.string.python'},
'2': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\2)|(\\n)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.docstring.raw.single.python',
'patterns': [
{'include': '#string-consume-escape'},
{'include': '#codetags'},
],
},
],
},
'docstring-guts-unicode': {
'patterns': [
{'include': '#escape-sequence-unicode'},
{'include': '#escape-sequence'},
{'include': '#string-line-continuation'},
],
},
'docstring-prompt': {
'captures': {
'1': {'name': 'keyword.control.flow.python'},
},
'match': '(?:^|\\G)\\s*((?:>>>|\\.\\.\\.)\\s)(?=\\s*\\S)',
},
'docstring-statement': {
'begin': '^(?=\\s*[Rr]?(\'\'\'|"""|["\']))',
'end': '((?<=\\1)|^)(?!\\s*[Rr]?(\'\'\'|"""|["\']))',
'patterns': [
{'include': '#docstring'},
],
},
'double-one-regexp-character-set': {
'patterns': [
{'match': '\\[\\^?](?!.*?])'},
{
'begin': '(\\[)(\\^)?(])?',
'beginCaptures': {
'1': {
'name':
'punctuation.character.set.begin.regexp constant.other.set.regexp',
},
'2': {'name': 'keyword.operator.negation.regexp'},
'3': {'name': 'constant.character.set.regexp'},
},
'end': '(]|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'punctuation.character.set.end.regexp constant.other.set.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.character.set.regexp',
'patterns': [
{'include': '#regexp-charecter-set-escapes'},
{'match': '\\N', 'name': 'constant.character.set.regexp'},
],
},
],
},
'double-one-regexp-comments': {
'begin': '\\(\\?#',
'beginCaptures': {
'0': {'name': 'punctuation.comment.begin.regexp'},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {'name': 'punctuation.comment.end.regexp'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'comment.regexp',
'patterns': [
{'include': '#codetags'},
],
},
'double-one-regexp-conditional': {
'begin': '(\\()\\?\\((\\w+(?:\\s+\\p{alnum}+)?|\\d+)\\)',
'beginCaptures': {
'0': {'name': 'keyword.operator.conditional.regexp'},
'1': {'name': 'punctuation.parenthesis.conditional.begin.regexp'},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'double-one-regexp-expression': {
'patterns': [
{'include': '#regexp-base-expression'},
{'include': '#double-one-regexp-character-set'},
{'include': '#double-one-regexp-comments'},
{'include': '#regexp-flags'},
{'include': '#double-one-regexp-named-group'},
{'include': '#regexp-backreference'},
{'include': '#double-one-regexp-lookahead'},
{'include': '#double-one-regexp-lookahead-negative'},
{'include': '#double-one-regexp-lookbehind'},
{'include': '#double-one-regexp-lookbehind-negative'},
{'include': '#double-one-regexp-conditional'},
{'include': '#double-one-regexp-parentheses-non-capturing'},
{'include': '#double-one-regexp-parentheses'},
],
},
'double-one-regexp-lookahead': {
'begin': '(\\()\\?=',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookahead.regexp'},
'1': {'name': 'punctuation.parenthesis.lookahead.begin.regexp'},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'double-one-regexp-lookahead-negative': {
'begin': '(\\()\\?!',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookahead.negative.regexp'},
'1': {'name': 'punctuation.parenthesis.lookahead.begin.regexp'},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'double-one-regexp-lookbehind': {
'begin': '(\\()\\?<=',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookbehind.regexp'},
'1': {'name': 'punctuation.parenthesis.lookbehind.begin.regexp'},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'double-one-regexp-lookbehind-negative': {
'begin': '(\\()\\?<!',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookbehind.negative.regexp'},
'1': {'name': 'punctuation.parenthesis.lookbehind.begin.regexp'},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'double-one-regexp-named-group': {
'begin': '(\\()(\\?P<\\w+(?:\\s+\\p{alnum}+)?>)',
'beginCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp',
},
'2': {'name': 'entity.name.tag.named.group.regexp'},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.named.regexp',
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'double-one-regexp-parentheses': {
'begin': '\\(',
'beginCaptures': {
'0': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp',
},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'double-one-regexp-parentheses-non-capturing': {
'begin': '\\(\\?:',
'beginCaptures': {
'0': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp',
},
},
'end': '(\\)|(?="))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'double-three-regexp-character-set': {
'patterns': [
{'match': '\\[\\^?](?!.*?])'},
{
'begin': '(\\[)(\\^)?(])?',
'beginCaptures': {
'1': {
'name':
'punctuation.character.set.begin.regexp constant.other.set.regexp',
},
'2': {'name': 'keyword.operator.negation.regexp'},
'3': {'name': 'constant.character.set.regexp'},
},
'end': '(]|(?="""))',
'endCaptures': {
'1': {
'name':
'punctuation.character.set.end.regexp constant.other.set.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.character.set.regexp',
'patterns': [
{'include': '#regexp-charecter-set-escapes'},
{'match': '\\N', 'name': 'constant.character.set.regexp'},
],
},
],
},
'double-three-regexp-comments': {
'begin': '\\(\\?#',
'beginCaptures': {
'0': {'name': 'punctuation.comment.begin.regexp'},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {'name': 'punctuation.comment.end.regexp'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'comment.regexp',
'patterns': [
{'include': '#codetags'},
],
},
'double-three-regexp-conditional': {
'begin': '(\\()\\?\\((\\w+(?:\\s+\\p{alnum}+)?|\\d+)\\)',
'beginCaptures': {
'0': {'name': 'keyword.operator.conditional.regexp'},
'1': {'name': 'punctuation.parenthesis.conditional.begin.regexp'},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {
'name':
'keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-three-regexp-expression'},
{'include': '#comments-string-double-three'},
],
},
'double-three-regexp-expression': {
'patterns': [
{'include': '#regexp-base-expression'},
{'include': '#double-three-regexp-character-set'},
{'include': '#double-three-regexp-comments'},
{'include': '#regexp-flags'},
{'include': '#double-three-regexp-named-group'},
{'include': '#regexp-backreference'},
{'include': '#double-three-regexp-lookahead'},
{'include': '#double-three-regexp-lookahead-negative'},
{'include': '#double-three-regexp-lookbehind'},
{'include': '#double-three-regexp-lookbehind-negative'},
{'include': '#double-three-regexp-conditional'},
{'include': '#double-three-regexp-parentheses-non-capturing'},
{'include': '#double-three-regexp-parentheses'},
{'include': '#comments-string-double-three'},
],
},
'double-three-regexp-lookahead': {
'begin': '(\\()\\?=',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookahead.regexp'},
'1': {'name': 'punctuation.parenthesis.lookahead.begin.regexp'},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-three-regexp-expression'},
{'include': '#comments-string-double-three'},
],
},
'double-three-regexp-lookahead-negative': {
'begin': '(\\()\\?!',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookahead.negative.regexp'},
'1': {'name': 'punctuation.parenthesis.lookahead.begin.regexp'},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-three-regexp-expression'},
{'include': '#comments-string-double-three'},
],
},
'double-three-regexp-lookbehind': {
'begin': '(\\()\\?<=',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookbehind.regexp'},
'1': {'name': 'punctuation.parenthesis.lookbehind.begin.regexp'},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-three-regexp-expression'},
{'include': '#comments-string-double-three'},
],
},
'double-three-regexp-lookbehind-negative': {
'begin': '(\\()\\?<!',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookbehind.negative.regexp'},
'1': {'name': 'punctuation.parenthesis.lookbehind.begin.regexp'},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-three-regexp-expression'},
{'include': '#comments-string-double-three'},
],
},
'double-three-regexp-named-group': {
'begin': '(\\()(\\?P<\\w+(?:\\s+\\p{alnum}+)?>)',
'beginCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp',
},
'2': {'name': 'entity.name.tag.named.group.regexp'},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.named.regexp',
'patterns': [
{'include': '#double-three-regexp-expression'},
{'include': '#comments-string-double-three'},
],
},
'double-three-regexp-parentheses': {
'begin': '\\(',
'beginCaptures': {
'0': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp',
},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-three-regexp-expression'},
{'include': '#comments-string-double-three'},
],
},
'double-three-regexp-parentheses-non-capturing': {
'begin': '\\(\\?:',
'beginCaptures': {
'0': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp',
},
},
'end': '(\\)|(?="""))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#double-three-regexp-expression'},
{'include': '#comments-string-double-three'},
],
},
'ellipsis': {
'match': '\\.\\.\\.',
'name': 'constant.other.ellipsis.python',
},
'escape-sequence': {
'match': '\\\\(x\\h{2}|[0-7]{1,3}|["\'\\\\abfnrtv])',
'name': 'constant.character.escape.python',
},
'escape-sequence-unicode': {
'patterns': [
{
'match': '\\\\(u\\h{4}|U\\h{8}|N\\{[\\w\\s]+?})',
'name': 'constant.character.escape.python',
},
],
},
'expression': {
'patterns': [
{'include': '#expression-base'},
{'include': '#member-access'},
{'match': '\\b([_[:alpha:]]\\w*)\\b'},
],
},
'expression-bare': {
'patterns': [
{'include': '#backticks'},
{'include': '#illegal-anno'},
{'include': '#literal'},
{'include': '#regexp'},
{'include': '#string'},
{'include': '#lambda'},
{'include': '#generator'},
{'include': '#illegal-operator'},
{'include': '#operator'},
{'include': '#curly-braces'},
{'include': '#item-access'},
{'include': '#list'},
{'include': '#odd-function-call'},
{'include': '#round-braces'},
{'include': '#function-call'},
{'include': '#builtin-functions'},
{'include': '#builtin-types'},
{'include': '#builtin-exceptions'},
{'include': '#magic-names'},
{'include': '#special-names'},
{'include': '#illegal-names'},
{'include': '#special-variables'},
{'include': '#ellipsis'},
{'include': '#punctuation'},
{'include': '#line-continuation'},
],
},
'expression-base': {
'patterns': [
{'include': '#comments'},
{'include': '#expression-bare'},
{'include': '#line-continuation'},
],
},
'f-expression': {
'patterns': [
{'include': '#expression-bare'},
{'include': '#member-access'},
{'match': '\\b([_[:alpha:]]\\w*)\\b'},
],
},
'fregexp-base-expression': {
'patterns': [
{'include': '#fregexp-quantifier'},
{'include': '#fstring-formatting-braces'},
{'match': '\\{.*?}'},
{'include': '#regexp-base-common'},
],
},
'fregexp-quantifier': {
'match': '\\{\\{(\\d+|\\d+,(\\d+)?|,\\d+)}}',
'name': 'keyword.operator.quantifier.regexp',
},
'fstring-fnorm-quoted-multi-line': {
'begin': '\\b([Ff])([BUbu])?(\'\'\'|""")',
'beginCaptures': {
'1': {
'name':
'string.interpolated.python string.quoted.multi.python storage.type.string.python',
},
'2': {'name': 'invalid.illegal.prefix.python'},
'3': {
'name':
'punctuation.definition.string.begin.python string.interpolated.python string.quoted.multi.python',
},
},
'end': '(\\3)',
'endCaptures': {
'1': {
'name':
'punctuation.definition.string.end.python string.interpolated.python string.quoted.multi.python',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.fstring.python',
'patterns': [
{'include': '#fstring-guts'},
{'include': '#fstring-illegal-multi-brace'},
{'include': '#fstring-multi-brace'},
{'include': '#fstring-multi-core'},
],
},
'fstring-fnorm-quoted-single-line': {
'begin': '\\b([Ff])([BUbu])?((["\']))',
'beginCaptures': {
'1': {
'name':
'string.interpolated.python string.quoted.single.python storage.type.string.python',
},
'2': {'name': 'invalid.illegal.prefix.python'},
'3': {
'name':
'punctuation.definition.string.begin.python string.interpolated.python string.quoted.single.python',
},
},
'end': '(\\3)|((?<!\\\\)\\n)',
'endCaptures': {
'1': {
'name':
'punctuation.definition.string.end.python string.interpolated.python string.quoted.single.python',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.fstring.python',
'patterns': [
{'include': '#fstring-guts'},
{'include': '#fstring-illegal-single-brace'},
{'include': '#fstring-single-brace'},
{'include': '#fstring-single-core'},
],
},
'fstring-formatting': {
'patterns': [
{'include': '#fstring-formatting-braces'},
{'include': '#fstring-formatting-singe-brace'},
],
},
'fstring-formatting-braces': {
'patterns': [
{
'captures': {
'1': {
'name': 'constant.character.format.placeholder.other.python',
},
'2': {'name': 'invalid.illegal.brace.python'},
'3': {
'name': 'constant.character.format.placeholder.other.python',
},
},
'match': '(\\{)(\\s*?)(})',
},
{'match': '(\\{\\{|}})', 'name': 'constant.character.escape.python'},
],
},
'fstring-formatting-singe-brace': {
'match': '(}(?!}))',
'name': 'invalid.illegal.brace.python',
},
'fstring-guts': {
'patterns': [
{'include': '#escape-sequence-unicode'},
{'include': '#escape-sequence'},
{'include': '#string-line-continuation'},
{'include': '#fstring-formatting'},
],
},
'fstring-illegal-multi-brace': {
'patterns': [
{'include': '#impossible'},
],
},
'fstring-illegal-single-brace': {
'begin': '(\\{)(?=[^\\n}]*\$\\n?)',
'beginCaptures': {
'1': {'name': 'constant.character.format.placeholder.other.python'},
},
'end': '(})|(?=\\n)',
'endCaptures': {
'1': {'name': 'constant.character.format.placeholder.other.python'},
},
'patterns': [
{'include': '#fstring-terminator-single'},
{'include': '#f-expression'},
],
},
'fstring-multi-brace': {
'begin': '(\\{)',
'beginCaptures': {
'1': {'name': 'constant.character.format.placeholder.other.python'},
},
'end': '(})',
'endCaptures': {
'1': {'name': 'constant.character.format.placeholder.other.python'},
},
'patterns': [
{'include': '#fstring-terminator-multi'},
{'include': '#f-expression'},
],
},
'fstring-multi-core': {
'match': '(.+?)(\$(\\n?)|(?=[\\\\{}]|\'\'\'|"""))|\\n',
'name': 'string.interpolated.python string.quoted.multi.python',
},
'fstring-normf-quoted-multi-line': {
'begin': '\\b([BUbu])([Ff])(\'\'\'|""")',
'beginCaptures': {
'1': {'name': 'invalid.illegal.prefix.python'},
'2': {
'name':
'string.interpolated.python string.quoted.multi.python storage.type.string.python',
},
'3': {
'name':
'punctuation.definition.string.begin.python string.quoted.multi.python',
},
},
'end': '(\\3)',
'endCaptures': {
'1': {
'name':
'punctuation.definition.string.end.python string.interpolated.python string.quoted.multi.python',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.fstring.python',
'patterns': [
{'include': '#fstring-guts'},
{'include': '#fstring-illegal-multi-brace'},
{'include': '#fstring-multi-brace'},
{'include': '#fstring-multi-core'},
],
},
'fstring-normf-quoted-single-line': {
'begin': '\\b([BUbu])([Ff])((["\']))',
'beginCaptures': {
'1': {'name': 'invalid.illegal.prefix.python'},
'2': {
'name':
'string.interpolated.python string.quoted.single.python storage.type.string.python',
},
'3': {
'name':
'punctuation.definition.string.begin.python string.quoted.single.python',
},
},
'end': '(\\3)|((?<!\\\\)\\n)',
'endCaptures': {
'1': {
'name':
'punctuation.definition.string.end.python string.interpolated.python string.quoted.single.python',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.fstring.python',
'patterns': [
{'include': '#fstring-guts'},
{'include': '#fstring-illegal-single-brace'},
{'include': '#fstring-single-brace'},
{'include': '#fstring-single-core'},
],
},
'fstring-raw-guts': {
'patterns': [
{'include': '#string-consume-escape'},
{'include': '#fstring-formatting'},
],
},
'fstring-raw-multi-core': {
'match': '(.+?)(\$(\\n?)|(?=[\\\\{}]|\'\'\'|"""))|\\n',
'name': 'string.interpolated.python string.quoted.raw.multi.python',
},
'fstring-raw-quoted-multi-line': {
'begin': '\\b([Rr][Ff]|[Ff][Rr])(\'\'\'|""")',
'beginCaptures': {
'1': {
'name':
'string.interpolated.python string.quoted.raw.multi.python storage.type.string.python',
},
'2': {
'name':
'punctuation.definition.string.begin.python string.quoted.raw.multi.python',
},
},
'end': '(\\2)',
'endCaptures': {
'1': {
'name':
'punctuation.definition.string.end.python string.interpolated.python string.quoted.raw.multi.python',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.fstring.python',
'patterns': [
{'include': '#fstring-raw-guts'},
{'include': '#fstring-illegal-multi-brace'},
{'include': '#fstring-multi-brace'},
{'include': '#fstring-raw-multi-core'},
],
},
'fstring-raw-quoted-single-line': {
'begin': '\\b([Rr][Ff]|[Ff][Rr])((["\']))',
'beginCaptures': {
'1': {
'name':
'string.interpolated.python string.quoted.raw.single.python storage.type.string.python',
},
'2': {
'name':
'punctuation.definition.string.begin.python string.quoted.raw.single.python',
},
},
'end': '(\\2)|((?<!\\\\)\\n)',
'endCaptures': {
'1': {
'name':
'punctuation.definition.string.end.python string.interpolated.python string.quoted.raw.single.python',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.fstring.python',
'patterns': [
{'include': '#fstring-raw-guts'},
{'include': '#fstring-illegal-single-brace'},
{'include': '#fstring-single-brace'},
{'include': '#fstring-raw-single-core'},
],
},
'fstring-raw-single-core': {
'match': '(.+?)(\$(\\n?)|(?=[\\\\{}]|(["\'])|((?<!\\\\)\\n)))|\\n',
'name': 'string.interpolated.python string.quoted.raw.single.python',
},
'fstring-single-brace': {
'begin': '(\\{)',
'beginCaptures': {
'1': {'name': 'constant.character.format.placeholder.other.python'},
},
'end': '(})|(?=\\n)',
'endCaptures': {
'1': {'name': 'constant.character.format.placeholder.other.python'},
},
'patterns': [
{'include': '#fstring-terminator-single'},
{'include': '#f-expression'},
],
},
'fstring-single-core': {
'match': '(.+?)(\$(\\n?)|(?=[\\\\{}]|(["\'])|((?<!\\\\)\\n)))|\\n',
'name': 'string.interpolated.python string.quoted.single.python',
},
'fstring-terminator-multi': {
'patterns': [
{'match': '(=(![ars])?)(?=})', 'name': 'storage.type.format.python'},
{'match': '(=?![ars])(?=})', 'name': 'storage.type.format.python'},
{
'captures': {
'1': {'name': 'storage.type.format.python'},
'2': {'name': 'storage.type.format.python'},
},
'match':
'(=?(?:![ars])?)(:\\w?[<=>^]?[- +]?#?\\d*,?(\\.\\d+)?[%EFGXb-gnosx]?)(?=})',
},
{'include': '#fstring-terminator-multi-tail'},
],
},
'fstring-terminator-multi-tail': {
'begin': '(=?(?:![ars])?)(:)(?=.*?\\{)',
'beginCaptures': {
'1': {'name': 'storage.type.format.python'},
'2': {'name': 'storage.type.format.python'},
},
'end': '(?=})',
'patterns': [
{'include': '#fstring-illegal-multi-brace'},
{'include': '#fstring-multi-brace'},
{
'match': '([%EFGXb-gnosx])(?=})',
'name': 'storage.type.format.python',
},
{'match': '(\\.\\d+)', 'name': 'storage.type.format.python'},
{'match': '(,)', 'name': 'storage.type.format.python'},
{'match': '(\\d+)', 'name': 'storage.type.format.python'},
{'match': '(#)', 'name': 'storage.type.format.python'},
{'match': '([- +])', 'name': 'storage.type.format.python'},
{'match': '([<=>^])', 'name': 'storage.type.format.python'},
{'match': '(\\w)', 'name': 'storage.type.format.python'},
],
},
'fstring-terminator-single': {
'patterns': [
{'match': '(=(![ars])?)(?=})', 'name': 'storage.type.format.python'},
{'match': '(=?![ars])(?=})', 'name': 'storage.type.format.python'},
{
'captures': {
'1': {'name': 'storage.type.format.python'},
'2': {'name': 'storage.type.format.python'},
},
'match':
'(=?(?:![ars])?)(:\\w?[<=>^]?[- +]?#?\\d*,?(\\.\\d+)?[%EFGXb-gnosx]?)(?=})',
},
{'include': '#fstring-terminator-single-tail'},
],
},
'fstring-terminator-single-tail': {
'begin': '(=?(?:![ars])?)(:)(?=.*?\\{)',
'beginCaptures': {
'1': {'name': 'storage.type.format.python'},
'2': {'name': 'storage.type.format.python'},
},
'end': '(?=})|(?=\\n)',
'patterns': [
{'include': '#fstring-illegal-single-brace'},
{'include': '#fstring-single-brace'},
{
'match': '([%EFGXb-gnosx])(?=})',
'name': 'storage.type.format.python',
},
{'match': '(\\.\\d+)', 'name': 'storage.type.format.python'},
{'match': '(,)', 'name': 'storage.type.format.python'},
{'match': '(\\d+)', 'name': 'storage.type.format.python'},
{'match': '(#)', 'name': 'storage.type.format.python'},
{'match': '([- +])', 'name': 'storage.type.format.python'},
{'match': '([<=>^])', 'name': 'storage.type.format.python'},
{'match': '(\\w)', 'name': 'storage.type.format.python'},
],
},
'function-arguments': {
'begin': '(\\()',
'beginCaptures': {
'1': {'name': 'punctuation.definition.arguments.begin.python'},
},
'contentName': 'meta.function-call.arguments.python',
'end': '(?=\\))(?!\\)\\s*\\()',
'patterns': [
{'match': '(,)', 'name': 'punctuation.separator.arguments.python'},
{
'captures': {
'1': {'name': 'keyword.operator.unpacking.arguments.python'},
},
'match': '(?:(?<=[(,])|^)\\s*(\\*{1,2})',
},
{'include': '#lambda-incomplete'},
{'include': '#illegal-names'},
{
'captures': {
'1': {'name': 'variable.parameter.function-call.python'},
'2': {'name': 'keyword.operator.assignment.python'},
},
'match': '\\b([_[:alpha:]]\\w*)\\s*(=)(?!=)',
},
{'match': '=(?!=)', 'name': 'keyword.operator.assignment.python'},
{'include': '#expression'},
{
'captures': {
'1': {'name': 'punctuation.definition.arguments.end.python'},
'2': {'name': 'punctuation.definition.arguments.begin.python'},
},
'match': '\\s*(\\))\\s*(\\()',
},
],
},
'function-call': {
'begin': '\\b(?=([_[:alpha:]]\\w*)\\s*(\\())',
'end': '(\\))',
'endCaptures': {
'1': {'name': 'punctuation.definition.arguments.end.python'},
},
'name': 'meta.function-call.python',
'patterns': [
{'include': '#special-variables'},
{'include': '#function-name'},
{'include': '#function-arguments'},
],
},
'function-declaration': {
'begin':
'\\s*(?:\\b(async)\\s+)?\\b(def)\\s+(?=[_[:alpha:]]\\p{word}*\\s*\\()',
'beginCaptures': {
'1': {'name': 'storage.type.function.async.python'},
'2': {'name': 'storage.type.function.python'},
},
'end': '(:|(?=[\\n"#\']))',
'endCaptures': {
'1': {'name': 'punctuation.section.function.begin.python'},
},
'name': 'meta.function.python',
'patterns': [
{'include': '#function-def-name'},
{'include': '#parameters'},
{'include': '#line-continuation'},
{'include': '#return-annotation'},
],
},
'function-def-name': {
'patterns': [
{'include': '#illegal-object-name'},
{'include': '#builtin-possible-callables'},
{
'match': '\\b([_[:alpha:]]\\w*)\\b',
'name': 'entity.name.function.python',
},
],
},
'function-name': {
'patterns': [
{'include': '#builtin-possible-callables'},
{
'match': '\\b([_[:alpha:]]\\w*)\\b',
'name': 'meta.function-call.generic.python',
},
],
},
'generator': {
'begin': '\\bfor\\b',
'beginCaptures': {
'0': {'name': 'keyword.control.flow.python'},
},
'end': '\\bin\\b',
'endCaptures': {
'0': {'name': 'keyword.control.flow.python'},
},
'patterns': [
{'include': '#expression'},
],
},
'illegal-anno': {
'match': '->',
'name': 'invalid.illegal.annotation.python',
},
'illegal-names': {
'captures': {
'1': {'name': 'keyword.control.flow.python'},
'2': {'name': 'keyword.control.import.python'},
},
'match':
'\\b(?:(and|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|in|is|(?<=\\.)lambda|lambda(?=\\s*[.=])|nonlocal|not|or|pass|raise|return|try|while|with|yield)|(as|import))\\b',
},
'illegal-object-name': {
'match': '\\b(True|False|None)\\b',
'name': 'keyword.illegal.name.python',
},
'illegal-operator': {
'patterns': [
{
'match': '&&|\\|\\||--|\\+\\+',
'name': 'invalid.illegal.operator.python',
},
{'match': '[\$?]', 'name': 'invalid.illegal.operator.python'},
{'match': '!\\b', 'name': 'invalid.illegal.operator.python'},
],
},
'import': {
'patterns': [
{
'begin': '\\b(?<!\\.)(from)\\b(?=.+import)',
'beginCaptures': {
'1': {'name': 'keyword.control.import.python'},
},
'end': '\$|(?=import)',
'patterns': [
{'match': '\\.+', 'name': 'punctuation.separator.period.python'},
{'include': '#expression'},
],
},
{
'begin': '\\b(?<!\\.)(import)\\b',
'beginCaptures': {
'1': {'name': 'keyword.control.import.python'},
},
'end': '\$',
'patterns': [
{
'match': '\\b(?<!\\.)as\\b',
'name': 'keyword.control.import.python',
},
{'include': '#expression'},
],
},
],
},
'impossible': {'match': '\$.^'},
'inheritance-identifier': {
'captures': {
'1': {'name': 'entity.other.inherited-class.python'},
},
'match': '\\b([_[:alpha:]]\\w*)\\b',
},
'inheritance-name': {
'patterns': [
{'include': '#lambda-incomplete'},
{'include': '#builtin-possible-callables'},
{'include': '#inheritance-identifier'},
],
},
'item-access': {
'patterns': [
{
'begin': '\\b(?=[_[:alpha:]]\\w*\\s*\\[)',
'end': '(])',
'endCaptures': {
'1': {'name': 'punctuation.definition.arguments.end.python'},
},
'name': 'meta.item-access.python',
'patterns': [
{'include': '#item-name'},
{'include': '#item-index'},
{'include': '#expression'},
],
},
],
},
'item-index': {
'begin': '(\\[)',
'beginCaptures': {
'1': {'name': 'punctuation.definition.arguments.begin.python'},
},
'contentName': 'meta.item-access.arguments.python',
'end': '(?=])',
'patterns': [
{'match': ':', 'name': 'punctuation.separator.slice.python'},
{'include': '#expression'},
],
},
'item-name': {
'patterns': [
{'include': '#special-variables'},
{'include': '#builtin-functions'},
{'include': '#special-names'},
{
'match': '\\b([_[:alpha:]]\\w*)\\b',
'name': 'meta.indexed-name.python',
},
],
},
'lambda': {
'patterns': [
{
'captures': {
'1': {'name': 'keyword.control.flow.python'},
},
'match': '((?<=\\.)lambda|lambda(?=\\s*[.=]))',
},
{
'captures': {
'1': {'name': 'storage.type.function.lambda.python'},
},
'match': '\\b(lambda)\\s*?(?=[\\n,]|\$)',
},
{
'begin': '\\b(lambda)\\b',
'beginCaptures': {
'1': {'name': 'storage.type.function.lambda.python'},
},
'contentName': 'meta.function.lambda.parameters.python',
'end': '(:)|(\\n)',
'endCaptures': {
'1': {'name': 'punctuation.section.function.lambda.begin.python'},
},
'name': 'meta.lambda-function.python',
'patterns': [
{
'match': '/',
'name': 'keyword.operator.positional.parameter.python',
},
{
'match': '(\\*\\*?)',
'name': 'keyword.operator.unpacking.parameter.python',
},
{'include': '#lambda-nested-incomplete'},
{'include': '#illegal-names'},
{
'captures': {
'1': {'name': 'variable.parameter.function.language.python'},
'2': {'name': 'punctuation.separator.parameters.python'},
},
'match': '([_[:alpha:]]\\w*)\\s*(?:(,)|(?=:|\$))',
},
{'include': '#comments'},
{'include': '#backticks'},
{'include': '#illegal-anno'},
{'include': '#lambda-parameter-with-default'},
{'include': '#line-continuation'},
{'include': '#illegal-operator'},
],
},
],
},
'lambda-incomplete': {
'match': '\\blambda(?=\\s*[),])',
'name': 'storage.type.function.lambda.python',
},
'lambda-nested-incomplete': {
'match': '\\blambda(?=\\s*[),:])',
'name': 'storage.type.function.lambda.python',
},
'lambda-parameter-with-default': {
'begin': '\\b([_[:alpha:]]\\w*)\\s*(=)',
'beginCaptures': {
'1': {'name': 'variable.parameter.function.language.python'},
'2': {'name': 'keyword.operator.python'},
},
'end': '(,)|(?=:|\$)',
'endCaptures': {
'1': {'name': 'punctuation.separator.parameters.python'},
},
'patterns': [
{'include': '#expression'},
],
},
'line-continuation': {
'patterns': [
{
'captures': {
'1': {'name': 'punctuation.separator.continuation.line.python'},
'2': {'name': 'invalid.illegal.line.continuation.python'},
},
'match': '(\\\\)\\s*(\\S.*\$\\n?)',
},
{
'begin': '(\\\\)\\s*\$\\n?',
'beginCaptures': {
'1': {'name': 'punctuation.separator.continuation.line.python'},
},
'end': '(?=^\\s*\$)|(?!(\\s*[Rr]?(\'\'\'|"""|["\']))|\\G()\$)',
'patterns': [
{'include': '#regexp'},
{'include': '#string'},
],
},
],
},
'list': {
'begin': '\\[',
'beginCaptures': {
'0': {'name': 'punctuation.definition.list.begin.python'},
},
'end': ']',
'endCaptures': {
'0': {'name': 'punctuation.definition.list.end.python'},
},
'patterns': [
{'include': '#expression'},
],
},
'literal': {
'patterns': [
{
'match': '\\b(True|False|None|NotImplemented|Ellipsis)\\b',
'name': 'constant.language.python',
},
{'include': '#number'},
],
},
'loose-default': {
'begin': '(=)',
'beginCaptures': {
'1': {'name': 'keyword.operator.python'},
},
'end': '(,)|(?=\\))',
'endCaptures': {
'1': {'name': 'punctuation.separator.parameters.python'},
},
'patterns': [
{'include': '#expression'},
],
},
'magic-function-names': {
'captures': {
'1': {'name': 'support.function.magic.python'},
},
'match':
'\\b(__(?:abs|add|aenter|aexit|aiter|and|anext|await|bool|call|ceil|class_getitem|cmp|coerce|complex|contains|copy|deepcopy|del|delattr|delete|delitem|delslice|dir|div|divmod|enter|eq|exit|float|floor|floordiv|format|get??|getattr|getattribute|getinitargs|getitem|getnewargs|getslice|getstate|gt|hash|hex|iadd|iand|idiv|ifloordiv||ilshift|imod|imul|index|init|instancecheck|int|invert|ior|ipow|irshift|isub|iter|itruediv|ixor|len??|long|lshift|lt|missing|mod|mul|neg??|new|next|nonzero|oct|or|pos|pow|radd|rand|rdiv|rdivmod|reduce|reduce_ex|repr|reversed|rfloordiv||rlshift|rmod|rmul|ror|round|rpow|rrshift|rshift|rsub|rtruediv|rxor|set|setattr|setitem|set_name|setslice|setstate|sizeof|str|sub|subclasscheck|truediv|trunc|unicode|xor|matmul|rmatmul|imatmul|init_subclass|set_name|fspath|bytes|prepare|length_hint)__)\\b',
},
'magic-names': {
'patterns': [
{'include': '#magic-function-names'},
{'include': '#magic-variable-names'},
],
},
'magic-variable-names': {
'captures': {
'1': {'name': 'support.variable.magic.python'},
},
'match':
'\\b(__(?:all|annotations|bases|builtins|class|closure|code|debug|defaults|dict|doc|file|func|globals|kwdefaults|match_args|members|metaclass|methods|module|mro|mro_entries|name|qualname|post_init|self|signature|slots|subclasses|version|weakref|wrapped|classcell|spec|path|package|future|traceback)__)\\b',
},
'member-access': {
'begin': '(\\.)\\s*(?!\\.)',
'beginCaptures': {
'1': {'name': 'punctuation.separator.period.python'},
},
'end': '(?<=\\S)(?=\\W)|(^|(?<=\\s))(?=[^\\\\\\w\\s])|\$',
'name': 'meta.member.access.python',
'patterns': [
{'include': '#function-call'},
{'include': '#member-access-base'},
{'include': '#member-access-attribute'},
],
},
'member-access-attribute': {
'match': '\\b([_[:alpha:]]\\w*)\\b',
'name': 'meta.attribute.python',
},
'member-access-base': {
'patterns': [
{'include': '#magic-names'},
{'include': '#illegal-names'},
{'include': '#illegal-object-name'},
{'include': '#special-names'},
{'include': '#line-continuation'},
{'include': '#item-access'},
],
},
'member-access-class': {
'begin': '(\\.)\\s*(?!\\.)',
'beginCaptures': {
'1': {'name': 'punctuation.separator.period.python'},
},
'end': '(?<=\\S)(?=\\W)|\$',
'name': 'meta.member.access.python',
'patterns': [
{'include': '#call-wrapper-inheritance'},
{'include': '#member-access-base'},
{'include': '#inheritance-identifier'},
],
},
'number': {
'name': 'constant.numeric.python',
'patterns': [
{'include': '#number-float'},
{'include': '#number-dec'},
{'include': '#number-hex'},
{'include': '#number-oct'},
{'include': '#number-bin'},
{'include': '#number-long'},
{'match': '\\b[0-9]+\\w+', 'name': 'invalid.illegal.name.python'},
],
},
'number-bin': {
'captures': {
'1': {'name': 'storage.type.number.python'},
},
'match': '(?<![.\\w])(0[Bb])(_?[01])+\\b',
'name': 'constant.numeric.bin.python',
},
'number-dec': {
'captures': {
'1': {'name': 'storage.type.imaginary.number.python'},
'2': {'name': 'invalid.illegal.dec.python'},
},
'match':
'(?<![.\\w])(?:[1-9](?:_?[0-9])*|0+|[0-9](?:_?[0-9])*([Jj])|0([0-9]+)(?![.Ee]))\\b',
'name': 'constant.numeric.dec.python',
},
'number-float': {
'captures': {
'1': {'name': 'storage.type.imaginary.number.python'},
},
'match':
'(?<!\\w)(?:(?:\\.[0-9](?:_?[0-9])*|[0-9](?:_?[0-9])*\\.[0-9](?:_?[0-9])*|[0-9](?:_?[0-9])*\\.)(?:[Ee][-+]?[0-9](?:_?[0-9])*)?|[0-9](?:_?[0-9])*[Ee][-+]?[0-9](?:_?[0-9])*)([Jj])?\\b',
'name': 'constant.numeric.float.python',
},
'number-hex': {
'captures': {
'1': {'name': 'storage.type.number.python'},
},
'match': '(?<![.\\w])(0[Xx])(_?\\h)+\\b',
'name': 'constant.numeric.hex.python',
},
'number-long': {
'captures': {
'2': {'name': 'storage.type.number.python'},
},
'match': '(?<![.\\w])([1-9][0-9]*|0)([Ll])\\b',
'name': 'constant.numeric.bin.python',
},
'number-oct': {
'captures': {
'1': {'name': 'storage.type.number.python'},
},
'match': '(?<![.\\w])(0[Oo])(_?[0-7])+\\b',
'name': 'constant.numeric.oct.python',
},
'odd-function-call': {
'begin': '(?<=[])])\\s*(?=\\()',
'end': '(\\))',
'endCaptures': {
'1': {'name': 'punctuation.definition.arguments.end.python'},
},
'patterns': [
{'include': '#function-arguments'},
],
},
'operator': {
'captures': {
'1': {'name': 'keyword.operator.logical.python'},
'2': {'name': 'keyword.control.flow.python'},
'3': {'name': 'keyword.operator.bitwise.python'},
'4': {'name': 'keyword.operator.arithmetic.python'},
'5': {'name': 'keyword.operator.comparison.python'},
'6': {'name': 'keyword.operator.assignment.python'},
},
'match':
'\\b(?<!\\.)(?:(and|or|not|in|is)|(for|if|else|await|yield(?:\\s+from)?))(?!\\s*:)\\b|(<<|>>|[\\&^|~])|(\\*\\*|[-%*+]|//|[/@])|(!=|==|>=|<=|[<>])|(:=)',
},
'parameter-special': {
'captures': {
'1': {'name': 'variable.parameter.function.language.python'},
'2': {
'name': 'variable.parameter.function.language.special.self.python',
},
'3': {
'name': 'variable.parameter.function.language.special.cls.python',
},
'4': {'name': 'punctuation.separator.parameters.python'},
},
'match': '\\b((self)|(cls))\\b\\s*(?:(,)|(?=\\)))',
},
'parameters': {
'begin': '(\\()',
'beginCaptures': {
'1': {'name': 'punctuation.definition.parameters.begin.python'},
},
'end': '(\\))',
'endCaptures': {
'1': {'name': 'punctuation.definition.parameters.end.python'},
},
'name': 'meta.function.parameters.python',
'patterns': [
{
'match': '/',
'name': 'keyword.operator.positional.parameter.python',
},
{
'match': '(\\*\\*?)',
'name': 'keyword.operator.unpacking.parameter.python',
},
{'include': '#lambda-incomplete'},
{'include': '#illegal-names'},
{'include': '#illegal-object-name'},
{'include': '#parameter-special'},
{
'captures': {
'1': {'name': 'variable.parameter.function.language.python'},
'2': {'name': 'punctuation.separator.parameters.python'},
},
'match': '([_[:alpha:]]\\w*)\\s*(?:(,)|(?=[\\n#)=]))',
},
{'include': '#comments'},
{'include': '#loose-default'},
{'include': '#annotated-parameter'},
],
},
'punctuation': {
'patterns': [
{'match': ':', 'name': 'punctuation.separator.colon.python'},
{'match': ',', 'name': 'punctuation.separator.element.python'},
],
},
'regexp': {
'patterns': [
{'include': '#regexp-single-three-line'},
{'include': '#regexp-double-three-line'},
{'include': '#regexp-single-one-line'},
{'include': '#regexp-double-one-line'},
],
},
'regexp-backreference': {
'captures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.backreference.named.begin.regexp',
},
'2': {'name': 'entity.name.tag.named.backreference.regexp'},
'3': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.backreference.named.end.regexp',
},
},
'match': '(\\()(\\?P=\\w+(?:\\s+\\p{alnum}+)?)(\\))',
'name': 'meta.backreference.named.regexp',
},
'regexp-backreference-number': {
'captures': {
'1': {'name': 'entity.name.tag.backreference.regexp'},
},
'match': '(\\\\[1-9]\\d?)',
'name': 'meta.backreference.regexp',
},
'regexp-base-common': {
'patterns': [
{'match': '\\.', 'name': 'support.other.match.any.regexp'},
{'match': '\\^', 'name': 'support.other.match.begin.regexp'},
{'match': '\\\$', 'name': 'support.other.match.end.regexp'},
{'match': '[*+?]\\??', 'name': 'keyword.operator.quantifier.regexp'},
{'match': '\\|', 'name': 'keyword.operator.disjunction.regexp'},
{'include': '#regexp-escape-sequence'},
],
},
'regexp-base-expression': {
'patterns': [
{'include': '#regexp-quantifier'},
{'include': '#regexp-base-common'},
],
},
'regexp-charecter-set-escapes': {
'patterns': [
{
'match': '\\\\[\\\\abfnrtv]',
'name': 'constant.character.escape.regexp',
},
{'include': '#regexp-escape-special'},
{
'match': '\\\\([0-7]{1,3})',
'name': 'constant.character.escape.regexp',
},
{'include': '#regexp-escape-character'},
{'include': '#regexp-escape-unicode'},
{'include': '#regexp-escape-catchall'},
],
},
'regexp-double-one-line': {
'begin': '\\b(([Uu]r)|([Bb]r)|(r[Bb]?))(")',
'beginCaptures': {
'2': {'name': 'invalid.deprecated.prefix.python'},
'3': {'name': 'storage.type.string.python'},
'4': {'name': 'storage.type.string.python'},
'5': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(")|(?<!\\\\)(\\n)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.regexp.quoted.single.python',
'patterns': [
{'include': '#double-one-regexp-expression'},
],
},
'regexp-double-three-line': {
'begin': '\\b(([Uu]r)|([Bb]r)|(r[Bb]?))(""")',
'beginCaptures': {
'2': {'name': 'invalid.deprecated.prefix.python'},
'3': {'name': 'storage.type.string.python'},
'4': {'name': 'storage.type.string.python'},
'5': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(""")',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.regexp.quoted.multi.python',
'patterns': [
{'include': '#double-three-regexp-expression'},
],
},
'regexp-escape-catchall': {
'match': '\\\\(.|\\n)',
'name': 'constant.character.escape.regexp',
},
'regexp-escape-character': {
'match': '\\\\(x\\h{2}|0[0-7]{1,2}|[0-7]{3})',
'name': 'constant.character.escape.regexp',
},
'regexp-escape-sequence': {
'patterns': [
{'include': '#regexp-escape-special'},
{'include': '#regexp-escape-character'},
{'include': '#regexp-escape-unicode'},
{'include': '#regexp-backreference-number'},
{'include': '#regexp-escape-catchall'},
],
},
'regexp-escape-special': {
'match': '\\\\([ABDSWZbdsw])',
'name': 'support.other.escape.special.regexp',
},
'regexp-escape-unicode': {
'match': '\\\\(u\\h{4}|U\\h{8})',
'name': 'constant.character.unicode.regexp',
},
'regexp-flags': {
'match': '\\(\\?[Laimsux]+\\)',
'name': 'storage.modifier.flag.regexp',
},
'regexp-quantifier': {
'match': '\\{(\\d+|\\d+,(\\d+)?|,\\d+)}',
'name': 'keyword.operator.quantifier.regexp',
},
'regexp-single-one-line': {
'begin': '\\b(([Uu]r)|([Bb]r)|(r[Bb]?))(\')',
'beginCaptures': {
'2': {'name': 'invalid.deprecated.prefix.python'},
'3': {'name': 'storage.type.string.python'},
'4': {'name': 'storage.type.string.python'},
'5': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\')|(?<!\\\\)(\\n)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.regexp.quoted.single.python',
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'regexp-single-three-line': {
'begin': '\\b(([Uu]r)|([Bb]r)|(r[Bb]?))(\'\'\')',
'beginCaptures': {
'2': {'name': 'invalid.deprecated.prefix.python'},
'3': {'name': 'storage.type.string.python'},
'4': {'name': 'storage.type.string.python'},
'5': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\'\'\')',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.regexp.quoted.multi.python',
'patterns': [
{'include': '#single-three-regexp-expression'},
],
},
'return-annotation': {
'begin': '(->)',
'beginCaptures': {
'1': {'name': 'punctuation.separator.annotation.result.python'},
},
'end': '(?=:)',
'patterns': [
{'include': '#expression'},
],
},
'round-braces': {
'begin': '\\(',
'beginCaptures': {
'0': {'name': 'punctuation.parenthesis.begin.python'},
},
'end': '\\)',
'endCaptures': {
'0': {'name': 'punctuation.parenthesis.end.python'},
},
'patterns': [
{'include': '#expression'},
],
},
'semicolon': {
'patterns': [
{'match': ';\$', 'name': 'invalid.deprecated.semicolon.python'},
],
},
'single-one-regexp-character-set': {
'patterns': [
{'match': '\\[\\^?](?!.*?])'},
{
'begin': '(\\[)(\\^)?(])?',
'beginCaptures': {
'1': {
'name':
'punctuation.character.set.begin.regexp constant.other.set.regexp',
},
'2': {'name': 'keyword.operator.negation.regexp'},
'3': {'name': 'constant.character.set.regexp'},
},
'end': '(]|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'punctuation.character.set.end.regexp constant.other.set.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.character.set.regexp',
'patterns': [
{'include': '#regexp-charecter-set-escapes'},
{'match': '\\N', 'name': 'constant.character.set.regexp'},
],
},
],
},
'single-one-regexp-comments': {
'begin': '\\(\\?#',
'beginCaptures': {
'0': {'name': 'punctuation.comment.begin.regexp'},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {'name': 'punctuation.comment.end.regexp'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'comment.regexp',
'patterns': [
{'include': '#codetags'},
],
},
'single-one-regexp-conditional': {
'begin': '(\\()\\?\\((\\w+(?:\\s+\\p{alnum}+)?|\\d+)\\)',
'beginCaptures': {
'0': {'name': 'keyword.operator.conditional.regexp'},
'1': {'name': 'punctuation.parenthesis.conditional.begin.regexp'},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'single-one-regexp-expression': {
'patterns': [
{'include': '#regexp-base-expression'},
{'include': '#single-one-regexp-character-set'},
{'include': '#single-one-regexp-comments'},
{'include': '#regexp-flags'},
{'include': '#single-one-regexp-named-group'},
{'include': '#regexp-backreference'},
{'include': '#single-one-regexp-lookahead'},
{'include': '#single-one-regexp-lookahead-negative'},
{'include': '#single-one-regexp-lookbehind'},
{'include': '#single-one-regexp-lookbehind-negative'},
{'include': '#single-one-regexp-conditional'},
{'include': '#single-one-regexp-parentheses-non-capturing'},
{'include': '#single-one-regexp-parentheses'},
],
},
'single-one-regexp-lookahead': {
'begin': '(\\()\\?=',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookahead.regexp'},
'1': {'name': 'punctuation.parenthesis.lookahead.begin.regexp'},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'single-one-regexp-lookahead-negative': {
'begin': '(\\()\\?!',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookahead.negative.regexp'},
'1': {'name': 'punctuation.parenthesis.lookahead.begin.regexp'},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'single-one-regexp-lookbehind': {
'begin': '(\\()\\?<=',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookbehind.regexp'},
'1': {'name': 'punctuation.parenthesis.lookbehind.begin.regexp'},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'single-one-regexp-lookbehind-negative': {
'begin': '(\\()\\?<!',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookbehind.negative.regexp'},
'1': {'name': 'punctuation.parenthesis.lookbehind.begin.regexp'},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'single-one-regexp-named-group': {
'begin': '(\\()(\\?P<\\w+(?:\\s+\\p{alnum}+)?>)',
'beginCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp',
},
'2': {'name': 'entity.name.tag.named.group.regexp'},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.named.regexp',
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'single-one-regexp-parentheses': {
'begin': '\\(',
'beginCaptures': {
'0': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp',
},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'single-one-regexp-parentheses-non-capturing': {
'begin': '\\(\\?:',
'beginCaptures': {
'0': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp',
},
},
'end': '(\\)|(?=\'))|((?=(?<!\\\\)\\n))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-one-regexp-expression'},
],
},
'single-three-regexp-character-set': {
'patterns': [
{'match': '\\[\\^?](?!.*?])'},
{
'begin': '(\\[)(\\^)?(])?',
'beginCaptures': {
'1': {
'name':
'punctuation.character.set.begin.regexp constant.other.set.regexp',
},
'2': {'name': 'keyword.operator.negation.regexp'},
'3': {'name': 'constant.character.set.regexp'},
},
'end': '(]|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'punctuation.character.set.end.regexp constant.other.set.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.character.set.regexp',
'patterns': [
{'include': '#regexp-charecter-set-escapes'},
{'match': '\\N', 'name': 'constant.character.set.regexp'},
],
},
],
},
'single-three-regexp-comments': {
'begin': '\\(\\?#',
'beginCaptures': {
'0': {'name': 'punctuation.comment.begin.regexp'},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {'name': 'punctuation.comment.end.regexp'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'comment.regexp',
'patterns': [
{'include': '#codetags'},
],
},
'single-three-regexp-conditional': {
'begin': '(\\()\\?\\((\\w+(?:\\s+\\p{alnum}+)?|\\d+)\\)',
'beginCaptures': {
'0': {'name': 'keyword.operator.conditional.regexp'},
'1': {'name': 'punctuation.parenthesis.conditional.begin.regexp'},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-three-regexp-expression'},
{'include': '#comments-string-single-three'},
],
},
'single-three-regexp-expression': {
'patterns': [
{'include': '#regexp-base-expression'},
{'include': '#single-three-regexp-character-set'},
{'include': '#single-three-regexp-comments'},
{'include': '#regexp-flags'},
{'include': '#single-three-regexp-named-group'},
{'include': '#regexp-backreference'},
{'include': '#single-three-regexp-lookahead'},
{'include': '#single-three-regexp-lookahead-negative'},
{'include': '#single-three-regexp-lookbehind'},
{'include': '#single-three-regexp-lookbehind-negative'},
{'include': '#single-three-regexp-conditional'},
{'include': '#single-three-regexp-parentheses-non-capturing'},
{'include': '#single-three-regexp-parentheses'},
{'include': '#comments-string-single-three'},
],
},
'single-three-regexp-lookahead': {
'begin': '(\\()\\?=',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookahead.regexp'},
'1': {'name': 'punctuation.parenthesis.lookahead.begin.regexp'},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-three-regexp-expression'},
{'include': '#comments-string-single-three'},
],
},
'single-three-regexp-lookahead-negative': {
'begin': '(\\()\\?!',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookahead.negative.regexp'},
'1': {'name': 'punctuation.parenthesis.lookahead.begin.regexp'},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-three-regexp-expression'},
{'include': '#comments-string-single-three'},
],
},
'single-three-regexp-lookbehind': {
'begin': '(\\()\\?<=',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookbehind.regexp'},
'1': {'name': 'punctuation.parenthesis.lookbehind.begin.regexp'},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-three-regexp-expression'},
{'include': '#comments-string-single-three'},
],
},
'single-three-regexp-lookbehind-negative': {
'begin': '(\\()\\?<!',
'beginCaptures': {
'0': {'name': 'keyword.operator.lookbehind.negative.regexp'},
'1': {'name': 'punctuation.parenthesis.lookbehind.begin.regexp'},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-three-regexp-expression'},
{'include': '#comments-string-single-three'},
],
},
'single-three-regexp-named-group': {
'begin': '(\\()(\\?P<\\w+(?:\\s+\\p{alnum}+)?>)',
'beginCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp',
},
'2': {'name': 'entity.name.tag.named.group.regexp'},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'meta.named.regexp',
'patterns': [
{'include': '#single-three-regexp-expression'},
{'include': '#comments-string-single-three'},
],
},
'single-three-regexp-parentheses': {
'begin': '\\(',
'beginCaptures': {
'0': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp',
},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-three-regexp-expression'},
{'include': '#comments-string-single-three'},
],
},
'single-three-regexp-parentheses-non-capturing': {
'begin': '\\(\\?:',
'beginCaptures': {
'0': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp',
},
},
'end': '(\\)|(?=\'\'\'))',
'endCaptures': {
'1': {
'name':
'support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp',
},
'2': {'name': 'invalid.illegal.newline.python'},
},
'patterns': [
{'include': '#single-three-regexp-expression'},
{'include': '#comments-string-single-three'},
],
},
'special-names': {
'match': '\\b(_*\\p{upper}[_\\d]*\\p{upper})[[:upper:]\\d]*(_\\w*)?\\b',
'name': 'constant.other.caps.python',
},
'special-variables': {
'captures': {
'1': {'name': 'variable.language.special.self.python'},
'2': {'name': 'variable.language.special.cls.python'},
},
'match': '\\b(?<!\\.)(?:(self)|(cls))\\b',
},
'statement': {
'patterns': [
{'include': '#import'},
{'include': '#class-declaration'},
{'include': '#function-declaration'},
{'include': '#generator'},
{'include': '#statement-keyword'},
{'include': '#assignment-operator'},
{'include': '#decorator'},
{'include': '#docstring-statement'},
{'include': '#semicolon'},
],
},
'statement-keyword': {
'patterns': [
{
'match': '\\b((async\\s+)?\\s*def)\\b',
'name': 'storage.type.function.python',
},
{
'match': '\\b(?<!\\.)as\\b(?=.*[:\\\\])',
'name': 'keyword.control.flow.python',
},
{
'match': '\\b(?<!\\.)as\\b',
'name': 'keyword.control.import.python',
},
{
'match':
'\\b(?<!\\.)(async|continue|del|assert|break|finally|for|from|elif|else|if|except|pass|raise|return|try|while|with)\\b',
'name': 'keyword.control.flow.python',
},
{
'match': '\\b(?<!\\.)(global|nonlocal)\\b',
'name': 'storage.modifier.declaration.python',
},
{
'match': '\\b(?<!\\.)(class)\\b',
'name': 'storage.type.class.python',
},
{
'captures': {
'1': {'name': 'keyword.control.flow.python'},
},
'match': '^\\s*(case|match)(?=\\s*([-"#\'(+:\\[{\\w\\d]|\$))\\b',
},
],
},
'string': {
'patterns': [
{'include': '#string-quoted-multi-line'},
{'include': '#string-quoted-single-line'},
{'include': '#string-bin-quoted-multi-line'},
{'include': '#string-bin-quoted-single-line'},
{'include': '#string-raw-quoted-multi-line'},
{'include': '#string-raw-quoted-single-line'},
{'include': '#string-raw-bin-quoted-multi-line'},
{'include': '#string-raw-bin-quoted-single-line'},
{'include': '#fstring-fnorm-quoted-multi-line'},
{'include': '#fstring-fnorm-quoted-single-line'},
{'include': '#fstring-normf-quoted-multi-line'},
{'include': '#fstring-normf-quoted-single-line'},
{'include': '#fstring-raw-quoted-multi-line'},
{'include': '#fstring-raw-quoted-single-line'},
],
},
'string-bin-quoted-multi-line': {
'begin': '\\b([Bb])(\'\'\'|""")',
'beginCaptures': {
'1': {'name': 'storage.type.string.python'},
'2': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\2)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.binary.multi.python',
'patterns': [
{'include': '#string-entity'},
],
},
'string-bin-quoted-single-line': {
'begin': '\\b([Bb])((["\']))',
'beginCaptures': {
'1': {'name': 'storage.type.string.python'},
'2': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\2)|((?<!\\\\)\\n)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.binary.single.python',
'patterns': [
{'include': '#string-entity'},
],
},
'string-brace-formatting': {
'patterns': [
{
'captures': {
'1': {
'name': 'constant.character.format.placeholder.other.python',
},
'3': {'name': 'storage.type.format.python'},
'4': {'name': 'storage.type.format.python'},
},
'match':
'(\\{\\{|}}|\\{\\w*(\\.[_[:alpha:]]\\w*|\\[[^]"\']+])*(![ars])?(:\\w?[<=>^]?[- +]?#?\\d*,?(\\.\\d+)?[%EFGXb-gnosx]?)?})',
'name': 'meta.format.brace.python',
},
{
'captures': {
'1': {
'name': 'constant.character.format.placeholder.other.python',
},
'3': {'name': 'storage.type.format.python'},
'4': {'name': 'storage.type.format.python'},
},
'match':
'(\\{\\w*(\\.[_[:alpha:]]\\w*|\\[[^]"\']+])*(![ars])?(:)[^\\n"\'{}]*(?:\\{[^\\n"\'}]*?}[^\\n"\'{}]*)*})',
'name': 'meta.format.brace.python',
},
],
},
'string-consume-escape': {'match': '\\\\[\\n"\'\\\\]'},
'string-entity': {
'patterns': [
{'include': '#escape-sequence'},
{'include': '#string-line-continuation'},
{'include': '#string-formatting'},
],
},
'string-formatting': {
'captures': {
'1': {'name': 'constant.character.format.placeholder.other.python'},
},
'match':
'(%(\\([\\w\\s]*\\))?[- #+0]*(\\d+|\\*)?(\\.(\\d+|\\*))?([Lhl])?[%EFGXa-giorsux])',
'name': 'meta.format.percent.python',
},
'string-line-continuation': {
'match': '\\\\\$',
'name': 'constant.language.python',
},
'string-multi-bad-brace1-formatting-raw': {
'begin': '(?=\\{%(.*?(?!\'\'\'|"""))%})',
'end': '(?=\'\'\'|""")',
'patterns': [
{'include': '#string-consume-escape'},
],
},
'string-multi-bad-brace1-formatting-unicode': {
'begin': '(?=\\{%(.*?(?!\'\'\'|"""))%})',
'end': '(?=\'\'\'|""")',
'patterns': [
{'include': '#escape-sequence-unicode'},
{'include': '#escape-sequence'},
{'include': '#string-line-continuation'},
],
},
'string-multi-bad-brace2-formatting-raw': {
'begin':
'(?!\\{\\{)(?=\\{(\\w*?(?!\'\'\'|""")[^!.:\\[}\\w]).*?(?!\'\'\'|""")})',
'end': '(?=\'\'\'|""")',
'patterns': [
{'include': '#string-consume-escape'},
{'include': '#string-formatting'},
],
},
'string-multi-bad-brace2-formatting-unicode': {
'begin':
'(?!\\{\\{)(?=\\{(\\w*?(?!\'\'\'|""")[^!.:\\[}\\w]).*?(?!\'\'\'|""")})',
'end': '(?=\'\'\'|""")',
'patterns': [
{'include': '#escape-sequence-unicode'},
{'include': '#string-entity'},
],
},
'string-quoted-multi-line': {
'begin': '(?:\\b([Rr])(?=[Uu]))?([Uu])?(\'\'\'|""")',
'beginCaptures': {
'1': {'name': 'invalid.illegal.prefix.python'},
'2': {'name': 'storage.type.string.python'},
'3': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\3)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.multi.python',
'patterns': [
{'include': '#string-multi-bad-brace1-formatting-unicode'},
{'include': '#string-multi-bad-brace2-formatting-unicode'},
{'include': '#string-unicode-guts'},
],
},
'string-quoted-single-line': {
'begin': '(?:\\b([Rr])(?=[Uu]))?([Uu])?((["\']))',
'beginCaptures': {
'1': {'name': 'invalid.illegal.prefix.python'},
'2': {'name': 'storage.type.string.python'},
'3': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\3)|((?<!\\\\)\\n)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.single.python',
'patterns': [
{'include': '#string-single-bad-brace1-formatting-unicode'},
{'include': '#string-single-bad-brace2-formatting-unicode'},
{'include': '#string-unicode-guts'},
],
},
'string-raw-bin-guts': {
'patterns': [
{'include': '#string-consume-escape'},
{'include': '#string-formatting'},
],
},
'string-raw-bin-quoted-multi-line': {
'begin': '\\b(R[Bb]|[Bb]R)(\'\'\'|""")',
'beginCaptures': {
'1': {'name': 'storage.type.string.python'},
'2': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\2)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.raw.binary.multi.python',
'patterns': [
{'include': '#string-raw-bin-guts'},
],
},
'string-raw-bin-quoted-single-line': {
'begin': '\\b(R[Bb]|[Bb]R)((["\']))',
'beginCaptures': {
'1': {'name': 'storage.type.string.python'},
'2': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\2)|((?<!\\\\)\\n)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.raw.binary.single.python',
'patterns': [
{'include': '#string-raw-bin-guts'},
],
},
'string-raw-guts': {
'patterns': [
{'include': '#string-consume-escape'},
{'include': '#string-formatting'},
{'include': '#string-brace-formatting'},
],
},
'string-raw-quoted-multi-line': {
'begin': '\\b(([Uu]R)|(R))(\'\'\'|""")',
'beginCaptures': {
'2': {'name': 'invalid.deprecated.prefix.python'},
'3': {'name': 'storage.type.string.python'},
'4': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\4)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.raw.multi.python',
'patterns': [
{'include': '#string-multi-bad-brace1-formatting-raw'},
{'include': '#string-multi-bad-brace2-formatting-raw'},
{'include': '#string-raw-guts'},
],
},
'string-raw-quoted-single-line': {
'begin': '\\b(([Uu]R)|(R))((["\']))',
'beginCaptures': {
'2': {'name': 'invalid.deprecated.prefix.python'},
'3': {'name': 'storage.type.string.python'},
'4': {'name': 'punctuation.definition.string.begin.python'},
},
'end': '(\\4)|((?<!\\\\)\\n)',
'endCaptures': {
'1': {'name': 'punctuation.definition.string.end.python'},
'2': {'name': 'invalid.illegal.newline.python'},
},
'name': 'string.quoted.raw.single.python',
'patterns': [
{'include': '#string-single-bad-brace1-formatting-raw'},
{'include': '#string-single-bad-brace2-formatting-raw'},
{'include': '#string-raw-guts'},
],
},
'string-single-bad-brace1-formatting-raw': {
'begin': '(?=\\{%(.*?(?!(["\'])|((?<!\\\\)\\n)))%})',
'end': '(?=(["\'])|((?<!\\\\)\\n))',
'patterns': [
{'include': '#string-consume-escape'},
],
},
'string-single-bad-brace1-formatting-unicode': {
'begin': '(?=\\{%(.*?(?!(["\'])|((?<!\\\\)\\n)))%})',
'end': '(?=(["\'])|((?<!\\\\)\\n))',
'patterns': [
{'include': '#escape-sequence-unicode'},
{'include': '#escape-sequence'},
{'include': '#string-line-continuation'},
],
},
'string-single-bad-brace2-formatting-raw': {
'begin':
'(?!\\{\\{)(?=\\{(\\w*?(?!(["\'])|((?<!\\\\)\\n))[^!.:\\[}\\w]).*?(?!(["\'])|((?<!\\\\)\\n))})',
'end': '(?=(["\'])|((?<!\\\\)\\n))',
'patterns': [
{'include': '#string-consume-escape'},
{'include': '#string-formatting'},
],
},
'string-single-bad-brace2-formatting-unicode': {
'begin':
'(?!\\{\\{)(?=\\{(\\w*?(?!(["\'])|((?<!\\\\)\\n))[^!.:\\[}\\w]).*?(?!(["\'])|((?<!\\\\)\\n))})',
'end': '(?=(["\'])|((?<!\\\\)\\n))',
'patterns': [
{'include': '#escape-sequence-unicode'},
{'include': '#string-entity'},
],
},
'string-unicode-guts': {
'patterns': [
{'include': '#escape-sequence-unicode'},
{'include': '#string-entity'},
{'include': '#string-brace-formatting'},
],
},
},
'scopeName': 'source.python',
},
);