Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ABAP lexer #281

Merged
merged 1 commit into from
Sep 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ translators for Pygments lexers and styles.

Prefix | Language
:----: | --------
A | ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk
A | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk
B | Ballerina, Base Makefile, Bash, Batchfile, BlitzBasic, BNF, Brainfuck
C | C, C#, C++, Cap'n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Crystal, CSS, Cython
D | D, Dart, Diff, Django/Jinja, Docker, DTD
Expand Down
56 changes: 56 additions & 0 deletions lexers/a/abap.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package a

import (
. "github.com/alecthomas/chroma" // nolint
"github.com/alecthomas/chroma/lexers/internal"
)

// ABAP lexer.
var Abap = internal.Register(MustNewLexer(
&Config{
Name: "ABAP",
Aliases: []string{"abap"},
Filenames: []string{"*.abap", "*.ABAP"},
MimeTypes: []string{"text/x-abap"},
CaseInsensitive: true,
},
Rules{
"common": {
{`\s+`, Text, nil},
{`^\*.*$`, CommentSingle, nil},
{`\".*?\n`, CommentSingle, nil},
{`##\w+`, CommentSpecial, nil},
},
"variable-names": {
{`<\S+>`, NameVariable, nil},
{`\w[\w~]*(?:(\[\])|->\*)?`, NameVariable, nil},
},
"root": {
Include("common"),
{`CALL\s+(?:BADI|CUSTOMER-FUNCTION|FUNCTION)`, Keyword, nil},
{`(CALL\s+(?:DIALOG|SCREEN|SUBSCREEN|SELECTION-SCREEN|TRANSACTION|TRANSFORMATION))\b`, Keyword, nil},
{`(FORM|PERFORM)(\s+)(\w+)`, ByGroups(Keyword, Text, NameFunction), nil},
{`(PERFORM)(\s+)(\()(\w+)(\))`, ByGroups(Keyword, Text, Punctuation, NameVariable, Punctuation), nil},
{`(MODULE)(\s+)(\S+)(\s+)(INPUT|OUTPUT)`, ByGroups(Keyword, Text, NameFunction, Text, Keyword), nil},
{`(METHOD)(\s+)([\w~]+)`, ByGroups(Keyword, Text, NameFunction), nil},
{`(\s+)([\w\-]+)([=\-]>)([\w\-~]+)`, ByGroups(Text, NameVariable, Operator, NameFunction), nil},
{`(?<=(=|-)>)([\w\-~]+)(?=\()`, NameFunction, nil},
{`(TEXT)(-)(\d{3})`, ByGroups(Keyword, Punctuation, LiteralNumberInteger), nil},
{`(TEXT)(-)(\w{3})`, ByGroups(Keyword, Punctuation, NameVariable), nil},
{`(ADD-CORRESPONDING|AUTHORITY-CHECK|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|DELETE-ADJACENT|DIVIDE-CORRESPONDING|EDITOR-CALL|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|EXIT-COMMAND|FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|INTERFACE-POOL|INVERTED-DATE|LOAD-OF-PROGRAM|LOG-POINT|MESSAGE-ID|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|NEW-LINE|NEW-PAGE|NEW-SECTION|NO-EXTENSION|OUTPUT-LENGTH|PRINT-CONTROL|SELECT-OPTIONS|START-OF-SELECTION|SUBTRACT-CORRESPONDING|SYNTAX-CHECK|SYSTEM-EXCEPTIONS|TYPE-POOL|TYPE-POOLS|NO-DISPLAY)\b`, Keyword, nil},
{`(?<![-\>])(CREATE\s+(PUBLIC|PRIVATE|DATA|OBJECT)|(PUBLIC|PRIVATE|PROTECTED)\s+SECTION|(TYPE|LIKE)\s+((LINE\s+OF|REF\s+TO|(SORTED|STANDARD|HASHED)\s+TABLE\s+OF))?|FROM\s+(DATABASE|MEMORY)|CALL\s+METHOD|(GROUP|ORDER) BY|HAVING|SEPARATED BY|GET\s+(BADI|BIT|CURSOR|DATASET|LOCALE|PARAMETER|PF-STATUS|(PROPERTY|REFERENCE)\s+OF|RUN\s+TIME|TIME\s+(STAMP)?)?|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)|CONVERT\s+((INVERTED-)?DATE|TIME|TIME\s+STAMP|TEXT)|(CLOSE|OPEN)\s+(DATASET|CURSOR)|(TO|FROM)\s+(DATA BUFFER|INTERNAL TABLE|MEMORY ID|DATABASE|SHARED\s+(MEMORY|BUFFER))|DESCRIBE\s+(DISTANCE\s+BETWEEN|FIELD|LIST|TABLE)|FREE\s(MEMORY|OBJECT)?|PROCESS\s+(BEFORE\s+OUTPUT|AFTER\s+INPUT|ON\s+(VALUE-REQUEST|HELP-REQUEST))|AT\s+(LINE-SELECTION|USER-COMMAND|END\s+OF|NEW)|AT\s+SELECTION-SCREEN(\s+(ON(\s+(BLOCK|(HELP|VALUE)-REQUEST\s+FOR|END\s+OF|RADIOBUTTON\s+GROUP))?|OUTPUT))?|SELECTION-SCREEN:?\s+((BEGIN|END)\s+OF\s+((TABBED\s+)?BLOCK|LINE|SCREEN)|COMMENT|FUNCTION\s+KEY|INCLUDE\s+BLOCKS|POSITION|PUSHBUTTON|SKIP|ULINE)|LEAVE\s+(LIST-PROCESSING|PROGRAM|SCREEN|TO LIST-PROCESSING|TO TRANSACTION)(ENDING|STARTING)\s+AT|FORMAT\s+(COLOR|INTENSIFIED|INVERSE|HOTSPOT|INPUT|FRAMES|RESET)|AS\s+(CHECKBOX|SUBSCREEN|WINDOW)|WITH\s+(((NON-)?UNIQUE)?\s+KEY|FRAME)|(BEGIN|END)\s+OF|DELETE(\s+ADJACENT\s+DUPLICATES\sFROM)?|COMPARING(\s+ALL\s+FIELDS)?|(INSERT|APPEND)(\s+INITIAL\s+LINE\s+(IN)?TO|\s+LINES\s+OF)?|IN\s+((BYTE|CHARACTER)\s+MODE|PROGRAM)|END-OF-(DEFINITION|PAGE|SELECTION)|WITH\s+FRAME(\s+TITLE)|(REPLACE|FIND)\s+((FIRST|ALL)\s+OCCURRENCES?\s+OF\s+)?(SUBSTRING|REGEX)?|MATCH\s+(LENGTH|COUNT|LINE|OFFSET)|(RESPECTING|IGNORING)\s+CASE|IN\s+UPDATE\s+TASK|(SOURCE|RESULT)\s+(XML)?|REFERENCE\s+INTO|AND\s+(MARK|RETURN)|CLIENT\s+SPECIFIED|CORRESPONDING\s+FIELDS\s+OF|IF\s+FOUND|FOR\s+EVENT|INHERITING\s+FROM|LEAVE\s+TO\s+SCREEN|LOOP\s+AT\s+(SCREEN)?|LOWER\s+CASE|MATCHCODE\s+OBJECT|MODIF\s+ID|MODIFY\s+SCREEN|NESTING\s+LEVEL|NO\s+INTERVALS|OF\s+STRUCTURE|RADIOBUTTON\s+GROUP|RANGE\s+OF|REF\s+TO|SUPPRESS DIALOG|TABLE\s+OF|UPPER\s+CASE|TRANSPORTING\s+NO\s+FIELDS|VALUE\s+CHECK|VISIBLE\s+LENGTH|HEADER\s+LINE|COMMON\s+PART)\b`, Keyword, nil},
{`(^|(?<=(\s|\.)))(ABBREVIATED|ABSTRACT|ADD|ALIASES|ALIGN|ALPHA|ASSERT|AS|ASSIGN(ING)?|AT(\s+FIRST)?|BACK|BLOCK|BREAK-POINT|CASE|CATCH|CHANGING|CHECK|CLASS|CLEAR|COLLECT|COLOR|COMMIT|CREATE|COMMUNICATION|COMPONENTS?|COMPUTE|CONCATENATE|CONDENSE|CONSTANTS|CONTEXTS|CONTINUE|CONTROLS|COUNTRY|CURRENCY|DATA|DATE|DECIMALS|DEFAULT|DEFINE|DEFINITION|DEFERRED|DEMAND|DETAIL|DIRECTORY|DIVIDE|DO|DUMMY|ELSE(IF)?|ENDAT|ENDCASE|ENDCATCH|ENDCLASS|ENDDO|ENDFORM|ENDFUNCTION|ENDIF|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDSELECT|ENDTRY|ENDWHILE|ENHANCEMENT|EVENTS|EXACT|EXCEPTIONS?|EXIT|EXPONENT|EXPORT|EXPORTING|EXTRACT|FETCH|FIELDS?|FOR|FORM|FORMAT|FREE|FROM|FUNCTION|HIDE|ID|IF|IMPORT|IMPLEMENTATION|IMPORTING|IN|INCLUDE|INCLUDING|INDEX|INFOTYPES|INITIALIZATION|INTERFACE|INTERFACES|INTO|LANGUAGE|LEAVE|LENGTH|LINES|LOAD|LOCAL|JOIN|KEY|NEXT|MAXIMUM|MESSAGE|METHOD[S]?|MINIMUM|MODULE|MODIFIER|MODIFY|MOVE|MULTIPLY|NODES|NUMBER|OBLIGATORY|OBJECT|OF|OFF|ON|OTHERS|OVERLAY|PACK|PAD|PARAMETERS|PERCENTAGE|POSITION|PROGRAM|PROVIDE|PUBLIC|PUT|PF\d\d|RAISE|RAISING|RANGES?|READ|RECEIVE|REDEFINITION|REFRESH|REJECT|REPORT|RESERVE|RESUME|RETRY|RETURN|RETURNING|RIGHT|ROLLBACK|REPLACE|SCROLL|SEARCH|SELECT|SHIFT|SIGN|SINGLE|SIZE|SKIP|SORT|SPLIT|STATICS|STOP|STYLE|SUBMATCHES|SUBMIT|SUBTRACT|SUM(?!\()|SUMMARY|SUMMING|SUPPLY|TABLE|TABLES|TIMESTAMP|TIMES?|TIMEZONE|TITLE|\??TO|TOP-OF-PAGE|TRANSFER|TRANSLATE|TRY|TYPES|ULINE|UNDER|UNPACK|UPDATE|USING|VALUE|VALUES|VIA|VARYING|VARY|WAIT|WHEN|WHERE|WIDTH|WHILE|WITH|WINDOW|WRITE|XSD|ZERO)\b`, Keyword, nil},
{`(abs|acos|asin|atan|boolc|boolx|bit_set|char_off|charlen|ceil|cmax|cmin|condense|contains|contains_any_of|contains_any_not_of|concat_lines_of|cos|cosh|count|count_any_of|count_any_not_of|dbmaxlen|distance|escape|exp|find|find_end|find_any_of|find_any_not_of|floor|frac|from_mixed|insert|lines|log|log10|match|matches|nmax|nmin|numofchar|repeat|replace|rescale|reverse|round|segment|shift_left|shift_right|sign|sin|sinh|sqrt|strlen|substring|substring_after|substring_from|substring_before|substring_to|tan|tanh|to_upper|to_lower|to_mixed|translate|trunc|xstrlen)(\()\b`, ByGroups(NameBuiltin, Punctuation), nil},
{`&[0-9]`, Name, nil},
{`[0-9]+`, LiteralNumberInteger, nil},
{`(?<=(\s|.))(AND|OR|EQ|NE|GT|LT|GE|LE|CO|CN|CA|NA|CS|NOT|NS|CP|NP|BYTE-CO|BYTE-CN|BYTE-CA|BYTE-NA|BYTE-CS|BYTE-NS|IS\s+(NOT\s+)?(INITIAL|ASSIGNED|REQUESTED|BOUND))\b`, OperatorWord, nil},
Include("variable-names"),
{`[?*<>=\-+&]`, Operator, nil},
{`'(''|[^'])*'`, LiteralStringSingle, nil},
{"`([^`])*`", LiteralStringSingle, nil},
{`([|}])([^{}|]*?)([|{])`, ByGroups(Punctuation, LiteralStringSingle, Punctuation), nil},
{`[/;:()\[\],.]`, Punctuation, nil},
{`(!)(\w+)`, ByGroups(Operator, Name), nil},
},
},
))
62 changes: 62 additions & 0 deletions lexers/testdata/abap.actual
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
*&---------------------------------------------------------------------*
*& Report /WUE/AUFGABE_PRIMZAHL
*&
*&---------------------------------------------------------------------*
*& Anmerkung: um bei einer Zahl entscheiden zu können, ob diese eine Primzahl ist,
*& genügt es die Primzahlen zu prüfen die kleiner gleich der Würzel der Zahl sind
*&
*&---------------------------------------------------------------------*
REPORT /wue/aufgabe_primzahl.


PARAMETERS p_range TYPE i.

"Tabelle in der alle gefundenen Primzahlen gespeichert werden, die kleiner gleich
"der Würzel der eingegebenen Zahl sind
DATA gt_prim_num TYPE TABLE OF i.

"Diese Variable dient dazu, alle Zahlen <= der eingegebenen Zahl und >= 2 aufzustellen
DATA g_number TYPE i VALUE 1.

"Diese Variable dient dazu, zu sagen, ob die aktuelle g_number eine Primzahl ist oder nicht
DATA g_is_prime TYPE abap_bool.

"mit sqrt( zahl1 ) kann die Quadratwurzel der Zahl1 berechnet werden
DATA(g_sqrt_range) = sqrt( p_range ).



"da die zu prüfenden Zahlen bei der 2 beginnend durch Addition von 1 aufgestellt werden
"muss die Schleife lediglich p_range - 1 male durchlaufen werden
DO p_range - 1 TIMES.

"zählt die zu prüfende Zahlen hoch
ADD 1 TO g_number.

"grundsätzlich wird solange, bis es nicht widerlegt ist angenommen, dass g_number eine Primzahl ist
g_is_prime = abap_true.

"Jede Zahl die in der Tabelle gt_prim_num enthalten ist wird geprüft, ob g_number durch diese ohne Rest teilbar ist
LOOP AT gt_prim_num ASSIGNING FIELD-SYMBOL(<g_prim>).

"Durch Zahl1 MOD Zahl2 kann der Rest, der bei Zahl1 / Zahl2 herauskommt ermittelt werden
"Sobald dieser bei g_number / <g_prim> 0 ist, handelt es sich bei g_number um keine Primzahl und somit muss diese nicht
"weiter überprüft werden, folglich kann die Loop-Schleife mit EXIT verlassen werden
IF g_number MOD <g_prim> = 0.
g_is_prime = abap_false.
EXIT.
ENDIF.

ENDLOOP.

"Wenn nicht widerlegt werden konnte, dass g_number eine Primzahl ist, wird diese ausgegeben
IF g_is_prime = abap_true.

"Wenn die neu gefundene Primzahl <= g_sqrt_range, wird diese in die Tabelle gt_prim_num eingefügt (Erklärung siehe Anmerkung)
IF g_number <= g_sqrt_range.
INSERT g_number INTO TABLE gt_prim_num.
ENDIF.
WRITE g_number.
ENDIF.

ENDDO.
208 changes: 208 additions & 0 deletions lexers/testdata/abap.expected
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
[
{"type":"CommentSingle","value":"*\u0026---------------------------------------------------------------------*"},
{"type":"Text","value":"\n"},
{"type":"CommentSingle","value":"*\u0026 Report /WUE/AUFGABE_PRIMZAHL"},
{"type":"Text","value":"\n"},
{"type":"CommentSingle","value":"*\u0026"},
{"type":"Text","value":"\n"},
{"type":"CommentSingle","value":"*\u0026---------------------------------------------------------------------*"},
{"type":"Text","value":"\n"},
{"type":"CommentSingle","value":"*\u0026 Anmerkung: um bei einer Zahl entscheiden zu können, ob diese eine Primzahl ist,"},
{"type":"Text","value":"\n"},
{"type":"CommentSingle","value":"*\u0026 genügt es die Primzahlen zu prüfen die kleiner gleich der Würzel der Zahl sind"},
{"type":"Text","value":"\n"},
{"type":"CommentSingle","value":"*\u0026"},
{"type":"Text","value":"\n"},
{"type":"CommentSingle","value":"*\u0026---------------------------------------------------------------------*"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"REPORT"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"/"},
{"type":"NameVariable","value":"wue"},
{"type":"Punctuation","value":"/"},
{"type":"NameVariable","value":"aufgabe_primzahl"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n\n"},
{"type":"Keyword","value":"PARAMETERS"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"p_range"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"TYPE "},
{"type":"NameVariable","value":"i"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n"},
{"type":"CommentSingle","value":"\"Tabelle in der alle gefundenen Primzahlen gespeichert werden, die kleiner gleich\n\"der Würzel der eingegebenen Zahl sind\n"},
{"type":"Keyword","value":"DATA"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"gt_prim_num"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"TYPE TABLE OF"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"i"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n"},
{"type":"CommentSingle","value":"\"Diese Variable dient dazu, alle Zahlen \u003c= der eingegebenen Zahl und \u003e= 2 aufzustellen\n"},
{"type":"Keyword","value":"DATA"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_number"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"TYPE "},
{"type":"NameVariable","value":"i"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"VALUE"},
{"type":"Text","value":" "},
{"type":"LiteralNumberInteger","value":"1"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n"},
{"type":"CommentSingle","value":"\"Diese Variable dient dazu, zu sagen, ob die aktuelle g_number eine Primzahl ist oder nicht\n"},
{"type":"Keyword","value":"DATA"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_is_prime"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"TYPE "},
{"type":"NameVariable","value":"abap_bool"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n"},
{"type":"CommentSingle","value":"\"mit sqrt( zahl1 ) kann die Quadratwurzel der Zahl1 berechnet werden\n"},
{"type":"Keyword","value":"DATA"},
{"type":"Punctuation","value":"("},
{"type":"NameVariable","value":"g_sqrt_range"},
{"type":"Punctuation","value":")"},
{"type":"Text","value":" "},
{"type":"Operator","value":"="},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"sqrt"},
{"type":"Punctuation","value":"("},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"p_range"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":")."},
{"type":"Text","value":"\n\n\n\n"},
{"type":"CommentSingle","value":"\"da die zu prüfenden Zahlen bei der 2 beginnend durch Addition von 1 aufgestellt werden\n\"muss die Schleife lediglich p_range - 1 male durchlaufen werden\n"},
{"type":"Keyword","value":"DO"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"p_range"},
{"type":"Text","value":" "},
{"type":"Operator","value":"-"},
{"type":"Text","value":" "},
{"type":"LiteralNumberInteger","value":"1"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"TIMES"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n "},
{"type":"CommentSingle","value":"\"zählt die zu prüfende Zahlen hoch\n"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"ADD"},
{"type":"Text","value":" "},
{"type":"LiteralNumberInteger","value":"1"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"TO"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_number"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n "},
{"type":"CommentSingle","value":"\"grundsätzlich wird solange, bis es nicht widerlegt ist angenommen, dass g_number eine Primzahl ist\n"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_is_prime"},
{"type":"Text","value":" "},
{"type":"Operator","value":"="},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"abap_true"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n "},
{"type":"CommentSingle","value":"\"Jede Zahl die in der Tabelle gt_prim_num enthalten ist wird geprüft, ob g_number durch diese ohne Rest teilbar ist\n"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"LOOP AT "},
{"type":"NameVariable","value":"gt_prim_num"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"ASSIGNING"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"FIELD"},
{"type":"Operator","value":"-"},
{"type":"NameVariable","value":"SYMBOL"},
{"type":"Punctuation","value":"("},
{"type":"NameVariable","value":"\u003cg_prim\u003e"},
{"type":"Punctuation","value":")."},
{"type":"Text","value":"\n\n "},
{"type":"CommentSingle","value":"\"Durch Zahl1 MOD Zahl2 kann der Rest, der bei Zahl1 / Zahl2 herauskommt ermittelt werden\n"},
{"type":"Text","value":" "},
{"type":"CommentSingle","value":"\"Sobald dieser bei g_number / \u003cg_prim\u003e 0 ist, handelt es sich bei g_number um keine Primzahl und somit muss diese nicht\n"},
{"type":"Text","value":" "},
{"type":"CommentSingle","value":"\"weiter überprüft werden, folglich kann die Loop-Schleife mit EXIT verlassen werden\n"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"IF"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_number"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"MOD"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"\u003cg_prim\u003e"},
{"type":"Text","value":" "},
{"type":"Operator","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralNumberInteger","value":"0"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n "},
{"type":"NameVariable","value":"g_is_prime"},
{"type":"Text","value":" "},
{"type":"Operator","value":"="},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"abap_false"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n "},
{"type":"Keyword","value":"EXIT"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n "},
{"type":"Keyword","value":"ENDIF"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n "},
{"type":"Keyword","value":"ENDLOOP"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n "},
{"type":"CommentSingle","value":"\"Wenn nicht widerlegt werden konnte, dass g_number eine Primzahl ist, wird diese ausgegeben\n"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"IF"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_is_prime"},
{"type":"Text","value":" "},
{"type":"Operator","value":"="},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"abap_true"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n "},
{"type":"CommentSingle","value":"\"Wenn die neu gefundene Primzahl \u003c= g_sqrt_range, wird diese in die Tabelle gt_prim_num eingefügt (Erklärung siehe Anmerkung)\n"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"IF"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_number"},
{"type":"Text","value":" "},
{"type":"Operator","value":"\u003c="},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_sqrt_range"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n "},
{"type":"Keyword","value":"INSERT"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_number"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"INTO"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"TABLE"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"gt_prim_num"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n "},
{"type":"Keyword","value":"ENDIF"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n "},
{"type":"Keyword","value":"WRITE"},
{"type":"Text","value":" "},
{"type":"NameVariable","value":"g_number"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n "},
{"type":"Keyword","value":"ENDIF"},
{"type":"Punctuation","value":"."},
{"type":"Text","value":"\n\n"},
{"type":"Keyword","value":"ENDDO"},
{"type":"Punctuation","value":"."}
]