elm.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. """
  2. pygments.lexers.elm
  3. ~~~~~~~~~~~~~~~~~~~
  4. Lexer for the Elm programming language.
  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, words, include, bygroups
  9. from pygments.token import Comment, Keyword, Name, Number, Punctuation, \
  10. String, Whitespace
  11. __all__ = ['ElmLexer']
  12. class ElmLexer(RegexLexer):
  13. """
  14. For Elm source code.
  15. """
  16. name = 'Elm'
  17. url = 'https://elm-lang.org/'
  18. aliases = ['elm']
  19. filenames = ['*.elm']
  20. mimetypes = ['text/x-elm']
  21. version_added = '2.1'
  22. validName = r'[a-z_][a-zA-Z0-9_\']*'
  23. specialName = r'^main '
  24. builtinOps = (
  25. '~', '||', '|>', '|', '`', '^', '\\', '\'', '>>', '>=', '>', '==',
  26. '=', '<~', '<|', '<=', '<<', '<-', '<', '::', ':', '/=', '//', '/',
  27. '..', '.', '->', '-', '++', '+', '*', '&&', '%',
  28. )
  29. reservedWords = words((
  30. 'alias', 'as', 'case', 'else', 'if', 'import', 'in',
  31. 'let', 'module', 'of', 'port', 'then', 'type', 'where',
  32. ), suffix=r'\b')
  33. tokens = {
  34. 'root': [
  35. # Comments
  36. (r'\{-', Comment.Multiline, 'comment'),
  37. (r'--.*', Comment.Single),
  38. # Whitespace
  39. (r'\s+', Whitespace),
  40. # Strings
  41. (r'"', String, 'doublequote'),
  42. # Modules
  43. (r'^(\s*)(module)(\s*)', bygroups(Whitespace, Keyword.Namespace,
  44. Whitespace), 'imports'),
  45. # Imports
  46. (r'^(\s*)(import)(\s*)', bygroups(Whitespace, Keyword.Namespace,
  47. Whitespace), 'imports'),
  48. # Shaders
  49. (r'\[glsl\|.*', Name.Entity, 'shader'),
  50. # Keywords
  51. (reservedWords, Keyword.Reserved),
  52. # Types
  53. (r'[A-Z][a-zA-Z0-9_]*', Keyword.Type),
  54. # Main
  55. (specialName, Keyword.Reserved),
  56. # Prefix Operators
  57. (words((builtinOps), prefix=r'\(', suffix=r'\)'), Name.Function),
  58. # Infix Operators
  59. (words(builtinOps), Name.Function),
  60. # Numbers
  61. include('numbers'),
  62. # Variable Names
  63. (validName, Name.Variable),
  64. # Parens
  65. (r'[,()\[\]{}]', Punctuation),
  66. ],
  67. 'comment': [
  68. (r'-(?!\})', Comment.Multiline),
  69. (r'\{-', Comment.Multiline, 'comment'),
  70. (r'[^-}]', Comment.Multiline),
  71. (r'-\}', Comment.Multiline, '#pop'),
  72. ],
  73. 'doublequote': [
  74. (r'\\u[0-9a-fA-F]{4}', String.Escape),
  75. (r'\\[nrfvb\\"]', String.Escape),
  76. (r'[^"]', String),
  77. (r'"', String, '#pop'),
  78. ],
  79. 'imports': [
  80. (r'\w+(\.\w+)*', Name.Class, '#pop'),
  81. ],
  82. 'numbers': [
  83. (r'_?\d+\.(?=\d+)', Number.Float),
  84. (r'_?\d+', Number.Integer),
  85. ],
  86. 'shader': [
  87. (r'\|(?!\])', Name.Entity),
  88. (r'\|\]', Name.Entity, '#pop'),
  89. (r'(.*)(\n)', bygroups(Name.Entity, Whitespace)),
  90. ],
  91. }