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