Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

145 строки
6.2 KiB

  1. """
  2. pygments.lexers.ecl
  3. ~~~~~~~~~~~~~~~~~~~
  4. Lexers for the ECL language.
  5. :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
  6. :license: BSD, see LICENSE for details.
  7. """
  8. import re
  9. from pygments.lexer import RegexLexer, include, bygroups, words
  10. from pygments.token import Comment, Operator, Keyword, Name, String, \
  11. Number, Punctuation, Whitespace
  12. __all__ = ['ECLLexer']
  13. class ECLLexer(RegexLexer):
  14. """
  15. Lexer for the declarative big-data ECL language.
  16. """
  17. name = 'ECL'
  18. url = 'https://hpccsystems.com/training/documentation/ecl-language-reference/html'
  19. aliases = ['ecl']
  20. filenames = ['*.ecl']
  21. mimetypes = ['application/x-ecl']
  22. version_added = '1.5'
  23. flags = re.IGNORECASE | re.MULTILINE
  24. tokens = {
  25. 'root': [
  26. include('whitespace'),
  27. include('statements'),
  28. ],
  29. 'whitespace': [
  30. (r'\s+', Whitespace),
  31. (r'\/\/.*', Comment.Single),
  32. (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment.Multiline),
  33. ],
  34. 'statements': [
  35. include('types'),
  36. include('keywords'),
  37. include('functions'),
  38. include('hash'),
  39. (r'"', String, 'string'),
  40. (r'\'', String, 'string'),
  41. (r'(\d+\.\d*|\.\d+|\d+)e[+-]?\d+[lu]*', Number.Float),
  42. (r'(\d+\.\d*|\.\d+|\d+f)f?', Number.Float),
  43. (r'0x[0-9a-f]+[lu]*', Number.Hex),
  44. (r'0[0-7]+[lu]*', Number.Oct),
  45. (r'\d+[lu]*', Number.Integer),
  46. (r'[~!%^&*+=|?:<>/-]+', Operator),
  47. (r'[{}()\[\],.;]', Punctuation),
  48. (r'[a-z_]\w*', Name),
  49. ],
  50. 'hash': [
  51. (r'^#.*$', Comment.Preproc),
  52. ],
  53. 'types': [
  54. (r'(RECORD|END)\D', Keyword.Declaration),
  55. (r'((?:ASCII|BIG_ENDIAN|BOOLEAN|DATA|DECIMAL|EBCDIC|INTEGER|PATTERN|'
  56. r'QSTRING|REAL|RECORD|RULE|SET OF|STRING|TOKEN|UDECIMAL|UNICODE|'
  57. r'UNSIGNED|VARSTRING|VARUNICODE)\d*)(\s+)',
  58. bygroups(Keyword.Type, Whitespace)),
  59. ],
  60. 'keywords': [
  61. (words((
  62. 'APPLY', 'ASSERT', 'BUILD', 'BUILDINDEX', 'EVALUATE', 'FAIL',
  63. 'KEYDIFF', 'KEYPATCH', 'LOADXML', 'NOTHOR', 'NOTIFY', 'OUTPUT',
  64. 'PARALLEL', 'SEQUENTIAL', 'SOAPCALL', 'CHECKPOINT', 'DEPRECATED',
  65. 'FAILCODE', 'FAILMESSAGE', 'FAILURE', 'GLOBAL', 'INDEPENDENT',
  66. 'ONWARNING', 'PERSIST', 'PRIORITY', 'RECOVERY', 'STORED', 'SUCCESS',
  67. 'WAIT', 'WHEN'), suffix=r'\b'),
  68. Keyword.Reserved),
  69. # These are classed differently, check later
  70. (words((
  71. 'ALL', 'AND', 'ANY', 'AS', 'ATMOST', 'BEFORE', 'BEGINC++', 'BEST',
  72. 'BETWEEN', 'CASE', 'CONST', 'COUNTER', 'CSV', 'DESCEND', 'ENCRYPT',
  73. 'ENDC++', 'ENDMACRO', 'EXCEPT', 'EXCLUSIVE', 'EXPIRE', 'EXPORT',
  74. 'EXTEND', 'FALSE', 'FEW', 'FIRST', 'FLAT', 'FULL', 'FUNCTION',
  75. 'GROUP', 'HEADER', 'HEADING', 'HOLE', 'IFBLOCK', 'IMPORT', 'IN',
  76. 'JOINED', 'KEEP', 'KEYED', 'LAST', 'LEFT', 'LIMIT', 'LOAD', 'LOCAL',
  77. 'LOCALE', 'LOOKUP', 'MACRO', 'MANY', 'MAXCOUNT', 'MAXLENGTH',
  78. 'MIN SKEW', 'MODULE', 'INTERFACE', 'NAMED', 'NOCASE', 'NOROOT',
  79. 'NOSCAN', 'NOSORT', 'NOT', 'OF', 'ONLY', 'OPT', 'OR', 'OUTER',
  80. 'OVERWRITE', 'PACKED', 'PARTITION', 'PENALTY', 'PHYSICALLENGTH',
  81. 'PIPE', 'QUOTE', 'RELATIONSHIP', 'REPEAT', 'RETURN', 'RIGHT',
  82. 'SCAN', 'SELF', 'SEPARATOR', 'SERVICE', 'SHARED', 'SKEW', 'SKIP',
  83. 'SQL', 'STORE', 'TERMINATOR', 'THOR', 'THRESHOLD', 'TOKEN',
  84. 'TRANSFORM', 'TRIM', 'TRUE', 'TYPE', 'UNICODEORDER', 'UNSORTED',
  85. 'VALIDATE', 'VIRTUAL', 'WHOLE', 'WILD', 'WITHIN', 'XML', 'XPATH',
  86. '__COMPRESSED__'), suffix=r'\b'),
  87. Keyword.Reserved),
  88. ],
  89. 'functions': [
  90. (words((
  91. 'ABS', 'ACOS', 'ALLNODES', 'ASCII', 'ASIN', 'ASSTRING', 'ATAN',
  92. 'ATAN2', 'AVE', 'CASE', 'CHOOSE', 'CHOOSEN', 'CHOOSESETS',
  93. 'CLUSTERSIZE', 'COMBINE', 'CORRELATION', 'COS', 'COSH', 'COUNT',
  94. 'COVARIANCE', 'CRON', 'DATASET', 'DEDUP', 'DEFINE', 'DENORMALIZE',
  95. 'DISTRIBUTE', 'DISTRIBUTED', 'DISTRIBUTION', 'EBCDIC', 'ENTH',
  96. 'ERROR', 'EVALUATE', 'EVENT', 'EVENTEXTRA', 'EVENTNAME', 'EXISTS',
  97. 'EXP', 'FAILCODE', 'FAILMESSAGE', 'FETCH', 'FROMUNICODE',
  98. 'GETISVALID', 'GLOBAL', 'GRAPH', 'GROUP', 'HASH', 'HASH32',
  99. 'HASH64', 'HASHCRC', 'HASHMD5', 'HAVING', 'IF', 'INDEX',
  100. 'INTFORMAT', 'ISVALID', 'ITERATE', 'JOIN', 'KEYUNICODE', 'LENGTH',
  101. 'LIBRARY', 'LIMIT', 'LN', 'LOCAL', 'LOG', 'LOOP', 'MAP', 'MATCHED',
  102. 'MATCHLENGTH', 'MATCHPOSITION', 'MATCHTEXT', 'MATCHUNICODE', 'MAX',
  103. 'MERGE', 'MERGEJOIN', 'MIN', 'NOLOCAL', 'NONEMPTY', 'NORMALIZE',
  104. 'PARSE', 'PIPE', 'POWER', 'PRELOAD', 'PROCESS', 'PROJECT', 'PULL',
  105. 'RANDOM', 'RANGE', 'RANK', 'RANKED', 'REALFORMAT', 'RECORDOF',
  106. 'REGEXFIND', 'REGEXREPLACE', 'REGROUP', 'REJECTED', 'ROLLUP',
  107. 'ROUND', 'ROUNDUP', 'ROW', 'ROWDIFF', 'SAMPLE', 'SET', 'SIN',
  108. 'SINH', 'SIZEOF', 'SOAPCALL', 'SORT', 'SORTED', 'SQRT', 'STEPPED',
  109. 'STORED', 'SUM', 'TABLE', 'TAN', 'TANH', 'THISNODE', 'TOPN',
  110. 'TOUNICODE', 'TRANSFER', 'TRIM', 'TRUNCATE', 'TYPEOF', 'UNGROUP',
  111. 'UNICODEORDER', 'VARIANCE', 'WHICH', 'WORKUNIT', 'XMLDECODE',
  112. 'XMLENCODE', 'XMLTEXT', 'XMLUNICODE'), suffix=r'\b'),
  113. Name.Function),
  114. ],
  115. 'string': [
  116. (r'"', String, '#pop'),
  117. (r'\'', String, '#pop'),
  118. (r'[^"\']+', String),
  119. ],
  120. }
  121. def analyse_text(text):
  122. """This is very difficult to guess relative to other business languages.
  123. -> in conjunction with BEGIN/END seems relatively rare though."""
  124. result = 0
  125. if '->' in text:
  126. result += 0.01
  127. if 'BEGIN' in text:
  128. result += 0.01
  129. if 'END' in text:
  130. result += 0.01
  131. return result