gleam.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. """
  2. pygments.lexers.gleam
  3. ~~~~~~~~~~~~~~~~~~~~~
  4. Lexer for the Gleam programming language.
  5. :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
  6. :license: BSD, see LICENSE for details.
  7. """
  8. from pygments.lexer import RegexLexer, words, bygroups
  9. from pygments.token import Comment, Operator, Keyword, Name, String, \
  10. Number, Punctuation, Whitespace
  11. __all__ = ['GleamLexer']
  12. class GleamLexer(RegexLexer):
  13. """
  14. Lexer for the Gleam programming language (version 1.0.0).
  15. """
  16. name = 'Gleam'
  17. url = 'https://gleam.run/'
  18. filenames = ['*.gleam']
  19. aliases = ['gleam']
  20. mimetypes = ['text/x-gleam']
  21. version_added = '2.19'
  22. keywords = words((
  23. 'as', 'assert', 'auto', 'case', 'const', 'delegate', 'derive', 'echo',
  24. 'else', 'fn', 'if', 'implement', 'import', 'let', 'macro', 'opaque',
  25. 'panic', 'pub', 'test', 'todo', 'type', 'use',
  26. ), suffix=r'\b')
  27. tokens = {
  28. 'root': [
  29. # Comments
  30. (r'(///.*?)(\n)', bygroups(String.Doc, Whitespace)),
  31. (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
  32. # Keywords
  33. (keywords, Keyword),
  34. (r'([a-zA-Z_]+)(\.)', bygroups(Keyword, Punctuation)),
  35. # Punctuation
  36. (r'[()\[\]{}:;,@]+', Punctuation),
  37. (r'(#|!=|!|==|\|>|\|\||\||\->|<\-|&&|<<|>>|\.\.|\.|=)', Punctuation),
  38. # Operators
  39. (r'(<>|\+\.?|\-\.?|\*\.?|/\.?|%\.?|<=\.?|>=\.?|<\.?|>\.?|=)', Operator),
  40. # Strings
  41. (r'"(\\"|[^"])*"', String),
  42. # Identifiers
  43. (r'\b(let)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Variable)),
  44. (r'\b(fn)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Function)),
  45. (r'[a-zA-Z_/]\w*', Name),
  46. # numbers
  47. (r'(\d+(_\d+)*\.(?!\.)(\d+(_\d+)*)?|\.\d+(_\d+)*)([eEf][+-]?[0-9]+)?', Number.Float),
  48. (r'\d+(_\d+)*[eEf][+-]?[0-9]+', Number.Float),
  49. (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*(\.([a-fA-F0-9]+(_[a-fA-F0-9]+)*)?)?p[+-]?\d+', Number.Float),
  50. (r'0[bB][01]+(_[01]+)*', Number.Bin),
  51. (r'0[oO][0-7]+(_[0-7]+)*', Number.Oct),
  52. (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*', Number.Hex),
  53. (r'\d+(_\d+)*', Number.Integer),
  54. # Whitespace
  55. (r'\s+', Whitespace),
  56. ],
  57. }