tact.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. """
  2. pygments.lexers.tact
  3. ~~~~~~~~~~~~~~~~~~~~
  4. Lexers for Tact.
  5. :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
  6. :license: BSD, see LICENSE for details.
  7. """
  8. from pygments.lexer import RegexLexer, include, bygroups, words
  9. from pygments.token import Comment, Operator, Keyword, Name, String, \
  10. Number, Whitespace, Punctuation
  11. __all__ = ['TactLexer']
  12. class TactLexer(RegexLexer):
  13. """For Tact source code."""
  14. name = 'Tact'
  15. aliases = ['tact']
  16. filenames = ['*.tact']
  17. url = "https://tact-lang.org"
  18. version_added = '2.18'
  19. tokens = {
  20. 'root': [
  21. (r'\s+', Whitespace),
  22. (r'[.;(),\[\]{}]', Punctuation),
  23. (r'\?|!!', Operator),
  24. include('comments'),
  25. include('import-in'),
  26. include('struct-in'),
  27. include('contract-or-trait-in'),
  28. include('annotation-in'),
  29. include('fun-declaration-in'),
  30. include('const-declaration-in'),
  31. include('statements'),
  32. ],
  33. 'import-in': [
  34. (r'((?<=\.\.\.)|(?<![.$]))\b(import)\b(\s*)', bygroups(Punctuation, Keyword, Whitespace), 'import'),
  35. ],
  36. 'import': [
  37. (r';', Punctuation, '#pop'),
  38. include('comments'),
  39. include('string-in'),
  40. (r'\s+', Whitespace),
  41. ],
  42. 'struct-in': [
  43. (r'((?<=\.\.\.)|(?<![.$]))\b(struct|message)\b', bygroups(Punctuation, Keyword), 'struct'),
  44. ],
  45. 'struct': [
  46. include('comments'),
  47. include('struct-header'),
  48. include('struct-body-in'),
  49. (r'\s+', Whitespace),
  50. ],
  51. 'struct-header': [
  52. include('comments'),
  53. (r'\b\w+', Name.Class),
  54. (r'(\()((?:\b0[xX])[0-9a-fA-F][0-9a-fA-F_]*\b)(\))', bygroups(Punctuation, Number.Hex, Punctuation)),
  55. (r'(\()((?:\b[0-9]+\b))(\))', bygroups(Punctuation, Number.Integer, Punctuation)),
  56. ],
  57. 'struct-body-in': [
  58. (r'\{', Punctuation, 'struct-body'),
  59. ],
  60. 'struct-body': [
  61. (r'\}', Punctuation, '#pop:2'),
  62. include('comments'),
  63. include('field-declaration-in'),
  64. ],
  65. 'contract-or-trait-in': [
  66. (r'((?<=\.\.\.)|(?<![.$]))\b(contract|trait)\b', Keyword, 'contract-or-trait'),
  67. ],
  68. 'contract-or-trait': [
  69. include('comments'),
  70. (r'with', Keyword),
  71. (r'\b\w+', Name.Class),
  72. include('contract-or-trait-body-in'),
  73. (r'\s+', Whitespace),
  74. (r',', Punctuation),
  75. ],
  76. 'contract-or-trait-body-in': [
  77. (r'\{', Punctuation, 'contract-or-trait-body'),
  78. ],
  79. 'contract-or-trait-body': [
  80. (r'\}', Punctuation, '#pop:2'),
  81. include('comments'),
  82. include('init-declaration-in'),
  83. include('receive-declaration-in'),
  84. include('bounce-declaration-in'),
  85. include('fun-declaration-in'),
  86. include('const-declaration-in'),
  87. include('field-declaration-in'),
  88. (r'\s+', Whitespace),
  89. ],
  90. 'field-declaration-in': [
  91. (r'\b\w+', Name.Property, 'field-declaration'),
  92. ],
  93. 'field-declaration': [
  94. (r';', Punctuation, '#pop'),
  95. include('comments'),
  96. include('type-annotation-in'),
  97. include('variable-init-in'),
  98. ],
  99. 'const-declaration-in': [
  100. (r'(?=\b(?:(?:get|native|extends|mutates|virtual|override|inline|abstract)\s*)*const\b)', Keyword, 'const-declaration'),
  101. ],
  102. 'const-declaration': [
  103. (r'(;)', Punctuation, '#pop'),
  104. (r'const', Keyword),
  105. (words(('get', 'native', 'extends', 'mutates', 'virtual', 'override', 'inline', 'abstract'), suffix=r'\b'), Keyword),
  106. (r'\b\w+\b', Name.Constant),
  107. include('comments'),
  108. include('type-annotation-in'),
  109. include('variable-init-in'),
  110. (r'\s+', Whitespace),
  111. ],
  112. 'init-declaration-in': [
  113. (r'(init)', Keyword, 'init-declaration')
  114. ],
  115. 'init-declaration': [
  116. (r'(?<=\})', Punctuation, '#pop'),
  117. include('comments'),
  118. include('fun-arguments-in'),
  119. include('block-declaration-in'),
  120. (r'\s+', Whitespace),
  121. ],
  122. 'receive-declaration-in': [
  123. (r'(receive|exernal)', Keyword, 'receive-declaration')
  124. ],
  125. 'receive-declaration': [
  126. (r'(?<=\})', Punctuation, '#pop'),
  127. include('comments'),
  128. include('fun-arguments-in'),
  129. include('block-declaration-in'),
  130. ],
  131. 'bounce-declaration-in': [
  132. (r'(bounced)', Keyword, 'bounce-declaration')
  133. ],
  134. 'bounce-declaration': [
  135. (r'(?<=\})', Punctuation, '#pop'),
  136. include('comments'),
  137. include('fun-arguments-in'),
  138. include('block-declaration-in'),
  139. ],
  140. 'fun-declaration-in': [
  141. (r'(?=\b(?:(?:get|native|extends|mutates|virtual|override|inline|abstract)\s*)*fun\b)', Keyword, 'fun-declaration')
  142. ],
  143. 'fun-declaration': [
  144. (r'(?<=\}|\;)', Punctuation, '#pop'),
  145. (r'fun', Keyword),
  146. (r'\b(get|native|extends|mutates|virtual|override|inline|abstract)\b', Keyword),
  147. (r'\b[\w]+', Name.Function),
  148. include('fun-declaration-body'),
  149. (r'[,;]', Punctuation),
  150. ],
  151. 'fun-declaration-body': [
  152. include('comments'),
  153. include('fun-arguments-in'),
  154. include('type-annotation-in'),
  155. include('block-declaration-in'),
  156. (r'\s+', Whitespace),
  157. ],
  158. 'fun-arguments-in': [
  159. (r'\(', Punctuation, 'fun-arguments'),
  160. ],
  161. 'fun-arguments': [
  162. (r'\)', Punctuation, '#pop'),
  163. include('comments'),
  164. include('string-in'),
  165. include('type-annotation-in'),
  166. (r'(self)|(\b[\w]+\b)', bygroups(Name.Variable.Instance, Name.Variable)),
  167. (r',', Punctuation),
  168. (r'\s+', Whitespace),
  169. ],
  170. 'block-declaration-in': [
  171. (r'\{', Punctuation, 'block-declaration')
  172. ],
  173. 'block-declaration': [
  174. (r'\}', Punctuation, '#pop'),
  175. include('statements'),
  176. ],
  177. 'statements': [
  178. include('comments'),
  179. include('block-declaration-in'),
  180. include('expressions'),
  181. ],
  182. 'annotation-in': [
  183. (r'(@)(\w+)(\()', bygroups(Keyword.Pseudo, Keyword, Punctuation), 'annotation')
  184. ],
  185. 'annotation': [
  186. (r'\)', Punctuation, '#pop'),
  187. include('annotation-argument'),
  188. (r'\s+', Whitespace),
  189. ],
  190. 'annotation-argument': [
  191. (r'\w+', Name.Function.Magic),
  192. ],
  193. 'expressions': [
  194. include('comments'),
  195. include('type-annotation-in'),
  196. include('keywords'),
  197. include('numeric'),
  198. include('string-in'),
  199. include('variable'),
  200. include('function-call'),
  201. include('struct-init-in'),
  202. ],
  203. 'struct-init-in': [
  204. (r'(\b\w+)(\s*)(\{)', bygroups(Name.Class, Whitespace, Punctuation), 'struct-init')
  205. ],
  206. 'struct-init': [
  207. (r'(\})', Punctuation, '#pop'),
  208. include('comments'),
  209. include('struct-property-in'),
  210. (r'\s+', Whitespace),
  211. (r',', Punctuation),
  212. ],
  213. 'struct-property-in': [
  214. (r'(\b[\w]+)(\s*)(:)', bygroups(Name.Property, Whitespace, Punctuation), 'struct-property')
  215. ],
  216. 'struct-property': [
  217. (r'(?=\}|\,)', Punctuation, '#pop'),
  218. include('comments'),
  219. include('expressions'),
  220. (r'\s+', Whitespace),
  221. ],
  222. 'variable-init-in': [
  223. (r'(=)', Operator, 'variable-init')
  224. ],
  225. 'variable-init': [
  226. (r'(?=\}|\{|\,|\;)',Punctuation, '#pop'),
  227. include('comments'),
  228. include('expressions'),
  229. (r'\s+', Whitespace),
  230. ],
  231. 'type-annotation-in': [
  232. (r'(:)(\s+)', bygroups(Punctuation, Whitespace), 'type-annotation')
  233. ],
  234. 'type-annotation': [
  235. (r'(?=\{|\;|\=|\,|\))', Punctuation, '#pop'),
  236. include('comments'),
  237. include('type-as-in'),
  238. include('type-generic-in'),
  239. (r'\?', Operator),
  240. (r'\b\w+', Keyword.Type),
  241. (r'\s+', Whitespace),
  242. ],
  243. 'type-generic-in': [
  244. (r'<', Punctuation, 'type-generic'),
  245. ],
  246. 'type-generic': [
  247. (r'>', Punctuation, '#pop'),
  248. include('comments'),
  249. include('type-as-in'),
  250. (r'\b\w+', Keyword.Type),
  251. (r'\s+', Whitespace),
  252. (r',', Punctuation),
  253. ],
  254. 'type-as-in': [
  255. (r'\b(as)(\s+)', bygroups(Keyword, Whitespace), 'type-as'),
  256. ],
  257. 'type-as': [
  258. (r'(?=\{|\;|\=|\,|\)|\>)', Punctuation, '#pop'),
  259. include('comments'),
  260. (r'\b\w+', Keyword.Type),
  261. (r'\s+', Whitespace),
  262. ],
  263. 'keywords': [
  264. (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),
  265. (r'(<=>|>=|<=|!=|==|\^>>|~>>|>>|<<|\/%|\^%|~%|\^\/|~\/|\+=|-=|\*=|\/=|~\/=|\^\/=|%=|\^%=|<<=|>>=|~>>=|\^>>=|&=|\|=|\^=|\^|=|~|\/|%|-|\*|\+|>|<|&|\||:|\?)', Operator),
  266. (words(('true', 'false'), prefix=r'\b', suffix=r'\b'), Keyword.Constant),
  267. ],
  268. 'string-in': [
  269. (r'"', String, 'string'),
  270. ],
  271. 'string': [
  272. (r'"', String, '#pop'),
  273. (r'\\.', String.Escape),
  274. (r'[^\\"]+', String.Double),
  275. ],
  276. 'numeric': [
  277. (r'(?:\b0[xX])[0-9a-fA-F][0-9a-fA-F_]*\b', Number.Hex),
  278. (r'(?:\b[0-9]+\b)', Number.Integer),
  279. ],
  280. 'comments': [
  281. (r'//.*', Comment.Single),
  282. (r'/\*', Comment.Multiline, 'comments-multiline'),
  283. ],
  284. 'comments-multiline': [
  285. (r'\*/', Comment.Multiline, '#pop'),
  286. (r'[^*]+', Comment.Multiline),
  287. (r'[*]', Comment.Multiline),
  288. ],
  289. 'variable': [
  290. (r'\b\w+\b(?!\s*\()(?!\s*\{)', Name.Variable)
  291. ],
  292. 'function-call': [
  293. (r'\b\w+\b(?=\s*\()(?!\s*\{)', Name.Function)
  294. ],
  295. }