123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- """
- pygments.lexers.tact
- ~~~~~~~~~~~~~~~~~~~~
- Lexers for Tact.
- :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
- :license: BSD, see LICENSE for details.
- """
- from pygments.lexer import RegexLexer, include, bygroups, words
- from pygments.token import Comment, Operator, Keyword, Name, String, \
- Number, Whitespace, Punctuation
- __all__ = ['TactLexer']
- class TactLexer(RegexLexer):
- """For Tact source code."""
- name = 'Tact'
- aliases = ['tact']
- filenames = ['*.tact']
- url = "https://tact-lang.org"
- version_added = '2.18'
- tokens = {
- 'root': [
- (r'\s+', Whitespace),
- (r'[.;(),\[\]{}]', Punctuation),
- (r'\?|!!', Operator),
- include('comments'),
- include('import-in'),
- include('struct-in'),
- include('contract-or-trait-in'),
- include('annotation-in'),
- include('fun-declaration-in'),
- include('const-declaration-in'),
- include('statements'),
- ],
- 'import-in': [
- (r'((?<=\.\.\.)|(?<![.$]))\b(import)\b(\s*)', bygroups(Punctuation, Keyword, Whitespace), 'import'),
- ],
- 'import': [
- (r';', Punctuation, '#pop'),
- include('comments'),
- include('string-in'),
- (r'\s+', Whitespace),
- ],
- 'struct-in': [
- (r'((?<=\.\.\.)|(?<![.$]))\b(struct|message)\b', bygroups(Punctuation, Keyword), 'struct'),
- ],
- 'struct': [
- include('comments'),
- include('struct-header'),
- include('struct-body-in'),
- (r'\s+', Whitespace),
- ],
- 'struct-header': [
- include('comments'),
- (r'\b\w+', Name.Class),
- (r'(\()((?:\b0[xX])[0-9a-fA-F][0-9a-fA-F_]*\b)(\))', bygroups(Punctuation, Number.Hex, Punctuation)),
- (r'(\()((?:\b[0-9]+\b))(\))', bygroups(Punctuation, Number.Integer, Punctuation)),
- ],
- 'struct-body-in': [
- (r'\{', Punctuation, 'struct-body'),
- ],
- 'struct-body': [
- (r'\}', Punctuation, '#pop:2'),
- include('comments'),
- include('field-declaration-in'),
- ],
- 'contract-or-trait-in': [
- (r'((?<=\.\.\.)|(?<![.$]))\b(contract|trait)\b', Keyword, 'contract-or-trait'),
- ],
- 'contract-or-trait': [
- include('comments'),
- (r'with', Keyword),
- (r'\b\w+', Name.Class),
- include('contract-or-trait-body-in'),
- (r'\s+', Whitespace),
- (r',', Punctuation),
- ],
- 'contract-or-trait-body-in': [
- (r'\{', Punctuation, 'contract-or-trait-body'),
- ],
- 'contract-or-trait-body': [
- (r'\}', Punctuation, '#pop:2'),
- include('comments'),
- include('init-declaration-in'),
- include('receive-declaration-in'),
- include('bounce-declaration-in'),
- include('fun-declaration-in'),
- include('const-declaration-in'),
- include('field-declaration-in'),
- (r'\s+', Whitespace),
- ],
- 'field-declaration-in': [
- (r'\b\w+', Name.Property, 'field-declaration'),
- ],
- 'field-declaration': [
- (r';', Punctuation, '#pop'),
- include('comments'),
- include('type-annotation-in'),
- include('variable-init-in'),
- ],
- 'const-declaration-in': [
- (r'(?=\b(?:(?:get|native|extends|mutates|virtual|override|inline|abstract)\s*)*const\b)', Keyword, 'const-declaration'),
- ],
- 'const-declaration': [
- (r'(;)', Punctuation, '#pop'),
- (r'const', Keyword),
- (words(('get', 'native', 'extends', 'mutates', 'virtual', 'override', 'inline', 'abstract'), suffix=r'\b'), Keyword),
- (r'\b\w+\b', Name.Constant),
- include('comments'),
- include('type-annotation-in'),
- include('variable-init-in'),
- (r'\s+', Whitespace),
- ],
- 'init-declaration-in': [
- (r'(init)', Keyword, 'init-declaration')
- ],
- 'init-declaration': [
- (r'(?<=\})', Punctuation, '#pop'),
- include('comments'),
- include('fun-arguments-in'),
- include('block-declaration-in'),
- (r'\s+', Whitespace),
- ],
- 'receive-declaration-in': [
- (r'(receive|exernal)', Keyword, 'receive-declaration')
- ],
- 'receive-declaration': [
- (r'(?<=\})', Punctuation, '#pop'),
- include('comments'),
- include('fun-arguments-in'),
- include('block-declaration-in'),
- ],
- 'bounce-declaration-in': [
- (r'(bounced)', Keyword, 'bounce-declaration')
- ],
- 'bounce-declaration': [
- (r'(?<=\})', Punctuation, '#pop'),
- include('comments'),
- include('fun-arguments-in'),
- include('block-declaration-in'),
- ],
- 'fun-declaration-in': [
- (r'(?=\b(?:(?:get|native|extends|mutates|virtual|override|inline|abstract)\s*)*fun\b)', Keyword, 'fun-declaration')
- ],
- 'fun-declaration': [
- (r'(?<=\}|\;)', Punctuation, '#pop'),
- (r'fun', Keyword),
- (r'\b(get|native|extends|mutates|virtual|override|inline|abstract)\b', Keyword),
- (r'\b[\w]+', Name.Function),
- include('fun-declaration-body'),
- (r'[,;]', Punctuation),
- ],
- 'fun-declaration-body': [
- include('comments'),
- include('fun-arguments-in'),
- include('type-annotation-in'),
- include('block-declaration-in'),
- (r'\s+', Whitespace),
- ],
- 'fun-arguments-in': [
- (r'\(', Punctuation, 'fun-arguments'),
- ],
- 'fun-arguments': [
- (r'\)', Punctuation, '#pop'),
- include('comments'),
- include('string-in'),
- include('type-annotation-in'),
- (r'(self)|(\b[\w]+\b)', bygroups(Name.Variable.Instance, Name.Variable)),
- (r',', Punctuation),
- (r'\s+', Whitespace),
- ],
- 'block-declaration-in': [
- (r'\{', Punctuation, 'block-declaration')
- ],
- 'block-declaration': [
- (r'\}', Punctuation, '#pop'),
- include('statements'),
- ],
- 'statements': [
- include('comments'),
- include('block-declaration-in'),
- include('expressions'),
- ],
- 'annotation-in': [
- (r'(@)(\w+)(\()', bygroups(Keyword.Pseudo, Keyword, Punctuation), 'annotation')
- ],
- 'annotation': [
- (r'\)', Punctuation, '#pop'),
- include('annotation-argument'),
- (r'\s+', Whitespace),
- ],
- 'annotation-argument': [
- (r'\w+', Name.Function.Magic),
- ],
- 'expressions': [
- include('comments'),
- include('type-annotation-in'),
- include('keywords'),
- include('numeric'),
- include('string-in'),
- include('variable'),
- include('function-call'),
- include('struct-init-in'),
- ],
- 'struct-init-in': [
- (r'(\b\w+)(\s*)(\{)', bygroups(Name.Class, Whitespace, Punctuation), 'struct-init')
- ],
- 'struct-init': [
- (r'(\})', Punctuation, '#pop'),
- include('comments'),
- include('struct-property-in'),
- (r'\s+', Whitespace),
- (r',', Punctuation),
- ],
- 'struct-property-in': [
- (r'(\b[\w]+)(\s*)(:)', bygroups(Name.Property, Whitespace, Punctuation), 'struct-property')
- ],
- 'struct-property': [
- (r'(?=\}|\,)', Punctuation, '#pop'),
- include('comments'),
- include('expressions'),
- (r'\s+', Whitespace),
- ],
- 'variable-init-in': [
- (r'(=)', Operator, 'variable-init')
- ],
- 'variable-init': [
- (r'(?=\}|\{|\,|\;)',Punctuation, '#pop'),
- include('comments'),
- include('expressions'),
- (r'\s+', Whitespace),
- ],
- 'type-annotation-in': [
- (r'(:)(\s+)', bygroups(Punctuation, Whitespace), 'type-annotation')
- ],
- 'type-annotation': [
- (r'(?=\{|\;|\=|\,|\))', Punctuation, '#pop'),
- include('comments'),
- include('type-as-in'),
- include('type-generic-in'),
- (r'\?', Operator),
- (r'\b\w+', Keyword.Type),
- (r'\s+', Whitespace),
- ],
- 'type-generic-in': [
- (r'<', Punctuation, 'type-generic'),
- ],
- 'type-generic': [
- (r'>', Punctuation, '#pop'),
- include('comments'),
- include('type-as-in'),
- (r'\b\w+', Keyword.Type),
- (r'\s+', Whitespace),
- (r',', Punctuation),
- ],
- 'type-as-in': [
- (r'\b(as)(\s+)', bygroups(Keyword, Whitespace), 'type-as'),
- ],
- 'type-as': [
- (r'(?=\{|\;|\=|\,|\)|\>)', Punctuation, '#pop'),
- include('comments'),
- (r'\b\w+', Keyword.Type),
- (r'\s+', Whitespace),
- ],
- 'keywords': [
- (words(('if', 'else', 'while', 'do', 'until', 'repeat', 'return', 'extends', 'mutates', 'virtual', 'override', 'inline', 'native', 'let', 'const', 'fun', 'self', 'is', 'initOf', 'map', 'bounced', 'get', 'as'), prefix=r'\b', suffix=r'\b'), Keyword),
- (r'(<=>|>=|<=|!=|==|\^>>|~>>|>>|<<|\/%|\^%|~%|\^\/|~\/|\+=|-=|\*=|\/=|~\/=|\^\/=|%=|\^%=|<<=|>>=|~>>=|\^>>=|&=|\|=|\^=|\^|=|~|\/|%|-|\*|\+|>|<|&|\||:|\?)', Operator),
- (words(('true', 'false'), prefix=r'\b', suffix=r'\b'), Keyword.Constant),
- ],
- 'string-in': [
- (r'"', String, 'string'),
- ],
- 'string': [
- (r'"', String, '#pop'),
- (r'\\.', String.Escape),
- (r'[^\\"]+', String.Double),
- ],
- 'numeric': [
- (r'(?:\b0[xX])[0-9a-fA-F][0-9a-fA-F_]*\b', Number.Hex),
- (r'(?:\b[0-9]+\b)', Number.Integer),
- ],
- 'comments': [
- (r'//.*', Comment.Single),
- (r'/\*', Comment.Multiline, 'comments-multiline'),
- ],
- 'comments-multiline': [
- (r'\*/', Comment.Multiline, '#pop'),
- (r'[^*]+', Comment.Multiline),
- (r'[*]', Comment.Multiline),
- ],
- 'variable': [
- (r'\b\w+\b(?!\s*\()(?!\s*\{)', Name.Variable)
- ],
- 'function-call': [
- (r'\b\w+\b(?=\s*\()(?!\s*\{)', Name.Function)
- ],
- }
|