Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/pygments/lexers/business.py: 97%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

70 statements  

1""" 

2 pygments.lexers.business 

3 ~~~~~~~~~~~~~~~~~~~~~~~~ 

4 

5 Lexers for "business-oriented" languages. 

6 

7 :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. 

8 :license: BSD, see LICENSE for details. 

9""" 

10 

11import re 

12 

13from pygments.lexer import RegexLexer, include, words, bygroups 

14from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ 

15 Number, Punctuation, Error, Whitespace 

16 

17from pygments.lexers._openedge_builtins import OPENEDGEKEYWORDS 

18 

19__all__ = ['CobolLexer', 'CobolFreeformatLexer', 'ABAPLexer', 'OpenEdgeLexer', 

20 'GoodDataCLLexer', 'MaqlLexer'] 

21 

22 

23class CobolLexer(RegexLexer): 

24 """ 

25 Lexer for OpenCOBOL code. 

26 """ 

27 name = 'COBOL' 

28 aliases = ['cobol'] 

29 filenames = ['*.cob', '*.COB', '*.cpy', '*.CPY'] 

30 mimetypes = ['text/x-cobol'] 

31 url = 'https://en.wikipedia.org/wiki/COBOL' 

32 version_added = '1.6' 

33 

34 flags = re.IGNORECASE | re.MULTILINE 

35 

36 # Data Types: by PICTURE and USAGE 

37 # Operators: **, *, +, -, /, <, >, <=, >=, =, <> 

38 # Logical (?): NOT, AND, OR 

39 

40 # Reserved words: 

41 # http://opencobol.add1tocobol.com/#reserved-words 

42 # Intrinsics: 

43 # http://opencobol.add1tocobol.com/#does-opencobol-implement-any-intrinsic-functions 

44 

45 tokens = { 

46 'root': [ 

47 include('comment'), 

48 include('strings'), 

49 include('core'), 

50 include('nums'), 

51 (r'[a-z0-9]([\w\-]*[a-z0-9]+)?', Name.Variable), 

52 # (r'[\s]+', Text), 

53 (r'[ \t]+', Whitespace), 

54 ], 

55 'comment': [ 

56 (r'(^.{6}[*/].*\n|^.{6}|\*>.*\n)', Comment), 

57 ], 

58 'core': [ 

59 # Figurative constants 

60 (r'(^|(?<=[^\w\-]))(ALL\s+)?' 

61 r'((ZEROES)|(HIGH-VALUE|LOW-VALUE|QUOTE|SPACE|ZERO)(S)?)' 

62 r'\s*($|(?=[^\w\-]))', 

63 Name.Constant), 

64 

65 # Reserved words STATEMENTS and other bolds 

66 (words(( 

67 'ACCEPT', 'ADD', 'ALLOCATE', 'CALL', 'CANCEL', 'CLOSE', 'COMPUTE', 

68 'CONFIGURATION', 'CONTINUE', 'DATA', 'DELETE', 'DISPLAY', 'DIVIDE', 

69 'DIVISION', 'ELSE', 'END', 'END-ACCEPT', 

70 'END-ADD', 'END-CALL', 'END-COMPUTE', 'END-DELETE', 'END-DISPLAY', 

71 'END-DIVIDE', 'END-EVALUATE', 'END-IF', 'END-MULTIPLY', 'END-OF-PAGE', 

72 'END-PERFORM', 'END-READ', 'END-RETURN', 'END-REWRITE', 'END-SEARCH', 

73 'END-START', 'END-STRING', 'END-SUBTRACT', 'END-UNSTRING', 'END-WRITE', 

74 'ENVIRONMENT', 'EVALUATE', 'EXIT', 'FD', 'FILE', 'FILE-CONTROL', 'FOREVER', 

75 'FREE', 'GENERATE', 'GO', 'GOBACK', 'IDENTIFICATION', 'IF', 'INITIALIZE', 

76 'INITIATE', 'INPUT-OUTPUT', 'INSPECT', 'INVOKE', 'I-O-CONTROL', 'LINKAGE', 

77 'LOCAL-STORAGE', 'MERGE', 'MOVE', 'MULTIPLY', 'OPEN', 'PERFORM', 

78 'PROCEDURE', 'PROGRAM-ID', 'RAISE', 'READ', 'RELEASE', 'RESUME', 

79 'RETURN', 'REWRITE', 'SCREEN', 'SD', 'SEARCH', 'SECTION', 'SET', 

80 'SORT', 'START', 'STOP', 'STRING', 'SUBTRACT', 'SUPPRESS', 

81 'TERMINATE', 'THEN', 'UNLOCK', 'UNSTRING', 'USE', 'VALIDATE', 

82 'WORKING-STORAGE', 'WRITE'), prefix=r'(^|(?<=[^\w\-]))', 

83 suffix=r'\s*($|(?=[^\w\-]))'), 

84 Keyword.Reserved), 

85 

86 # Reserved words 

87 (words(( 

88 'ACCESS', 'ADDRESS', 'ADVANCING', 'AFTER', 'ALL', 

89 'ALPHABET', 'ALPHABETIC', 'ALPHABETIC-LOWER', 'ALPHABETIC-UPPER', 

90 'ALPHANUMERIC', 'ALPHANUMERIC-EDITED', 'ALSO', 'ALTER', 'ALTERNATE' 

91 'ANY', 'ARE', 'AREA', 'AREAS', 'ARGUMENT-NUMBER', 'ARGUMENT-VALUE', 'AS', 

92 'ASCENDING', 'ASSIGN', 'AT', 'AUTO', 'AUTO-SKIP', 'AUTOMATIC', 

93 'AUTOTERMINATE', 'BACKGROUND-COLOR', 'BASED', 'BEEP', 'BEFORE', 'BELL', 

94 'BLANK', 'BLINK', 'BLOCK', 'BOTTOM', 'BY', 'BYTE-LENGTH', 'CHAINING', 

95 'CHARACTER', 'CHARACTERS', 'CLASS', 'CODE', 'CODE-SET', 'COL', 

96 'COLLATING', 'COLS', 'COLUMN', 'COLUMNS', 'COMMA', 'COMMAND-LINE', 

97 'COMMIT', 'COMMON', 'CONSTANT', 'CONTAINS', 'CONTENT', 'CONTROL', 

98 'CONTROLS', 'CONVERTING', 'COPY', 'CORR', 'CORRESPONDING', 'COUNT', 'CRT', 

99 'CURRENCY', 'CURSOR', 'CYCLE', 'DATE', 'DAY', 'DAY-OF-WEEK', 'DE', 

100 'DEBUGGING', 'DECIMAL-POINT', 'DECLARATIVES', 'DEFAULT', 'DELIMITED', 

101 'DELIMITER', 'DEPENDING', 'DESCENDING', 'DETAIL', 'DISK', 

102 'DOWN', 'DUPLICATES', 'DYNAMIC', 'EBCDIC', 

103 'ENTRY', 'ENVIRONMENT-NAME', 'ENVIRONMENT-VALUE', 'EOL', 'EOP', 

104 'EOS', 'ERASE', 'ERROR', 'ESCAPE', 'EXCEPTION', 

105 'EXCLUSIVE', 'EXTEND', 'EXTERNAL', 'FILE-ID', 'FILLER', 'FINAL', 

106 'FIRST', 'FIXED', 'FLOAT-LONG', 'FLOAT-SHORT', 

107 'FOOTING', 'FOR', 'FOREGROUND-COLOR', 'FORMAT', 'FROM', 'FULL', 

108 'FUNCTION', 'FUNCTION-ID', 'GIVING', 'GLOBAL', 'GROUP', 

109 'HEADING', 'HIGHLIGHT', 'I-O', 'ID', 

110 'IGNORE', 'IGNORING', 'IN', 'INDEX', 'INDEXED', 'INDICATE', 

111 'INITIAL', 'INITIALIZED', 'INPUT', 'INTO', 'INTRINSIC', 'INVALID', 

112 'IS', 'JUST', 'JUSTIFIED', 'KEY', 'LABEL', 

113 'LAST', 'LEADING', 'LEFT', 'LENGTH', 'LIMIT', 'LIMITS', 'LINAGE', 

114 'LINAGE-COUNTER', 'LINE', 'LINES', 'LOCALE', 'LOCK', 

115 'LOWLIGHT', 'MANUAL', 'MEMORY', 'MINUS', 'MODE', 'MULTIPLE', 

116 'NATIONAL', 'NATIONAL-EDITED', 'NATIVE', 'NEGATIVE', 'NEXT', 'NO', 

117 'NULL', 'NULLS', 'NUMBER', 'NUMBERS', 'NUMERIC', 'NUMERIC-EDITED', 

118 'OBJECT-COMPUTER', 'OCCURS', 'OF', 'OFF', 'OMITTED', 'ON', 'ONLY', 

119 'OPTIONAL', 'ORDER', 'ORGANIZATION', 'OTHER', 'OUTPUT', 'OVERFLOW', 

120 'OVERLINE', 'PACKED-DECIMAL', 'PADDING', 'PAGE', 'PARAGRAPH', 

121 'PLUS', 'POINTER', 'POSITION', 'POSITIVE', 'PRESENT', 'PREVIOUS', 

122 'PRINTER', 'PRINTING', 'PROCEDURE-POINTER', 'PROCEDURES', 

123 'PROCEED', 'PROGRAM', 'PROGRAM-POINTER', 'PROMPT', 'QUOTE', 

124 'QUOTES', 'RANDOM', 'RD', 'RECORD', 'RECORDING', 'RECORDS', 'RECURSIVE', 

125 'REDEFINES', 'REEL', 'REFERENCE', 'RELATIVE', 'REMAINDER', 'REMOVAL', 

126 'RENAMES', 'REPLACING', 'REPORT', 'REPORTING', 'REPORTS', 'REPOSITORY', 

127 'REQUIRED', 'RESERVE', 'RETURNING', 'REVERSE-VIDEO', 'REWIND', 

128 'RIGHT', 'ROLLBACK', 'ROUNDED', 'RUN', 'SAME', 'SCROLL', 

129 'SECURE', 'SEGMENT-LIMIT', 'SELECT', 'SENTENCE', 'SEPARATE', 

130 'SEQUENCE', 'SEQUENTIAL', 'SHARING', 'SIGN', 'SIGNED', 'SIGNED-INT', 

131 'SIGNED-LONG', 'SIGNED-SHORT', 'SIZE', 'SORT-MERGE', 'SOURCE', 

132 'SOURCE-COMPUTER', 'SPECIAL-NAMES', 'STANDARD', 

133 'STANDARD-1', 'STANDARD-2', 'STATUS', 'SUBKEY', 'SUM', 

134 'SYMBOLIC', 'SYNC', 'SYNCHRONIZED', 'TALLYING', 'TAPE', 

135 'TEST', 'THROUGH', 'THRU', 'TIME', 'TIMES', 'TO', 'TOP', 'TRAILING', 

136 'TRANSFORM', 'TYPE', 'UNDERLINE', 'UNIT', 'UNSIGNED', 

137 'UNSIGNED-INT', 'UNSIGNED-LONG', 'UNSIGNED-SHORT', 'UNTIL', 'UP', 

138 'UPDATE', 'UPON', 'USAGE', 'USING', 'VALUE', 'VALUES', 'VARYING', 

139 'WAIT', 'WHEN', 'WITH', 'WORDS', 'YYYYDDD', 'YYYYMMDD'), 

140 prefix=r'(^|(?<=[^\w\-]))', suffix=r'\s*($|(?=[^\w\-]))'), 

141 Keyword.Pseudo), 

142 

143 # inactive reserved words 

144 (words(( 

145 'ACTIVE-CLASS', 'ALIGNED', 'ANYCASE', 'ARITHMETIC', 'ATTRIBUTE', 

146 'B-AND', 'B-NOT', 'B-OR', 'B-XOR', 'BIT', 'BOOLEAN', 'CD', 'CENTER', 

147 'CF', 'CH', 'CHAIN', 'CLASS-ID', 'CLASSIFICATION', 'COMMUNICATION', 

148 'CONDITION', 'DATA-POINTER', 'DESTINATION', 'DISABLE', 'EC', 'EGI', 

149 'EMI', 'ENABLE', 'END-RECEIVE', 'ENTRY-CONVENTION', 'EO', 'ESI', 

150 'EXCEPTION-OBJECT', 'EXPANDS', 'FACTORY', 'FLOAT-BINARY-16', 

151 'FLOAT-BINARY-34', 'FLOAT-BINARY-7', 'FLOAT-DECIMAL-16', 

152 'FLOAT-DECIMAL-34', 'FLOAT-EXTENDED', 'FORMAT', 'FUNCTION-POINTER', 

153 'GET', 'GROUP-USAGE', 'IMPLEMENTS', 'INFINITY', 'INHERITS', 

154 'INTERFACE', 'INTERFACE-ID', 'INVOKE', 'LC_ALL', 'LC_COLLATE', 

155 'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME', 

156 'LINE-COUNTER', 'MESSAGE', 'METHOD', 'METHOD-ID', 'NESTED', 'NONE', 

157 'NORMAL', 'OBJECT', 'OBJECT-REFERENCE', 'OPTIONS', 'OVERRIDE', 

158 'PAGE-COUNTER', 'PF', 'PH', 'PROPERTY', 'PROTOTYPE', 'PURGE', 

159 'QUEUE', 'RAISE', 'RAISING', 'RECEIVE', 'RELATION', 'REPLACE', 

160 'REPRESENTS-NOT-A-NUMBER', 'RESET', 'RESUME', 'RETRY', 'RF', 'RH', 

161 'SECONDS', 'SEGMENT', 'SELF', 'SEND', 'SOURCES', 'STATEMENT', 

162 'STEP', 'STRONG', 'SUB-QUEUE-1', 'SUB-QUEUE-2', 'SUB-QUEUE-3', 

163 'SUPER', 'SYMBOL', 'SYSTEM-DEFAULT', 'TABLE', 'TERMINAL', 'TEXT', 

164 'TYPEDEF', 'UCS-4', 'UNIVERSAL', 'USER-DEFAULT', 'UTF-16', 'UTF-8', 

165 'VAL-STATUS', 'VALID', 'VALIDATE', 'VALIDATE-STATUS'), 

166 prefix=r'(^|(?<=[^\w\-]))', suffix=r'\s*($|(?=[^\w\-]))'), 

167 Error), 

168 

169 # Data Types 

170 (r'(^|(?<=[^\w\-]))' 

171 r'(PIC\s+.+?(?=(\s|\.\s))|PICTURE\s+.+?(?=(\s|\.\s))|' 

172 r'(COMPUTATIONAL)(-[1-5X])?|(COMP)(-[1-5X])?|' 

173 r'BINARY-C-LONG|' 

174 r'BINARY-CHAR|BINARY-DOUBLE|BINARY-LONG|BINARY-SHORT|' 

175 r'BINARY)\s*($|(?=[^\w\-]))', Keyword.Type), 

176 

177 # Operators 

178 (r'(\*\*|\*|\+|-|/|<=|>=|<|>|==|/=|=)', Operator), 

179 

180 # (r'(::)', Keyword.Declaration), 

181 

182 (r'([(),;:&%.])', Punctuation), 

183 

184 # Intrinsics 

185 (r'(^|(?<=[^\w\-]))(ABS|ACOS|ANNUITY|ASIN|ATAN|BYTE-LENGTH|' 

186 r'CHAR|COMBINED-DATETIME|CONCATENATE|COS|CURRENT-DATE|' 

187 r'DATE-OF-INTEGER|DATE-TO-YYYYMMDD|DAY-OF-INTEGER|DAY-TO-YYYYDDD|' 

188 r'EXCEPTION-(?:FILE|LOCATION|STATEMENT|STATUS)|EXP10|EXP|E|' 

189 r'FACTORIAL|FRACTION-PART|INTEGER-OF-(?:DATE|DAY|PART)|INTEGER|' 

190 r'LENGTH|LOCALE-(?:DATE|TIME(?:-FROM-SECONDS)?)|LOG(?:10)?|' 

191 r'LOWER-CASE|MAX|MEAN|MEDIAN|MIDRANGE|MIN|MOD|NUMVAL(?:-C)?|' 

192 r'ORD(?:-MAX|-MIN)?|PI|PRESENT-VALUE|RANDOM|RANGE|REM|REVERSE|' 

193 r'SECONDS-FROM-FORMATTED-TIME|SECONDS-PAST-MIDNIGHT|SIGN|SIN|SQRT|' 

194 r'STANDARD-DEVIATION|STORED-CHAR-LENGTH|SUBSTITUTE(?:-CASE)?|' 

195 r'SUM|TAN|TEST-DATE-YYYYMMDD|TEST-DAY-YYYYDDD|TRIM|' 

196 r'UPPER-CASE|VARIANCE|WHEN-COMPILED|YEAR-TO-YYYY)\s*' 

197 r'($|(?=[^\w\-]))', Name.Function), 

198 

199 # Booleans 

200 (r'(^|(?<=[^\w\-]))(true|false)\s*($|(?=[^\w\-]))', Name.Builtin), 

201 # Comparing Operators 

202 (r'(^|(?<=[^\w\-]))(equal|equals|ne|lt|le|gt|ge|' 

203 r'greater|less|than|not|and|or)\s*($|(?=[^\w\-]))', Operator.Word), 

204 ], 

205 

206 # \"[^\"\n]*\"|\'[^\'\n]*\' 

207 'strings': [ 

208 # apparently strings can be delimited by EOL if they are continued 

209 # in the next line 

210 (r'"[^"\n]*("|\n)', String.Double), 

211 (r"'[^'\n]*('|\n)", String.Single), 

212 ], 

213 

214 'nums': [ 

215 (r'\d+(\s*|\.$|$)', Number.Integer), 

216 (r'[+-]?\d*\.\d+(E[-+]?\d+)?', Number.Float), 

217 (r'[+-]?\d+\.\d*(E[-+]?\d+)?', Number.Float), 

218 ], 

219 } 

220 

221 

222class CobolFreeformatLexer(CobolLexer): 

223 """ 

224 Lexer for Free format OpenCOBOL code. 

225 """ 

226 name = 'COBOLFree' 

227 aliases = ['cobolfree'] 

228 filenames = ['*.cbl', '*.CBL'] 

229 mimetypes = [] 

230 url = 'https://opencobol.add1tocobol.com' 

231 version_added = '1.6' 

232 

233 flags = re.IGNORECASE | re.MULTILINE 

234 

235 tokens = { 

236 'comment': [ 

237 (r'(\*>.*\n|^\w*\*.*$)', Comment), 

238 ], 

239 } 

240 

241 

242class ABAPLexer(RegexLexer): 

243 """ 

244 Lexer for ABAP, SAP's integrated language. 

245 """ 

246 name = 'ABAP' 

247 aliases = ['abap'] 

248 filenames = ['*.abap', '*.ABAP'] 

249 mimetypes = ['text/x-abap'] 

250 url = 'https://community.sap.com/topics/abap' 

251 version_added = '1.1' 

252 

253 flags = re.IGNORECASE | re.MULTILINE 

254 

255 tokens = { 

256 'common': [ 

257 (r'\s+', Whitespace), 

258 (r'^\*.*$', Comment.Single), 

259 (r'\".*?\n', Comment.Single), 

260 (r'##\w+', Comment.Special), 

261 ], 

262 'variable-names': [ 

263 (r'<\S+>', Name.Variable), 

264 (r'\w[\w~]*(?:(\[\])|->\*)?', Name.Variable), 

265 ], 

266 'root': [ 

267 include('common'), 

268 # function calls 

269 (r'CALL\s+(?:BADI|CUSTOMER-FUNCTION|FUNCTION)', 

270 Keyword), 

271 (r'(CALL\s+(?:DIALOG|SCREEN|SUBSCREEN|SELECTION-SCREEN|' 

272 r'TRANSACTION|TRANSFORMATION))\b', 

273 Keyword), 

274 (r'(FORM|PERFORM)(\s+)(\w+)', 

275 bygroups(Keyword, Whitespace, Name.Function)), 

276 (r'(PERFORM)(\s+)(\()(\w+)(\))', 

277 bygroups(Keyword, Whitespace, Punctuation, Name.Variable, Punctuation)), 

278 (r'(MODULE)(\s+)(\S+)(\s+)(INPUT|OUTPUT)', 

279 bygroups(Keyword, Whitespace, Name.Function, Whitespace, Keyword)), 

280 

281 # method implementation 

282 (r'(METHOD)(\s+)([\w~]+)', 

283 bygroups(Keyword, Whitespace, Name.Function)), 

284 # method calls 

285 (r'(\s+)([\w\-]+)([=\-]>)([\w\-~]+)', 

286 bygroups(Whitespace, Name.Variable, Operator, Name.Function)), 

287 # call methodnames returning style 

288 (r'(?<=(=|-)>)([\w\-~]+)(?=\()', Name.Function), 

289 

290 # text elements 

291 (r'(TEXT)(-)(\d{3})', 

292 bygroups(Keyword, Punctuation, Number.Integer)), 

293 (r'(TEXT)(-)(\w{3})', 

294 bygroups(Keyword, Punctuation, Name.Variable)), 

295 

296 # keywords with dashes in them. 

297 # these need to be first, because for instance the -ID part 

298 # of MESSAGE-ID wouldn't get highlighted if MESSAGE was 

299 # first in the list of keywords. 

300 (r'(ADD-CORRESPONDING|AUTHORITY-CHECK|' 

301 r'CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|' 

302 r'DELETE-ADJACENT|DIVIDE-CORRESPONDING|' 

303 r'EDITOR-CALL|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|EXIT-COMMAND|' 

304 r'FIELD-GROUPS|FIELD-SYMBOLS|FIELD-SYMBOL|FUNCTION-POOL|' 

305 r'INTERFACE-POOL|INVERTED-DATE|' 

306 r'LOAD-OF-PROGRAM|LOG-POINT|' 

307 r'MESSAGE-ID|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|' 

308 r'NEW-LINE|NEW-PAGE|NEW-SECTION|NO-EXTENSION|' 

309 r'OUTPUT-LENGTH|PRINT-CONTROL|' 

310 r'SELECT-OPTIONS|START-OF-SELECTION|SUBTRACT-CORRESPONDING|' 

311 r'SYNTAX-CHECK|SYSTEM-EXCEPTIONS|' 

312 r'TYPE-POOL|TYPE-POOLS|NO-DISPLAY' 

313 r')\b', Keyword), 

314 

315 # keyword kombinations 

316 (r'(?<![-\>])(CREATE\s+(PUBLIC|PRIVATE|DATA|OBJECT)|' 

317 r'(PUBLIC|PRIVATE|PROTECTED)\s+SECTION|' 

318 r'(TYPE|LIKE)\s+((LINE\s+OF|REF\s+TO|' 

319 r'(SORTED|STANDARD|HASHED)\s+TABLE\s+OF))?|' 

320 r'FROM\s+(DATABASE|MEMORY)|CALL\s+METHOD|' 

321 r'(GROUP|ORDER) BY|HAVING|SEPARATED BY|' 

322 r'GET\s+(BADI|BIT|CURSOR|DATASET|LOCALE|PARAMETER|' 

323 r'PF-STATUS|(PROPERTY|REFERENCE)\s+OF|' 

324 r'RUN\s+TIME|TIME\s+(STAMP)?)?|' 

325 r'SET\s+(BIT|BLANK\s+LINES|COUNTRY|CURSOR|DATASET|EXTENDED\s+CHECK|' 

326 r'HANDLER|HOLD\s+DATA|LANGUAGE|LEFT\s+SCROLL-BOUNDARY|' 

327 r'LOCALE|MARGIN|PARAMETER|PF-STATUS|PROPERTY\s+OF|' 

328 r'RUN\s+TIME\s+(ANALYZER|CLOCK\s+RESOLUTION)|SCREEN|' 

329 r'TITLEBAR|UPADTE\s+TASK\s+LOCAL|USER-COMMAND)|' 

330 r'CONVERT\s+((INVERTED-)?DATE|TIME|TIME\s+STAMP|TEXT)|' 

331 r'(CLOSE|OPEN)\s+(DATASET|CURSOR)|' 

332 r'(TO|FROM)\s+(DATA BUFFER|INTERNAL TABLE|MEMORY ID|' 

333 r'DATABASE|SHARED\s+(MEMORY|BUFFER))|' 

334 r'DESCRIBE\s+(DISTANCE\s+BETWEEN|FIELD|LIST|TABLE)|' 

335 r'FREE\s(MEMORY|OBJECT)?|' 

336 r'PROCESS\s+(BEFORE\s+OUTPUT|AFTER\s+INPUT|' 

337 r'ON\s+(VALUE-REQUEST|HELP-REQUEST))|' 

338 r'AT\s+(LINE-SELECTION|USER-COMMAND|END\s+OF|NEW)|' 

339 r'AT\s+SELECTION-SCREEN(\s+(ON(\s+(BLOCK|(HELP|VALUE)-REQUEST\s+FOR|' 

340 r'END\s+OF|RADIOBUTTON\s+GROUP))?|OUTPUT))?|' 

341 r'SELECTION-SCREEN:?\s+((BEGIN|END)\s+OF\s+((TABBED\s+)?BLOCK|LINE|' 

342 r'SCREEN)|COMMENT|FUNCTION\s+KEY|' 

343 r'INCLUDE\s+BLOCKS|POSITION|PUSHBUTTON|' 

344 r'SKIP|ULINE)|' 

345 r'LEAVE\s+(LIST-PROCESSING|PROGRAM|SCREEN|' 

346 r'TO LIST-PROCESSING|TO TRANSACTION)' 

347 r'(ENDING|STARTING)\s+AT|' 

348 r'FORMAT\s+(COLOR|INTENSIFIED|INVERSE|HOTSPOT|INPUT|FRAMES|RESET)|' 

349 r'AS\s+(CHECKBOX|SUBSCREEN|WINDOW)|' 

350 r'WITH\s+(((NON-)?UNIQUE)?\s+KEY|FRAME)|' 

351 r'(BEGIN|END)\s+OF|' 

352 r'DELETE(\s+ADJACENT\s+DUPLICATES\sFROM)?|' 

353 r'COMPARING(\s+ALL\s+FIELDS)?|' 

354 r'(INSERT|APPEND)(\s+INITIAL\s+LINE\s+(IN)?TO|\s+LINES\s+OF)?|' 

355 r'IN\s+((BYTE|CHARACTER)\s+MODE|PROGRAM)|' 

356 r'END-OF-(DEFINITION|PAGE|SELECTION)|' 

357 r'WITH\s+FRAME(\s+TITLE)|' 

358 r'(REPLACE|FIND)\s+((FIRST|ALL)\s+OCCURRENCES?\s+OF\s+)?(SUBSTRING|REGEX)?|' 

359 r'MATCH\s+(LENGTH|COUNT|LINE|OFFSET)|' 

360 r'(RESPECTING|IGNORING)\s+CASE|' 

361 r'IN\s+UPDATE\s+TASK|' 

362 r'(SOURCE|RESULT)\s+(XML)?|' 

363 r'REFERENCE\s+INTO|' 

364 

365 # simple kombinations 

366 r'AND\s+(MARK|RETURN)|CLIENT\s+SPECIFIED|CORRESPONDING\s+FIELDS\s+OF|' 

367 r'IF\s+FOUND|FOR\s+EVENT|INHERITING\s+FROM|LEAVE\s+TO\s+SCREEN|' 

368 r'LOOP\s+AT\s+(SCREEN)?|LOWER\s+CASE|MATCHCODE\s+OBJECT|MODIF\s+ID|' 

369 r'MODIFY\s+SCREEN|NESTING\s+LEVEL|NO\s+INTERVALS|OF\s+STRUCTURE|' 

370 r'RADIOBUTTON\s+GROUP|RANGE\s+OF|REF\s+TO|SUPPRESS DIALOG|' 

371 r'TABLE\s+OF|UPPER\s+CASE|TRANSPORTING\s+NO\s+FIELDS|' 

372 r'VALUE\s+CHECK|VISIBLE\s+LENGTH|HEADER\s+LINE|COMMON\s+PART)\b', Keyword), 

373 

374 # single word keywords. 

375 (r'(^|(?<=(\s|\.)))(ABBREVIATED|ABSTRACT|ADD|ALIASES|ALIGN|ALPHA|' 

376 r'ASSERT|AS|ASSIGN(ING)?|AT(\s+FIRST)?|' 

377 r'BACK|BLOCK|BREAK-POINT|' 

378 r'CASE|CAST|CATCH|CHANGING|CHECK|CLASS|CLEAR|COLLECT|COLOR|COMMIT|COND|CONV|' 

379 r'CREATE|COMMUNICATION|COMPONENTS?|COMPUTE|CONCATENATE|CONDENSE|' 

380 r'CONSTANTS|CONTEXTS|CONTINUE|CONTROLS|COUNTRY|CURRENCY|' 

381 r'DATA|DATE|DECIMALS|DEFAULT|DEFINE|DEFINITION|DEFERRED|DEMAND|' 

382 r'DETAIL|DIRECTORY|DIVIDE|DO|DUMMY|' 

383 r'ELSE(IF)?|ENDAT|ENDCASE|ENDCATCH|ENDCLASS|ENDDO|ENDFORM|ENDFUNCTION|' 

384 r'ENDIF|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDSELECT|ENDTRY|ENDWHILE|' 

385 r'ENHANCEMENT|EVENTS|EXACT|EXCEPTIONS?|EXIT|EXPONENT|EXPORT|EXPORTING|EXTRACT|' 

386 r'FETCH|FIELDS?|FOR|FORM|FORMAT|FREE|FROM|FUNCTION|' 

387 r'HIDE|' 

388 r'ID|IF|IMPORT|IMPLEMENTATION|IMPORTING|IN|INCLUDE|INCLUDING|' 

389 r'INDEX|INFOTYPES|INITIALIZATION|INTERFACE|INTERFACES|INTO|' 

390 r'LANGUAGE|LEAVE|LENGTH|LINES|LOAD|LOCAL|' 

391 r'JOIN|' 

392 r'KEY|' 

393 r'NEW|NEXT|' 

394 r'MAXIMUM|MESSAGE|METHOD[S]?|MINIMUM|MODULE|MODIFIER|MODIFY|MOVE|MULTIPLY|' 

395 r'NODES|NUMBER|' 

396 r'OBLIGATORY|OBJECT|OF|OFF|ON|OTHERS|OVERLAY|' 

397 r'PACK|PAD|PARAMETERS|PERCENTAGE|POSITION|PROGRAM|PROVIDE|PUBLIC|PUT|PF\d\d|' 

398 r'RAISE|RAISING|RANGES?|READ|RECEIVE|REDEFINITION|REFRESH|REJECT|REPORT|RESERVE|' 

399 r'REF|RESUME|RETRY|RETURN|RETURNING|RIGHT|ROLLBACK|REPLACE|' 

400 r'SCROLL|SEARCH|SELECT|SHIFT|SIGN|SINGLE|SIZE|SKIP|SORT|SPLIT|STATICS|STOP|' 

401 r'STYLE|SUBMATCHES|SUBMIT|SUBTRACT|SUM(?!\()|SUMMARY|SUMMING|SUPPLY|SWITCH|' 

402 r'TABLE|TABLES|TIMESTAMP|TIMES?|TIMEZONE|TITLE|\??TO|' 

403 r'TOP-OF-PAGE|TRANSFER|TRANSLATE|TRY|TYPES|' 

404 r'ULINE|UNDER|UNPACK|UPDATE|USING|' 

405 r'VALUE|VALUES|VIA|VARYING|VARY|' 

406 r'WAIT|WHEN|WHERE|WIDTH|WHILE|WITH|WINDOW|WRITE|XSD|ZERO)\b', Keyword), 

407 

408 # builtins 

409 (r'(abs|acos|asin|atan|' 

410 r'boolc|boolx|bit_set|' 

411 r'char_off|charlen|ceil|cmax|cmin|condense|contains|' 

412 r'contains_any_of|contains_any_not_of|concat_lines_of|cos|cosh|' 

413 r'count|count_any_of|count_any_not_of|' 

414 r'dbmaxlen|distance|' 

415 r'escape|exp|' 

416 r'find|find_end|find_any_of|find_any_not_of|floor|frac|from_mixed|' 

417 r'insert|' 

418 r'lines|log|log10|' 

419 r'match|matches|' 

420 r'nmax|nmin|numofchar|' 

421 r'repeat|replace|rescale|reverse|round|' 

422 r'segment|shift_left|shift_right|sign|sin|sinh|sqrt|strlen|' 

423 r'substring|substring_after|substring_from|substring_before|substring_to|' 

424 r'tan|tanh|to_upper|to_lower|to_mixed|translate|trunc|' 

425 r'xstrlen)(\()\b', bygroups(Name.Builtin, Punctuation)), 

426 

427 (r'&[0-9]', Name), 

428 (r'[0-9]+', Number.Integer), 

429 

430 # operators which look like variable names before 

431 # parsing variable names. 

432 (r'(?<=(\s|.))(AND|OR|EQ|NE|GT|LT|GE|LE|CO|CN|CA|NA|CS|NOT|NS|CP|NP|' 

433 r'BYTE-CO|BYTE-CN|BYTE-CA|BYTE-NA|BYTE-CS|BYTE-NS|' 

434 r'IS\s+(NOT\s+)?(INITIAL|ASSIGNED|REQUESTED|BOUND))\b', Operator.Word), 

435 

436 include('variable-names'), 

437 

438 # standard operators after variable names, 

439 # because < and > are part of field symbols. 

440 (r'[?*<>=\-+&]', Operator), 

441 (r"'(''|[^'])*'", String.Single), 

442 (r"`([^`])*`", String.Single), 

443 (r"([|}])([^{}|]*?)([|{])", 

444 bygroups(Punctuation, String.Single, Punctuation)), 

445 (r'[/;:()\[\],.]', Punctuation), 

446 (r'(!)(\w+)', bygroups(Operator, Name)), 

447 ], 

448 } 

449 

450 

451class OpenEdgeLexer(RegexLexer): 

452 """ 

453 Lexer for OpenEdge ABL (formerly Progress) source code. 

454 """ 

455 name = 'OpenEdge ABL' 

456 aliases = ['openedge', 'abl', 'progress'] 

457 filenames = ['*.p', '*.cls'] 

458 mimetypes = ['text/x-openedge', 'application/x-openedge'] 

459 url = 'https://www.progress.com/openedge/features/abl' 

460 version_added = '1.5' 

461 

462 types = (r'(?i)(^|(?<=[^\w\-]))(CHARACTER|CHAR|CHARA|CHARAC|CHARACT|CHARACTE|' 

463 r'COM-HANDLE|DATE|DATETIME|DATETIME-TZ|' 

464 r'DECIMAL|DEC|DECI|DECIM|DECIMA|HANDLE|' 

465 r'INT64|INTEGER|INT|INTE|INTEG|INTEGE|' 

466 r'LOGICAL|LONGCHAR|MEMPTR|RAW|RECID|ROWID)\s*($|(?=[^\w\-]))') 

467 

468 keywords = words(OPENEDGEKEYWORDS, 

469 prefix=r'(?i)(^|(?<=[^\w\-]))', 

470 suffix=r'\s*($|(?=[^\w\-]))') 

471 

472 tokens = { 

473 'root': [ 

474 (r'/\*', Comment.Multiline, 'comment'), 

475 (r'\{', Comment.Preproc, 'preprocessor'), 

476 (r'\s*&.*', Comment.Preproc), 

477 (r'0[xX][0-9a-fA-F]+[LlUu]*', Number.Hex), 

478 (r'(?i)(DEFINE|DEF|DEFI|DEFIN)\b', Keyword.Declaration), 

479 (types, Keyword.Type), 

480 (keywords, Name.Builtin), 

481 (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double), 

482 (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single), 

483 (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), 

484 (r'[0-9]+', Number.Integer), 

485 (r'\s+', Whitespace), 

486 (r'[+*/=-]', Operator), 

487 (r'[.:()]', Punctuation), 

488 (r'.', Name.Variable), # Lazy catch-all 

489 ], 

490 'comment': [ 

491 (r'[^*/]', Comment.Multiline), 

492 (r'/\*', Comment.Multiline, '#push'), 

493 (r'\*/', Comment.Multiline, '#pop'), 

494 (r'[*/]', Comment.Multiline) 

495 ], 

496 'preprocessor': [ 

497 (r'[^{}]', Comment.Preproc), 

498 (r'\{', Comment.Preproc, '#push'), 

499 (r'\}', Comment.Preproc, '#pop'), 

500 ], 

501 } 

502 

503 def analyse_text(text): 

504 """Try to identify OpenEdge ABL based on a few common constructs.""" 

505 result = 0 

506 

507 if 'END.' in text: 

508 result += 0.05 

509 

510 if 'END PROCEDURE.' in text: 

511 result += 0.05 

512 

513 if 'ELSE DO:' in text: 

514 result += 0.05 

515 

516 return result 

517 

518 

519class GoodDataCLLexer(RegexLexer): 

520 """ 

521 Lexer for GoodData-CL script files. 

522 """ 

523 

524 name = 'GoodData-CL' 

525 aliases = ['gooddata-cl'] 

526 filenames = ['*.gdc'] 

527 mimetypes = ['text/x-gooddata-cl'] 

528 url = 'https://github.com/gooddata/GoodData-CL' 

529 version_added = '1.4' 

530 

531 flags = re.IGNORECASE 

532 

533 # Syntax: 

534 # https://github.com/gooddata/GoodData-CL/raw/master/cli/src/main/resources/com/gooddata/processor/COMMANDS.txt 

535 tokens = { 

536 'root': [ 

537 # Comments 

538 (r'#.*', Comment.Single), 

539 # Function call 

540 (r'[a-z]\w*', Name.Function), 

541 # Argument list 

542 (r'\(', Punctuation, 'args-list'), 

543 # Punctuation 

544 (r';', Punctuation), 

545 # Space is not significant 

546 (r'\s+', Text) 

547 ], 

548 'args-list': [ 

549 (r'\)', Punctuation, '#pop'), 

550 (r',', Punctuation), 

551 (r'[a-z]\w*', Name.Variable), 

552 (r'=', Operator), 

553 (r'"', String, 'string-literal'), 

554 (r'[0-9]+(?:\.[0-9]+)?(?:e[+-]?[0-9]{1,3})?', Number), 

555 # Space is not significant 

556 (r'\s', Whitespace) 

557 ], 

558 'string-literal': [ 

559 (r'\\[tnrfbae"\\]', String.Escape), 

560 (r'"', String, '#pop'), 

561 (r'[^\\"]+', String) 

562 ] 

563 } 

564 

565 

566class MaqlLexer(RegexLexer): 

567 """ 

568 Lexer for GoodData MAQL scripts. 

569 """ 

570 

571 name = 'MAQL' 

572 aliases = ['maql'] 

573 filenames = ['*.maql'] 

574 mimetypes = ['text/x-gooddata-maql', 'application/x-gooddata-maql'] 

575 url = 'https://help.gooddata.com/doc/enterprise/en/dashboards-and-insights/maql-analytical-query-language' 

576 version_added = '1.4' 

577 

578 flags = re.IGNORECASE 

579 tokens = { 

580 'root': [ 

581 # IDENTITY 

582 (r'IDENTIFIER\b', Name.Builtin), 

583 # IDENTIFIER 

584 (r'\{[^}]+\}', Name.Variable), 

585 # NUMBER 

586 (r'[0-9]+(?:\.[0-9]+)?(?:e[+-]?[0-9]{1,3})?', Number), 

587 # STRING 

588 (r'"', String, 'string-literal'), 

589 # RELATION 

590 (r'\<\>|\!\=', Operator), 

591 (r'\=|\>\=|\>|\<\=|\<', Operator), 

592 # := 

593 (r'\:\=', Operator), 

594 # OBJECT 

595 (r'\[[^]]+\]', Name.Variable.Class), 

596 # keywords 

597 (words(( 

598 'DIMENSION', 'DIMENSIONS', 'BOTTOM', 'METRIC', 'COUNT', 'OTHER', 

599 'FACT', 'WITH', 'TOP', 'OR', 'ATTRIBUTE', 'CREATE', 'PARENT', 

600 'FALSE', 'ROW', 'ROWS', 'FROM', 'ALL', 'AS', 'PF', 'COLUMN', 

601 'COLUMNS', 'DEFINE', 'REPORT', 'LIMIT', 'TABLE', 'LIKE', 'AND', 

602 'BY', 'BETWEEN', 'EXCEPT', 'SELECT', 'MATCH', 'WHERE', 'TRUE', 

603 'FOR', 'IN', 'WITHOUT', 'FILTER', 'ALIAS', 'WHEN', 'NOT', 'ON', 

604 'KEYS', 'KEY', 'FULLSET', 'PRIMARY', 'LABELS', 'LABEL', 

605 'VISUAL', 'TITLE', 'DESCRIPTION', 'FOLDER', 'ALTER', 'DROP', 

606 'ADD', 'DATASET', 'DATATYPE', 'INT', 'BIGINT', 'DOUBLE', 'DATE', 

607 'VARCHAR', 'DECIMAL', 'SYNCHRONIZE', 'TYPE', 'DEFAULT', 'ORDER', 

608 'ASC', 'DESC', 'HYPERLINK', 'INCLUDE', 'TEMPLATE', 'MODIFY'), 

609 suffix=r'\b'), 

610 Keyword), 

611 # FUNCNAME 

612 (r'[a-z]\w*\b', Name.Function), 

613 # Comments 

614 (r'#.*', Comment.Single), 

615 # Punctuation 

616 (r'[,;()]', Punctuation), 

617 # Space is not significant 

618 (r'\s+', Whitespace) 

619 ], 

620 'string-literal': [ 

621 (r'\\[tnrfbae"\\]', String.Escape), 

622 (r'"', String, '#pop'), 

623 (r'[^\\"]+', String) 

624 ], 

625 }