| | 30 | class ABAPLexer(RegexLexer): |
| | 31 | """ |
| | 32 | Lexer for ABAP. SAP's integrated Language. |
| | 33 | """ |
| | 34 | name = 'ABAP' |
| | 35 | aliases = ['abap'] |
| | 36 | filenames = ['*.abap'] |
| | 37 | mimetypes = ['text/x-abap'] |
| | 38 | |
| | 39 | flags = re.IGNORECASE | re.MULTILINE |
| | 40 | |
| | 41 | tokens = { |
| | 42 | 'common': [ |
| | 43 | (r'\s+', Text), |
| | 44 | (r'^\*.*$', Comment.Single), |
| | 45 | (r'\".*?\n', Comment.Single), |
| | 46 | ], |
| | 47 | 'variable-names': [ |
| | 48 | (r'<[\S_]+>', Name.Variable), |
| | 49 | (r'[\w][\w_~]*(?:(\[\])|->\*)?', Name.Variable), |
| | 50 | ], |
| | 51 | 'root': [ |
| | 52 | include('common'), |
| | 53 | #function calls |
| | 54 | (r'(CALL\s+(?:BADI|CUSTOMER-FUNCTION|FUNCTION))(\s+)(\'?\S+\'?)', |
| | 55 | bygroups(Keyword, Text, Name.Function)), |
| | 56 | (r'(CALL\s+(?:DIALOG|SCREEN|SUBSCREEN|SELECTION-SCREEN|' |
| | 57 | r'TRANSACTION|TRANSFORMATION))\b', |
| | 58 | Keyword), |
| | 59 | (r'(FORM|PERFORM)(\s+)([\w_]+)', |
| | 60 | bygroups(Keyword, Text, Name.Function)), |
| | 61 | (r'(PERFORM)(\s+)(\()([\w_]+)(\))', |
| | 62 | bygroups(Keyword, Text, Punctuation, Name.Variable, Punctuation )), |
| | 63 | (r'(MODULE)(\s+)(\S+)(\s+)(INPUT|OUTPUT)', |
| | 64 | bygroups(Keyword, Text, Name.Function, Text, Keyword)), |
| | 65 | |
| | 66 | # method implementation |
| | 67 | (r'(METHOD)(\s+)([\w_~]+)', |
| | 68 | bygroups(Keyword, Text, Name.Function)), |
| | 69 | # method calls |
| | 70 | (r'(\s+)([\w_\-]+)([=\-]>)([\w_\-~]+)', |
| | 71 | bygroups(Text, Name.Variable, Operator, Name.Function)), |
| | 72 | # call methodnames returning style |
| | 73 | (r'(?<=(=|-)>)([\w_\-~]+)(?=\()', Name.Function), |
| | 74 | |
| | 75 | # keywords with dashes in them. |
| | 76 | # these need to be first, because for instance the -ID part |
| | 77 | # of MESSAGE-ID wouldn't get highlighted if MESSAGE was |
| | 78 | # first in the list of keywords. |
| | 79 | (r'(ADD-CORRESPONDING|AUTHORITY-CHECK|' |
| | 80 | r'CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|' |
| | 81 | r'DELETE-ADJACENT|DIVIDE-CORRESPONDING|' |
| | 82 | r'EDITOR-CALL|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|EXIT-COMMAND|' |
| | 83 | r'FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|' |
| | 84 | r'INTERFACE-POOL|INVERTED-DATE|' |
| | 85 | r'LOAD-OF-PROGRAM|LOG-POINT|' |
| | 86 | r'MESSAGE-ID|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|' |
| | 87 | r'NEW-LINE|NEW-PAGE|NEW-SECTION|NO-EXTENSION|' |
| | 88 | r'OUTPUT-LENGTH|PRINT-CONTROL|' |
| | 89 | r'SELECT-OPTIONS|START-OF-SELECTION|SUBTRACT-CORRESPONDING|' |
| | 90 | r'SYNTAX-CHECK|SYSTEM-EXCEPTIONS|' |
| | 91 | r'TYPE-POOL|TYPE-POOLS' |
| | 92 | r')\b', Keyword), |
| | 93 | |
| | 94 | # keyword kombinations |
| | 95 | (r'CREATE\s+(PUBLIC|PRIVATE|DATA|OBJECT)|' |
| | 96 | r'((PUBLIC|PRIVATE|PROTECTED)\s+SECTION|' |
| | 97 | r'(TYPE|LIKE)(\s+(LINE\s+OF|REF\s+TO|' |
| | 98 | r'(SORTED|STANDARD|HASHED)\s+TABLE\s+OF))?|' |
| | 99 | r'FROM\s+(DATABASE|MEMORY)|CALL\s+METHOD|' |
| | 100 | r'(GROUP|ORDER) BY|HAVING|SEPARATED BY|' |
| | 101 | r'GET\s+(BADI|BIT|CURSOR|DATASET|LOCALE|PARAMETER|' |
| | 102 | r'PF-STATUS|(PROPERTY|REFERENCE)\s+OF|' |
| | 103 | r'RUN\s+TIME|TIME\s+(STAMP)?)?|' |
| | 104 | r'SET\s+(BIT|BLANK\s+LINES|COUNTRY|CURSOR|DATASET|EXTENDED\s+CHECK|' |
| | 105 | r'HANDLER|HOLD\s+DATA|LANGUAGE|LEFT\s+SCROLL-BOUNDARY|' |
| | 106 | r'LOCALE|MARGIN|PARAMETER|PF-STATUS|PROPERTY\s+OF|' |
| | 107 | r'RUN\s+TIME\s+(ANALYZER|CLOCK\s+RESOLUTION)|SCREEN|' |
| | 108 | r'TITLEBAR|UPADTE\s+TASK\s+LOCAL|USER-COMMAND)|' |
| | 109 | r'CONVERT\s+((INVERTED-)?DATE|TIME|TIME\s+STAMP|TEXT)|' |
| | 110 | r'(CLOSE|OPEN)\s+(DATASET|CURSOR)|' |
| | 111 | r'(TO|FROM)\s+(DATA BUFFER|INTERNAL TABLE|MEMORY ID|' |
| | 112 | r'DATABASE|SHARED\s+(MEMORY|BUFFER))|' |
| | 113 | r'DESCRIBE\s+(DISTANCE\s+BETWEEN|FIELD|LIST|TABLE)|' |
| | 114 | r'FREE\s(MEMORY|OBJECT)?|' |
| | 115 | r'PROCESS\s+(BEFORE\s+OUTPUT|AFTER\s+INPUT|' |
| | 116 | r'ON\s+(VALUE-REQUEST|HELP-REQUEST))|' |
| | 117 | r'AT\s+(LINE-SELECTION|USER-COMMAND|END\s+OF|NEW)|' |
| | 118 | r'AT\s+SELECTION-SCREEN(\s+(ON(\s+(BLOCK|(HELP|VALUE)-REQUEST\s+FOR|' |
| | 119 | r'END\s+OF|RADIOBUTTON\s+GROUP))?|OUTPUT))?|' |
| | 120 | r'SELECTION-SCREEN:?\s+((BEGIN|END)\s+OF\s+((TABBED\s+)?BLOCK|LINE|' |
| | 121 | r'SCREEN)|COMMENT|FUNCTION\s+KEY|' |
| | 122 | r'INCLUDE\s+BLOCKS|POSITION|PUSHBUTTON|' |
| | 123 | r'SKIP|ULINE)|' |
| | 124 | r'LEAVE\s+(LIST-PROCESSING|PROGRAM|SCREEN|' |
| | 125 | r'TO LIST-PROCESSING|TO TRANSACTION)' |
| | 126 | r'(ENDING|STARTING)\s+AT|' |
| | 127 | r'FORMAT\s+(COLOR|INTENSIFIED|INVERSE|HOTSPOT|INPUT|FRAMES|RESET)|' |
| | 128 | r'AS\s+(CHECKBOX|SUBSCREEN|WINDOW)|' |
| | 129 | r'WITH\s+(((NON-)?UNIQUE)?\s+KEY|FRAME)|' |
| | 130 | r'(BEGIN|END)\s+OF|' |
| | 131 | r'DELETE(\s+ADJACENT\s+DUPLICATES\sFROM)?|' |
| | 132 | r'COMPARING(\s+ALL\s+FIELDS)?|' |
| | 133 | r'INSERT(\s+INITIAL\s+LINE\s+INTO|\s+LINES\s+OF)?|' |
| | 134 | r'IN\s+((BYTE|CHARACTER)\s+MODE|PROGRAM)|' |
| | 135 | r'END-OF-(DEFINITION|PAGE|SELECTION)|' |
| | 136 | r'WITH\s+FRAME(\s+TITLE)|' |
| | 137 | |
| | 138 | # simple kombinations |
| | 139 | r'AND\s+(MARK|RETURN)|CLIENT\s+SPECIFIED|CORRESPONDING\s+FIELDS\s+OF|' |
| | 140 | r'IF\s+FOUND|FOR\s+EVENT|INHERITING\s+FROM|LEAVE\s+TO\s+SCREEN|' |
| | 141 | r'LOOP\s+AT\s+(SCREEN)?|LOWER\s+CASE|MATCHCODE\s+OBJECT|MODIF\s+ID|' |
| | 142 | r'MODIFY\s+SCREEN|NESTING\s+LEVEL|NO\s+INTERVALS|OF\s+STRUCTURE|' |
| | 143 | r'RADIOBUTTON\s+GROUP|RANGE\s+OF|REF\s+TO|SUPPRESS DIALOG|' |
| | 144 | r'TABLE\s+OF|UPPER\s+CASE|TRANSPORTING\s+NO\s+FIELDS|' |
| | 145 | r'VALUE\s+CHECK|VISIBLE\s+LENGTH|HEADER\s+LINE)\b', Keyword), |
| | 146 | |
| | 147 | # single word keywords. |
| | 148 | (r'(^|(?<=(\s|\.)))(ABBREVIATED|ADD|ALIASES|APPEND|ASSERT|' |
| | 149 | r'ASSIGN(ING)?|AT(\s+FIRST)?|' |
| | 150 | r'BACK|BLOCK|BREAK-POINT|' |
| | 151 | r'CASE|CATCH|CHANGING|CHECK|CLASS|CLEAR|COLLECT|COLOR|COMMIT|' |
| | 152 | r'CREATE|COMMUNICATION|COMPONENTS?|COMPUTE|CONCATENATE|CONDENSE|' |
| | 153 | r'CONSTANTS|CONTEXTS|CONTINUE|CONTROLS|' |
| | 154 | r'DATA|DECIMALS|DEFAULT|DEFINE|DEFINITION|DEFERRED|DEMAND|' |
| | 155 | r'DETAIL|DIRECTORY|DIVIDE|DO|' |
| | 156 | r'ELSE(IF)?|ENDAT|ENDCASE|ENDCLASS|ENDDO|ENDFORM|ENDFUNCTION|' |
| | 157 | r'ENDIF|ENDLOOP|ENDMETHOD|ENDMODULE|ENDSELECT|ENDTRY|' |
| | 158 | r'ENHANCEMENT|EVENTS|EXCEPTIONS|EXIT|EXPORT|EXPORTING|EXTRACT|' |
| | 159 | r'FETCH|FIELDS?|FIND|FOR|FORM|FORMAT|FREE|FROM|' |
| | 160 | r'HIDE|' |
| | 161 | r'ID|IF|IMPORT|IMPLEMENTATION|IMPORTING|IN|INCLUDE|INCLUDING|' |
| | 162 | r'INDEX|INFOTYPES|INITIALIZATION|INTERFACE|INTERFACES|INTO|' |
| | 163 | r'LENGTH|LINES|LOAD|LOCAL|' |
| | 164 | r'JOIN|' |
| | 165 | r'KEY|' |
| | 166 | r'MAXIMUM|MESSAGE|METHOD[S]?|MINIMUM|MODULE|MODIFY|MOVE|MULTIPLY|' |
| | 167 | r'NODES|' |
| | 168 | r'OBLIGATORY|OF|OFF|ON|OVERLAY|' |
| | 169 | r'PACK|PARAMETERS|PERCENTAGE|POSITION|PROGRAM|PROVIDE|PUBLIC|PUT|' |
| | 170 | r'RAISE|RAISING|RANGES|READ|RECEIVE|REFRESH|REJECT|REPORT|RESERVE|' |
| | 171 | r'RESUME|RETRY|RETURN|RETURNING|RIGHT|ROLLBACK|' |
| | 172 | r'SCROLL|SEARCH|SELECT|SHIFT|SINGLE|SKIP|SORT|SPLIT|STATICS|STOP|' |
| | 173 | r'SUBMIT|SUBTRACT|SUM|SUMMARY|SUMMING|SUPPLY|' |
| | 174 | r'TABLE|TABLES|TIMES|TITLE|TO|TOP-OF-PAGE|TRANSFER|TRANSLATE|TRY|TYPES|' |
| | 175 | r'ULINE|UNDER|UNPACK|UPDATE|USING|' |
| | 176 | r'VALUE|VALUES|VIA|' |
| | 177 | r'WAIT|WHEN|WHERE|WHILE|WITH|WINDOW|WRITE)\b', Keyword), |
| | 178 | |
| | 179 | # builtins |
| | 180 | (r'(abs|acos|asin|atan|' |
| | 181 | r'boolc|boolx|bit_set|' |
| | 182 | r'char_off|charlen|ceil|cmax|cmin|condense|contains|' |
| | 183 | r'contains_any_of|contains_any_not_of|concat_lines_of|cos|cosh|' |
| | 184 | r'count|count_any_of|count_any_not_of|' |
| | 185 | r'dbmaxlen|distance|' |
| | 186 | r'escape|exp|' |
| | 187 | r'find|find_end|find_any_of|find_any_not_of|floor|frac|from_mixed|' |
| | 188 | r'insert|' |
| | 189 | r'lines|log|log10|' |
| | 190 | r'match|matches|' |
| | 191 | r'nmax|nmin|numofchar|' |
| | 192 | r'repeat|replace|rescale|reverse|round|' |
| | 193 | r'segment|shift_left|shift_right|sign|sin|sinh|sqrt|strlen|' |
| | 194 | r'substring|substring_after|substring_from|substring_before|substring_to|' |
| | 195 | r'tan|tanh|to_upper|to_lower|to_mixed|translate|trunc|' |
| | 196 | r'xstrlen)(\()\b', bygroups(Name.Builtin, Punctuation)), |
| | 197 | |
| | 198 | (r'&[0-9]', Name), |
| | 199 | (r'[0-9]+', Number.Integer), |
| | 200 | |
| | 201 | # operators which look like variable names before |
| | 202 | # parsing variable names. |
| | 203 | (r'(?<=(\s|.))(AND|EQ|NE|GT|LT|GE|LE|CO|CN|CA|NA|CS|NOT|NS|CP|NP|' |
| | 204 | r'BYTE-CO|BYTE-CN|BYTE-CA|BYTE-NA|BYTE-CS|BYTE-NS|' |
| | 205 | r'IS\s+(NOT\s+)?(INITIAL|ASSIGNED|REQUESTED|BOUND))\b', Operator), |
| | 206 | |
| | 207 | include('variable-names'), |
| | 208 | |
| | 209 | # standard oparators after variable names, |
| | 210 | # because < and > are part of field symbols. |
| | 211 | (r'[?*<>=\-+]', Operator), |
| | 212 | (r"'(''|[^'])*'", String.Single), |
| | 213 | (r'[/;:()\[\],\.]', Punctuation) |
| | 214 | ], |
| | 215 | } |