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

Grammar railroad diagram #1

Open
mingodad opened this issue Jul 1, 2021 · 0 comments
Open

Grammar railroad diagram #1

mingodad opened this issue Jul 1, 2021 · 0 comments

Comments

@mingodad
Copy link

mingodad commented Jul 1, 2021

I've done an extension to CocoR grammars to a kind of EBNF understood by https://www.bottlecaps.de/rr/ui to generate railroad diagrams see bellow the converted xcompiler/cocoR/abap_clean.atg and with some hand made changes to allow view it at https://www.bottlecaps.de/rr/ui the order of the rules could be changed to a better view of the railroad diagrams. Copy and paste the EBNF bellow on https://www.bottlecaps.de/rr/ui tab Edit Grammar then switch to the tab View Diagram.

Your grammar breaks other extensions I did in https://github.com/mingodad/CocoR-CPP and makes it enter a infinite loop trying to print a tree-view of the ambiguities, anyway I manually deactivated the problem and generated the EBNF bellow that I think would help debug/develop this grammar.

I'm interested in your project https://github.com/jackieju/xcompiler but could not see /understand it clearly (it seems tied to ruby only).

//
// EBNF generated by CocoR parser generator to be viewed with https://www.bottlecaps.de/rr/ui
//

//
// productions
//

AllowedKeywordsForTypeName ::= ( "DATA" | "VALUE" | "PARAMETER" | "PARAMETERS" | "TARGET" | "MESSAGE" | "END" | "CREATE" | "KEY" | "ID" | "DEFAULT" | "LENGTH" | "DECIMALS" | "BOXED" | "SUFFIX" | "COMPONENTS" | "EXCEPTIONS" | "KIND" | "DELETE" | "ACTIVATION" | "OF" | "EOF" | "REPORT" | "NO" | "PAGE" | "HEADING" | "DEFINING" | "DATABASE" | "REDUCED" | "FUNCTIONALITY" | "FUNCTION" | "ENDFUNCTION" | "ENDSELECT" | "FIELDS" | "DISTINCT" | "FROM" | "AS" | "USING" | "CLIENT" | "SPECIFIED" | "INNER" | "LEFT" | "RIGHT" | "OUTER" | "CROSS" | "JOIN" | "ON" | "ORDER" | "BY" | "PRIMARY" | "ASCENDING" | "DESCENDING" | "APPENDING" | "CORRESPONDING" | "PACKAGE" | "SIZE" | "SELECT" | "SINGLE" | "FOR" | "UPDATE" | "ENTRIES" | "IN" | "WHERE" | "GROUP" | "HAVING" | "UNION" | "EXTENDED" | "RESULT" | "CREATING" | "READER" | "LOCATOR" | "COLUMNS" | "BLOB" | "CLOB" | "OFFSET" | "UP" | "TO" | "ROWS" | "BYPASSING" | "BUFFER" | "CONNECTION" | "ENDWITH" | "TABLES" | "MOVE" | "EXACT" | "PERCENTAGE" | "EXPANDING" | "NESTED" | "KEEPING" | "APPEND" | "LINE" | "CASTING" | "CONCATENATE" | "CHARACTER" | "BYTE" | "MODE" | "SEPARATED" | "RESPECTING" | "BLANKS" | "SEARCH" | "STARTING" | "AT" | "ENDING" | "ABBREVIATED" | "AND" | "MARK" | "RAISE" | "EVENT" | "RESUMABLE" | "EXCEPTION" | "NUMBER" | "DISPLAY" | "LIKE" | "RAISING" | "INDEX" | "TEXT" | "WITHOUT" | "MEMBERS" | "LOOP" | "VERSION" | "SCREEN" | "ENDLOOP" | "LOB" | "HANDLE" | "EMPTY" | "HEADER" | "UNIQUE" | "PRIMARY_KEY" | "ALIAS" | "STATICS" | "CONSTANTS" | "BEGIN" | "COMMON" | "PART" | "OCCURS" | "VALID" | "BETWEEN" | "IS" | "WRITE" | "UNDER" | "CENTERED" | "EXPONENT" | "CURRENCY" | "ROUND" | "UNIT" | "ENVIRONMENT" | "TIME" | "FORMAT" | "ZONE" | "STYLE" | "MASK" | "DDMMYY" | "MMDDYY" | "YYMMDD" | "CHECKBOX" | "ICON" | "SYMBOL" | "QUICKINFO" | "CONTINUE" | "CASE" | "WHEN" | "OR" | "OTHERS" | "ENDCASE" | "FIELD" | "DUMMY" | "OBJECT" | "USER" | "DATASET" | "ADJACENT" | "DUPLICATES" | "COMPARING" | "MEMORY" | "SHARED" | "VARYING" | "NEXT" | "DO" | "TIMES" | "ENDDO" | "OPTIONAL" | "EVENTS" | "MODIFY" | "CURRENT" | "CHANGE" | "ENDON" | "OPEN" | "CURSOR" | "HOLD" | "INPUT" | "OUTPUT" | "ENCODING" | "SKIPPING" | "NATIVE" | "SMART" | "UNIX" | "WINDOWS" | "LINEFEED" | "LEGACY" | "BIG" | "LITTLE" | "ENDIAN" | "CODE" | "POSITION" | "FILTER" | "IGNORING" | "CONVERSION" | "ERRORS" | "REPLACEMENT" | "FETCH" | "BOUNDS" | "PROVIDE" | "INCLUDING" | "GAPS" | "ENDPROVIDE" | "READ" | "MAXIMUM" | "ACTUAL" | "WIDTH" | "TEXTPOOL" | "LANGUAGE" | "SORT" | "SUBMIT" | "VIA" | "PROGRAM" | "EQ" | "NE" | "CP" | "NP" | "GE" | "LT" | "LE" | "GT" | "NOT" | "FREE" | "SELECTIONS" | "LIST" | "SPOOL" | "ARCHIVE" | "DYNPRO" | "JOB" | "RETURN" | "TRY" | "CATCH" | "BEFORE" | "UNWIND" | "CLEANUP" | "ENDTRY" | "ASSOCIATION" | "TYPES" | "ENUM" | "STRUCTURE" | "BASE" | "MESH" | "SET" | "WHILE" | "VARY" | "ENDWHILE" | "TASK" | "NEW" | "BACKGROUND" | "SEPARATE" | "DESTINATION" | "CALLING" | "PERFORMING" | "IF" | "ELSEIF" | "ELSE" | "ENDIF" | "CLASS" | "DEFINITION" | "DEFERRED" | "PUBLIC" | "PROTECTED" | "PRIVATE" | "INHERITING" | "ABSTRACT" | "FINAL" | "ENABLED" | "TESTING" | "RISK" | "LEVEL" | "CRITICAL" | "DANGEROUS" | "HARMLESS" | "DURATION" | "SHORT" | "MEDIUM" | "LONG" | "GLOBAL" | "FRIENDS" | "LOAD" | "IMPLEMENTATION" | "SECTION" | "ENDCLASS" | "METHOD" | "ENDMETHOD" | "ANY" | "METHODS" | "REDEFINITION" | "IGNORE" | "FAIL" | "PREFERRED" | "ADD" | "THEN" | "UNTIL" | "GIVING" | "ACCORDING" | "ALIASES" | "ASSERT" | "SUBKEY" | "CONDITION" | "ASSIGN" | "COMPONENT" | "INCREMENT" | "FIRST" | "LAST" | "ENDAT" | "BACK" | "CALL" | "DIALOG" | "SKIP" | "PROCEDURE" | "FLUSH" | "TRANSACTION" | "OPTIONS" | "MESSAGES" | "TRANSFORMATION" | "OBJECTS" | "SOURCE" | "XML" | "AREA" | "BADI" | "CLEAR" | "NULL" | "CLOSE" | "COLLECT" | "COMMIT" | "WORK" | "WAIT" | "COMPUTE" | "CONDENSE" | "CONTROLS" | "TABLEVIEW" | "TABSTRIP" | "CONVERT" | "SORTABLE" | "STAMP" | "DAYLIGHT" | "SAVING" | "DEMAND" | "CONTEXT" | "DESCRIBE" | "DISTANCE" | "PAGES" | "DETAIL" | "DIVIDE" | "TITLE" | "BACKUP" | "EXIT" | "SQL" | "EXPORT" | "INTERNAL" | "COMPRESSION" | "OFF" | "EXTRACT" | "FIND" | "OCCURRENCE" | "OCCURRENCES" | "SUBSTRING" | "REGEX" | "MATCH" | "COUNT" | "RESULTS" | "SUBMATCHES" | "COLOR" | "COL_BACKGROUND" | "COL_HEADING" | "COL_NORMAL" | "COL_TOTAL" | "COL_KEY" | "COL_POSITIVE" | "COL_NEGATIVE" | "COL_GROUP" | "INTENSIFIED" | "INVERSE" | "HOTSPOT" | "FRAMES" | "RESET" | "GENERATE" | "SUBROUTINE" | "POOL" | "INCLUDE" | "GET" | "FILTERS" | "BIT" | "ATTRIBUTES" | "LOCALE" | "COUNTRY" | "MODIFIER" | "EXCLUDING" | "PROPERTY" | "RUN" | "HIDE" | "IMPORT" | "ACCEPTING" | "PADDING" | "TRUNCATION" | "BOUNDARIES" | "DIRECTORY" | "RENAMING" | "FOUND" | "INFOTYPES" | "PERSON" | "INITIALIZATION" | "INSERT" | "VALUES" | "DUPLICATE" | "KEYS" | "ENTRY" | "ARITHMETIC" | "UNICODE" | "ENABLING" | "INTERFACE" | "ENDINTERFACE" | "INTERFACES" | "PARTIALLY" | "IMPLEMENTED" | "LEAVE" | "LOCAL" | "MINIMUM" | "MODULE" | "ENDMODULE" | "MULTIPLY" | "SCROLLING" | "PRINT" | "NODES" | "OVERLAY" | "ONLY" | "PACK" | "OBLIGATORY" | "VISIBLE" | "LISTBOX" | "RADIOBUTTON" | "MODIF" | "LOWER" | "MATCHCODE" | "PATTERN" | "PERFORM" | "ROLLBACK" | "RANGES" | "RECEIVE" | "REFRESH" | "CONTROL" | "REJECT" | "REPLACE" | "RESERVE" | "RESUME" | "RETRY" | "SCROLL" | "COLUMN" | "PLACES" | "FORWARD" | "BACKWARD" | "INTERVALS" | "OPTION" | "SELECTION" | "LOW" | "HIGH" | "TAB" | "BLANK" | "FILE" | "HANDLER" | "INSTANCES" | "MARGIN" | "IMMEDIATELY" | "ANALYZER" | "CLOCK" | "RESOLUTION" | "TITLEBAR" | "SHIFT" | "CIRCULAR" | "DELETING" | "LEADING" | "TRAILING" | "STOP" | "SUBTRACT" | "SUM" | "SUMMARY" | "SUMMING" | "SUPPLY" | "SUPPRESS" | "SWITCHSTATES" | "DURING" | "TRANSFER" | "TRANSLATE" | "UPPER" | "TRUNCATE" | "ULINE" | "UNASSIGN" | "UNPACK" | "SECONDS" | "ASYNCHRONOUS" | "TASKS" | "MESSAGING" | "CHANNELS" | "PUSH" | "WINDOW" | "SPLIT" | "DIV" | "MOD" | "EQUIV" | "CO" | "CN" | "CA" | "NA" | "CS" | "NS" | "INSTANCE" | "BOUND" | "ASSIGNED" | "SUPPLIED" | "REQUESTED" ) 
AllowedKeywordsExclude ::= ( "DATA" | "REF" | "VALUE" | "PARAMETER" | "TARGET" | "ID" | "EOF" | "KEY" | "DEFAULT" | "LENGTH" | "DECIMALS" | "BOXED" | "SUFFIX" | "COMPONENTS" | "EXCEPTIONS" | "KIND" | "ACTIVATION" | "SORTED" | "EDIT" | "NODE" | "REPORT" | "NO" | "PAGE" | "HEADING" | "DEFINING" | "DATABASE" | "REDUCED" | "FUNCTIONALITY" | "DISTINCT" | "FROM" | "AS" | "USING" | "CLIENT" | "SPECIFIED" | "INNER" | "LEFT" | "RIGHT" | "OUTER" | "CROSS" | "JOIN" | "ORDER" | "BY" | "PRIMARY" | "ASCENDING" | "DESCENDING" | "APPENDING" | "CORRESPONDING" | "OF" | "PACKAGE" | "SIZE" | "SINGLE" | "FOR" | "ALL" | "ENTRIES" | "IN" | "WHERE" | "GROUP" | "HAVING" | "UNION" | "EXTENDED" | "RESULT" | "CREATING" | "READER" | "LOCATOR" | "COLUMNS" | "OTHER" | "BLOB" | "CLOB" | "OFFSET" | "UP" | "TO" | "ROWS" | "BYPASSING" | "BUFFER" | "CONNECTION" | "ENDWITH" | "EXACT" | "PERCENTAGE" | "EXPANDING" | "NESTED" | "KEEPING" | "INITIAL" | "ASSIGNING" | "CASTING" | "REFERENCE" | "CHARACTER" | "BYTE" | "MODE" | "SEPARATED" | "RESPECTING" | "BLANKS" | "STARTING" | "ENDING" | "ABBREVIATED" | "AND" | "MARK" | "EVENT" | "EXPORTING" | "RESUMABLE" | "EXCEPTION" | "NUMBER" | "DISPLAY" | "LIKE" | "RAISING" | "TEXT" | "WITHOUT" | "MEMBERS" | "TRANSPORTING" | "VERSION" | "SCREEN" | "LOB" | "HANDLE" | "HASHED" | "EMPTY" | "HEADER" | "UNIQUE" | "PRIMARY_KEY" | "ALIAS" | "RANGE" | "STATICS" | "BEGIN" | "COMMON" | "PART" | "OCCURS" | "VALID" | "BETWEEN" | "IS" | "UNDER" | "CENTERED" | "EXPONENT" | "CURRENCY" | "ROUND" | "UNIT" | "ENVIRONMENT" | "TIME" | "ZONE" | "STYLE" | "MASK" | "DDMMYY" | "MMDDYY" | "YYMMDD" | "CHECKBOX" | "ICON" | "SYMBOL" | "QUICKINFO" | "WHEN" | "OR" | "OTHERS" | "FIELD" | "DUMMY" | "OBJECT" | "USER" | "DATASET" | "ADJACENT" | "DUPLICATES" | "COMPARING" | "MEMORY" | "SHARED" | "VARYING" | "NEXT" | "TIMES" | "OPTIONAL" | "CURRENT" | "CHANGE" | "CURSOR" | "HOLD" | "OUTPUT" | "BINARY" | "ENCODING" | "SKIPPING" | "NATIVE" | "SMART" | "UNIX" | "WINDOWS" | "LINEFEED" | "LEGACY" | "BIG" | "LITTLE" | "ENDIAN" | "CODE" | "FILTER" | "IGNORING" | "CONVERSION" | "ERRORS" | "REPLACEMENT" | "BOUNDS" | "INCLUDING" | "GAPS" | "ACTUAL" | "WIDTH" | "TEXTPOOL" | "LANGUAGE" | "VIA" | "EQ" | "NE" | "CP" | "NP" | "GE" | "LT" | "LE" | "GT" | "SELECTIONS" | "LIST" | "SPOOL" | "ARCHIVE" | "DYNPRO" | "JOB" | "BEFORE" | "UNWIND" | "CLEANUP" | "ASSOCIATION" | "ENUM" | "STRUCTURE" | "BASE" | "MESH" | "VARY" | "TASK" | "NEW" | "BACKGROUND" | "SEPARATE" | "DESTINATION" | "CALLING" | "PERFORMING" | "IMPORTING" | "ELSE" | "DEFINITION" | "DEFERRED" | "PUBLIC" | "PROTECTED" | "PRIVATE" | "INHERITING" | "ABSTRACT" | "FINAL" | "ENABLED" | "TESTING" | "RISK" | "LEVEL" | "CRITICAL" | "DANGEROUS" | "HARMLESS" | "DURATION" | "SHORT" | "MEDIUM" | "LONG" | "GLOBAL" | "FRIENDS" | "LOAD" | "IMPLEMENTATION" | "SECTION" | "REDEFINITION" | "IGNORE" | "FAIL" | "PREFERRED" | "RETURNING" | "THEN" | "UNTIL" | "GIVING" | "ACCORDING" | "SUBKEY" | "CONDITION" | "COMPONENT" | "INCREMENT" | "FIRST" | "LAST" | "DIALOG" | "PROCEDURE" | "FLUSH" | "TRANSACTION" | "OPTIONS" | "MESSAGES" | "TRANSFORMATION" | "OBJECTS" | "SOURCE" | "XML" | "AREA" | "BADI" | "NULL" | "WORK" | "TABLEVIEW" | "TABSTRIP" | "SORTABLE" | "STAMP" | "DAYLIGHT" | "SAVING" | "CONTEXT" | "DISTANCE" | "PAGES" | "TITLE" | "BACKUP" | "SQL" | "INTERNAL" | "COMPRESSION" | "OFF" | "OCCURRENCE" | "OCCURRENCES" | "SUBSTRING" | "REGEX" | "MATCH" | "COUNT" | "RESULTS" | "SUBMATCHES" | "COLOR" | "COL_BACKGROUND" | "COL_HEADING" | "COL_NORMAL" | "COL_TOTAL" | "COL_KEY" | "COL_POSITIVE" | "COL_NEGATIVE" | "COL_GROUP" | "INTENSIFIED" | "INVERSE" | "HOTSPOT" | "FRAMES" | "RESET" | "SUBROUTINE" | "POOL" | "FILTERS" | "BIT" | "ATTRIBUTES" | "LOCALE" | "COUNTRY" | "MODIFIER" | "EXCLUDING" | "PROPERTY" | "RUN" | "ACCEPTING" | "PADDING" | "TRUNCATION" | "BOUNDARIES" | "DIRECTORY" | "RENAMING" | "FOUND" | "PERSON" | "VALUES" | "DUPLICATE" | "KEYS" | "ENTRY" | "ARITHMETIC" | "UNICODE" | "ENABLING" | "PARTIALLY" | "IMPLEMENTED" | "SCROLLING" | "PRINT" | "ONLY" | "OBLIGATORY" | "VISIBLE" | "LISTBOX" | "RADIOBUTTON" | "MODIF" | "LOWER" | "MATCHCODE" | "PATTERN" | "CONTROL" | "COLUMN" | "PLACES" | "FORWARD" | "BACKWARD" | "INTERVALS" | "OPTION" | "SELECTION" | "LOW" | "HIGH" | "TAB" | "BLANK" | "FILE" | "HANDLER" | "INSTANCES" | "MARGIN" | "IMMEDIATELY" | "ANALYZER" | "CLOCK" | "RESOLUTION" | "TITLEBAR" | "CIRCULAR" | "DELETING" | "LEADING" | "TRAILING" | "SWITCHSTATES" | "DURING" | "UPPER" | "SECONDS" | "ASYNCHRONOUS" | "TASKS" | "MESSAGING" | "CHANNELS" | "PUSH" | "DIV" | "MOD" | "EQUIV" | "CO" | "CN" | "CA" | "NA" | "CS" | "NS" | "INSTANCE" | "BOUND" | "ASSIGNED" | "SUPPLIED" | "REQUESTED" | "LINES" ) 
AllowedKeywords ::= ( AllowedKeywordsForTypeName | "SORTED" | "STANDARD" | "REF" | "CHECK" | "EDIT" | "NODE" | "TYPE" ) 
TypeName ::= ( ( identifier | AllowedKeywordsForTypeName ) | "(" ( string1 | identifier | AllowedKeywordsForTypeName ) ")" ) ( "=>" ( ( identifier | AllowedKeywordsForTypeName ) | "(" ( identifier | AllowedKeywordsForTypeName ) ")" ) )* 
Var ::= Expression 
Expression ::= Conditional ( AssignmentOperator Expression )* 
Exps ::= Expression ( Expression )* 
NameInVarDef ::= ( identifier | AllowedKeywords | "REFERENCE" ) 
Name ::= ( ( identifier | AllowedKeywords ) | "(" ( identifier | AllowedKeywords ) ")" ) 
NameInPrimary ::= ( ( identifier | AllowedKeywordsExclude ) | "(" ( identifier | AllowedKeywordsExclude ) ")" ) 
C ::= ( ( ReportDef | FunctionDef | ClassStatement | stINTERFACE | stTYPE_POOL ) )* 
ReportDef ::= "REPORT" identifier ( ( "NO" "STANDARD" "PAGE" "HEADING" )? ( "LINE-SIZE" number )? ( "LINE-COUNT" number ( "(" number ")" )? )? ( "MESSAGE-ID" identifier )? ( "DEFINING" "DATABASE" identifier )? ( "REDUCED" "FUNCTIONALITY" )? )* "." ( Statement )* 
FunctionDef ::= "FUNCTION" identifier "." ( Statement )* "ENDFUNCTION" "." 
ClassStatement ::= "CLASS" identifier ( "DEFINITION" ( "DEFERRED" ( "PUBLIC" )? | ( ( "PUBLIC" | "PROTECTED" | "PRIVATE" ) )? ( ( "INHERITING" "FROM" identifier )? ( "ABSTRACT" )? ( "FINAL" )? ( "CREATE" ( ( "PUBLIC" | "PROTECTED" | "PRIVATE" ) )* )? ( "SHARED" "MEMORY" "ENABLED" )? ( "FOR" "TESTING" ( "RISK" "LEVEL" ( ( "CRITICAL" | "DANGEROUS" | "HARMLESS" ) )* )? ( "DURATION" ( ( "SHORT" | "MEDIUM" | "LONG" ) )* )? )? ( ( "GLOBAL" )? "FRIENDS" identifier ( identifier )* )? )* ) ( "LOAD" )? | "IMPLEMENTATION" ) "." ( ( ( "PUBLIC" | "PROTECTED" | "PRIVATE" ) "SECTION" "." )? ( Statement )* )* ( "ENDCLASS" "." )? 
stINTERFACE ::= "INTERFACE" identifier ( ( ( "PUBLIC" | "PRIVATE" | "PROTECTED" ) )? "." ( ( stTYPES | stINTERFACES | stINTERFACE | VariableDefineStatement | stINCLUDE | stALIASES | MethodsStatement | ClassStatement | stTYPE_POOLS ) )* "ENDINTERFACE" | ( "DEFERRED" ( "PUBLIC" )? | "LOAD" ) ) "." 
stTYPE_POOL ::= "TYPE-POOL" identifier "." ( ( stTYPES | VariableDefineStatement ) )* 
stTYPES ::= "TYPES" ( "BEGIN" "OF" ( "ENUM" identifier ( "STRUCTURE" identifier )? ( "BASE" "TYPE" identifier )? "." "TYPES" identifier "VALUE" ( Expression | "IS" "INITIAL" ) ( "," "TYPES" identifier "VALUE" ( Expression | "IS" "INITIAL" ) )* "TYPES" "END" "OF" "ENUM" identifier ( "STRUCTURE" identifier )? | "MESH" identifier "." ( Types_mesh_stmt )* "DATA" "END" "OF" "MESH" identifier | NameInVarDef ) | "END" "OF" identifier | NameInVarDef ( "(" number ")" )? ( TypeDes | LikeDes ) ) "." 
VariableDefineStatement ::= ( "DATA" | "STATICS" | "CLASS-DATA" | "CONSTANTS" ) ( ( "BEGIN" "OF" ( "COMMON" "PART" NameInVarDef | NameInVarDef ( "READ-ONLY" )? ( "OCCURS" number )? ) | "END" "OF" ( "COMMON" "PART" NameInVarDef | NameInVarDef ( "VALID" "BETWEEN" Expression "AND" Expression )? ) | NameInVarDef ( "(" number ")" )* ( TypeDes | LikeDes ) ) ( ( "VALUE" ( ( Expression | "IS" "INITIAL" ) )* )? ( "READ-ONLY" )? ( "OCCURS" number ( "WITH" "HEADER" "LINE" )? )? )* | "(" identifier ")" "=" Expression ) "." 
Statement ::= ( VariableDefineStatement | WriteStatement | AssignmentStatement | ContinueStatement | stDO | ForStatement | IfStatement | NullStatement | ReturnStatement | stWHILE | LoopStatement | CaseStatement | stCALL | ClassStatement | MethodStatement | MethodsStatement | FunctionDef | MessageStatement | SearchStatement | stAPPEND | stSPLIT | stRAISE | stMOVE | stMOVE_CORRESPONDING | stWITH | stTABLES | stAUTHORITY_CHECK | stDELETE | stEVENTS | stMODIFY | stON | stOPEN | stFETCH | stPROVIDE | stREAD | stSORT | stSUBMIT | stTRY | stADD | stADD_CORRESPONDING | stALIASES | stASSERT | stASSIGN | stAT | stBACK | stBREAK_POINT | stCHECK | stCLASS_EVENTS | stCLASS_POOL | stCLEAR | stCLOSE | stCOLLECT | stCOMMIT | stCOMPUTE | stCONCATENATE | stCONDENSE | stCONTROLS | stCONVERT | stCREATE | stDEMAND | stDESCRIBE | stDETAIL | stDIVIDE | stDIVIDE_CORRESPONDING | stEDITOR_CALL | stEND_OF_PAGE | stEND_OF_SELECTION | stEXIT | stEXPORT | stEXTRACT | stFIELD_GROUPS | stFIELD_SYMBOLS | stFIELDS | stFIND | stFORMAT | stFREE | stFUNCTION_POOL | stGENERATE | stGET | stHIDE | stIMPORT | stINCLUDE | stINFOTYPES | stINITIALIZATION | stINPUT | stINSERT | stINTERFACE | stINTERFACE_POOL | stINTERFACES | stLEAVE | stLOAD_OF_PROGRAM | stLOCAL | stLOG_POINT | stMAXIMUM | stMINIMUM | stMODULE | stMULTIPLY | stMULTIPLY_CORRESPONDING | stNEW_LINE | stNEW_PAGE | stNEW_SECTION | stNODES | stOVERLAY | stPACK | stPARAMETERS | stPERFORM | stPOSITION | stPRINT_CONTROL | stPROGRAM | stRANGES | stRECEIVE | stREFRESH | stREJECT | stREPLACE | stRESERVE | stRESUME | stRETRY | stRETURN | stROLLBACK | stSCROLL | stSELECT_OPTIONS | stSELECTION_SCREEN | stSET | stSHIFT | stSKIP | stSTOP | stSUBTRACT | stSUBTRACT_CORRESPONDING | stSUM | stSUMMARY | stSUMMING | stSUPPLY | stSUPPRESS | stSYNTAX_CHECK | stTEST_INJECTION | stTEST_SEAM | stTOP_OF_PAGE | stTRANSFER | stTRANSLATE | stTRUNCATE | stTYPE_POOL | stTYPE_POOLS | stTYPES | stULINE | stUNASSIGN | stUNPACK | stUPDATE | stWAIT | stWINDOW | stSELECT | stENDSELECT ) 
Type ::= identifier 
WriteStatement ::= "WRITE" ( ( ( "AT" )? ( "/" )? ( number )? ( "(" ( Expression | "*" | "**" ) ")" )? )* ( Expression )? ( ( "UNDER" identifier )? ( "NO-GAP" )? ( ( "LEFT-JUSTIFIED" | "CENTERED" | "RIGHT-JUSTIFIED" ) )? ( ( ( "EXPONENT" Expression )? ( "NO-GROUPING" )? ( "NO-SIGN" )? ( "NO-ZERO" )? ( "CURRENCY" string1 )? ( ( ( "DECIMALS" string1 )? ( "ROUND" number )? | ( "UNIT" string1 )? ) )* | ( ( "ENVIRONMENT" "TIME" "FORMAT" )? ( "TIME" "ZONE" string1 )? )* ( "STYLE" string1 )? ) )* ( "USING" ( ( "NO" "EDIT" "MASK" | "EDIT" "MASK" string1 ) )* )? ( ( "DD/MM/YY" | "MM/DD/YY" | "DD/MM/YYYY" | "MM/DD/YYYY" | "DDMMYY" | "MMDDYY" | "YYMMDD" ) )? Format_options ( "AS" ( "CHECKBOX" | "ICON" | "SYMBOL" | "LINE" ) )* ( "QUICKINFO" string1 )? )* | ( identifier | "(" identifier ")" ) "TO" identifier ( ( "LEFT-JUSTIFIED" | "CENTERED" | "RIGHT-JUSTIFIED" ) )? ( ( "EXPONENT" Expression )? ( "NO-GROUPING" )? ( "NO-SIGN" )? ( "NO-ZERO" )? ( "CURRENCY" string1 )? ( ( "DECIMALS" number )? ( "ROUND" number )? | ( "UNIT" string1 )? ) | ( "ENVIRONMENT" "TIME" "FORMAT" )? ( "TIME" "ZONE" string1 )? ( "STYLE" string1 )? ) ( "USING" ( "NO" "EDIT" "MASK" | "EDIT" "MASK" identifier ) )? ( ( "DD/MM/YY" | "MM/DD/YY" | "DD/MM/YYYY" | "MM/DD/YYYY" | "DDMMYY" | "MMDDYY" | "YYMMDD" ) )? ) "." 
AssignmentStatement ::= Expression 
ContinueStatement ::= "CONTINUE" "." 
stDO ::= "DO" ( number "TIMES" )? ( VARYING )* "." ( Statement )* "ENDDO" "." 
ForStatement ::= "for" "(" ( Expression )? ";" ( Expression )? ";" ( Expression )? ")" Statement 
IfStatement ::= "IF" LogExp "." ( ( Statement )* )? ( "ELSEIF" LogExp "." ( ( Statement )* )? )* ( "ELSE" "." ( ( Statement )* )? )? "ENDIF" "." 
NullStatement ::= "." 
ReturnStatement ::= "return" ( Expression )? ";" 
stWHILE ::= "WHILE" LogExp ( "VARY" identifier "FROM" identifier "NEXT" identifier ( "RANGE" Expression )? )* "." ( Statement )* "ENDWHILE" "." 
LoopStatement ::= "LOOP" ( "AT" ( ( Expression ( ( "INTO" Expression | "ASSIGNING" Var ( "CASTING" )? | "REFERENCE" "INTO" Expression | "TRANSPORTING" "NO" "FIELDS" ) )? ( "USING" "KEY" ( identifier | "(" identifier ")" ) )? ( "FROM" identifier )? ( "TO" identifier )? ( "WHERE" LogExp )? ( GroupBy )? | Expression ( "VERSION" string1 )? ) | "GROUP" Expression ( "INTO" identifier | "ASSIGNING" identifier ( "CASTING" )? | "REFERENCE" "INTO" identifier | "TRANSPORTING" "NO" "FIELDS" ) ( "WHERE" LogExp )? ( GroupBy )? | "SCREEN" "INTO" identifier ) )? "." ( Statement )* "ENDLOOP" "." 
CaseStatement ::= "CASE" Expression "." ( "WHEN" ( Expression ( "OR" Expression )* | "OTHERS" ) "." ( Statement )* )* "ENDCASE" "." 
stCALL ::= "CALL" ( CallFunction | CallBadi | CallDialog | CallCustomerFunction | CallDatabaseProcedure | CallMethod | CallScreen | CallSelectionScreen | CallTransation | CallTransformation ) 
MethodStatement ::= "METHOD" identifier ( "~" identifier )? "." ( Statement )* "ENDMETHOD" "." 
MethodsStatement ::= ( "METHODS" | "CLASS-METHODS" ) identifier ( "~" identifier )? ( ( "ABSTRACT" | "FINAL" ) )? ( "FOR" "TESTING" | ( "FINAL" )? "REDEFINITION" | ( "DEFAULT" ( "IGNORE" | "FAIL" ) )? ( "FOR" "EVENT" identifier "OF" identifier )? ( "IMPORTING" ( ( "VALUE" "(" identifier ")" | "REFERENCE" "(" identifier ")" | identifier ) Typing ( ( "OPTIONAL" | "DEFAULT" Expression ) )? )* ( "PREFERRED" "PARAMETER" identifier )? )? ( "EXPORTING" ( ( ( "VALUE" "(" identifier ")" | "REFERENCE" "(" identifier ")" | identifier ) )* Typing )* )? ( "CHANGING" ( ( "VALUE" "(" identifier ")" | "REFERENCE" "(" identifier ")" | identifier ) Typing ( ( "OPTIONAL" | "DEFAULT" Expression ) )? )* )? ( "RETURNING" ( "VALUE" "(" identifier ")" )* Typing )? ( ( ( "RAISING" ( "RESUMABLE" "(" identifier ")" | identifier ) ( ( "RESUMABLE" "(" identifier ")" | identifier ) )* )* | ( "EXCEPTIONS" identifier ( identifier )* )* ) )? ) "." 
MessageStatement ::= "MESSAGE" ( ( "ID" identifier "TYPE" identifier "NUMBER" number | string1 "TYPE" identifier | identifier ( ( "(" identifier ")" | "TYPE" identifier ) )? ) )* ( ( ( "DISPLAY" "LIKE" identifier )? ( "RAISING" identifier )? | "INTO" Name ) )? ( "WITH" identifier ( identifier )* )? "." 
SearchStatement ::= "SEARCH" identifier "FOR" string1 ( "IN" ( "CHARACTER" | "BYTE" ) "MODE" )? ( "STARTING" "AT" Expression )? ( "ENDING" "AT" Expression )? ( "ABBREVIATED" )? ( "AND" "MARK" )? "." 
stAPPEND ::= "APPEND" ( "INITIAL" "LINE" | Expression ( "OF" identifier ( "FROM" number ( "TO" number )? )? ( "USING" "KEY" string1 )? )? ) "TO" Name ( "[" "]" )* ( "SORTED" "BY" string1 )? ( ( "ASSIGNING" Var ( "CASTING" )? | "REFERENCE" "INTO" identifier ) )? "." 
stSPLIT ::= "SPLIT" identifier "AT" Expression "INTO" ( "TABLE" identifier | identifier ( identifier )* ) ( "IN" ( ( "CHARACTER" | "BYTE" ) )* "MODE" )? 
stRAISE ::= "RAISE" ( "EVENT" identifier ( "EXPORTING" Expression ( Expression )* )? | ( "RESUMABLE" )? "EXCEPTION" ( ( "TYPE" identifier ( ( "MESSAGE" identifier "(" identifier ")" | ( "ID" identifier "TYPE" identifier "NUMBER" Expression )* ( "WITH" identifier ( identifier )* )? ) )? ( "EXPORTING" Expression ( Expression )* )? | identifier ) )? | identifier ) 
stMOVE ::= "MOVE" ( "EXACT" )? Expression ( ( "TO" | "?TO" ) )? Expression ( "PERCENTAGE" Expression ( ( "LEFT" | "RIGHT" ) )? )? 
stMOVE_CORRESPONDING ::= "MOVE-CORRESPONDING" ( "EXACT" )? ( Var "TO" Var ( "EXPANDING" "NESTED" "TABLES" )? | Var "TO" Var ( "EXPANDING" "NESTED" "TABLES" )? ( "KEEPING" "TARGET" Var )? ) "." 
stWITH ::= "WITH" Withline ( Withline )* "ENDWITH" 
stTABLES ::= "TABLES" ( "*" )? identifier "." 
stAUTHORITY_CHECK ::= "AUTHORITY-CHECK" "OBJECT" identifier ( "FOR" "USER" string1 )? AUTHORITY_CHECK_ITEM ( AUTHORITY_CHECK_ITEM )* "." 
stDELETE ::= "DELETE" ( "DATASET" identifier | ( ( "FROM" Expression ( "USING" "CLIENT" identifier )? | ( ( identifier | "(" Expression ")" ) )? ( "CLIENT" "SPECIFIED" )? ( "CONNECTION" ( "(" Expression ")" | identifier ) )? ( "USING" "KEY" ( "(" )? identifier ( ")" )? )? ( "FROM" identifier )? ( "TO" identifier )? ( "WHERE" LogExp )? ( "ORDER" "BY" identifier ( "," identifier )* ( "OFFSET" number )? )? ( "UP" "TO" number "ROWS" )? ) | "TABLE" identifier ) | ( ( "TABLE" identifier ( "FROM" identifier ( "USING" "KEY" ( identifier | "(" identifier ")" ) )? | "WITH" "TABLE" "KEY" ( ( identifier | "(" identifier ")" ) "COMPONENTS" )? ( "(" )? identifier ( ")" )? "=" identifier ) | identifier ( "INDEX" identifier )? ( "USING" "KEY" ( "(" )? identifier ( ")" )? )? ) | "ADJACENT" "DUPLICATES" "FROM" identifier ( "USING" "KEY" ( "(" )? identifier ( ")" )? )? ( ( "COMPARING" identifier | "ALL" "FIELDS" ) )? | "FROM" ( "MEMORY" "ID" number | "DATABASE" identifier "(" identifier ")" ( "CLIENT" identifier )? "ID" number | "SHARED" ( "MEMORY" identifier "(" identifier ")" ( "CLIENT" identifier )? "ID" number | "BUFFER" identifier "(" identifier ")" ( "CLIENT" identifier )? "ID" number ) ) ) ) "." 
stEVENTS ::= "EVENTS" identifier ( Event_options )? "." 
stMODIFY ::= "MODIFY" ( ( ( ( "TABLE" identifier | identifier "INDEX" identifier ( "USING" "KEY" ( "(" )? identifier ( ")" )? )? ) | identifier ( "USING" "KEY" identifier )? "FROM" identifier ( "TRANSPORTING" identifier )? ( ( "ASSIGNING" identifier ( "CASTING" )? | "REFERENCE" "INTO" identifier ) )? ) | identifier "FROM" identifier ( "USING" "KEY" ( "(" )? identifier ( ")" )? )? "TRANSPORTING" identifier "WHERE" "(" LogExp ")" ) | ( "LINE" number ( ( "OF" "PAGE" number | "CURRENT" "PAGE" ) )? ( "INDEX" identifier )? | "CURRENT" "LINE" ) ( "LINE" "VALUE" "FROM" identifier )? ( "FIELD" "VALUE" identifier ( "FROM" identifier )? ( identifier ( "FROM" identifier )? )* )? ( "LINE" "FORMAT" Format_options )? ( "FIELD" "FORMAT" identifier Format_options ( identifier Format_options )* )? | "SCREEN" "FROM" identifier | ( identifier | "(" Expression ")" ) ( ( "USING" "CLIENT" identifier )? | ( "CLIENT" "SPECIFIED" )? ) ( "CONNECTION" ( "(" Expression ")" | identifier ) )? "FROM" ( identifier | "TABLE" identifier ) ) "." 
stON ::= "ON" "CHANGE" "OF" identifier ( "OR" identifier )* "." Statements "ENDON" "." 
stOPEN ::= "OPEN" ( "CURSOR" ( "WITH" "HOLD" )? "@" identifier "FOR" ( "WITH" "+" identifier "AS" identifier ( "," "+" identifier "AS" identifier )* )? "SELECT" ( Expression ( "," Expression )* "FROM" identifier ( "," identifier )* | "FROM" identifier ( "," identifier )* "FIELDS" Expression ( "," Expression )* ) ( ( "FOR" "ALL" "ENTRIES" "IN" identifier )? "WHERE" SQLCondition )? ( GroupBy )? ( "HAVING" SQLCondition )? ( "ORDER" "BY" identifier ( "," identifier )* )? ( "OFFSET" number )? ( "UP" "TO" number "ROWS" )? ( "BYPASSING" "BUFFER" )? ( ( "CONNECTION" identifier | "(" Expression ")" ) )? | "DATASET" identifier "FOR" ( "INPUT" | "OUTPUT" | "APPENDING" | "UPDATE" ) "IN" ( "BINARY" "MODE" | "TEXT" "MODE" "ENCODING" ( "DEFAULT" | identifier ( ( "SKIPPING" | "WITH" "BYTE-ORDER" "MARK" ) )? | "NON-UNICODE" ) ( "WITH" ( "NATIVE" | "SMART" | "UNIX" | "WINDOWS" ) "LINEFEED" )? | "LEGACY" ( "BINARY" "MODE" ( ( "BIG" | "LITTLE" ) "ENDIAN" )? ( "CODE" "PAGE" identifier )? | "TEXT" "MODE" ( ( "BIG" | "LITTLE" ) "ENDIAN" )? ( "CODE" "PAGE" identifier )? ( "WITH" ( "NATIVE" | "SMART" | "UNIX" | "WINDOWS" ) "LINEFEED" )? ) ) ( "AT" "POSITION" number )? ( "TYPE" identifier )? ( "FILTER" identifier )? ( "MESSAGE" string1 )? ( "IGNORING" "CONVERSION" "ERRORS" )? ( "REPLACEMENT" "CHARACTER" char )? ) "." 
stFETCH ::= "FETCH" "NEXT" "CURSOR" identifier ( "INTO" ( ( "CORRESPONDING" "FIELDS" "OF" )? identifier | identifier ( "," identifier )* ) | ( "INTO" | "APPENDING" ( "CORRESPONDING" "FIELDS" "OF" )? "TABLE" identifier ( "PACKAGE" "SIZE" number )? ) ) ( "EXTENDED" "RESULT" "@" identifier )? "." 
stPROVIDE ::= "PROVIDE" ProvideFields ( ProvideFields )* "BETWEEN" number "AND" number ( "INCLUDING" "GAPS" )? "." Statements "ENDPROVIDE" "." 
stREAD ::= "READ" ( "DATASET" identifier "INTO" identifier ( "MAXIMUM" identifier number )? ( ( "ACTUAL" )? identifier number )? | ( "LINE" number ( ( "OF" "PAGE" number | "OF" "CURRENT" "PAGE" ) )? ( "INDEX" identifier )? | "CURRENT" "LINE" ) ( "LINE" "VALUE" "INTO" identifier )? ( "FIELD" "VALUE" identifier ( "INTO" identifier )? ( identifier ( "INTO" identifier )? )* )? | "REPORT" identifier "INTO" identifier ( "MAXIMUM" "WIDTH" "INTO" number )? | "TABLE" Name ( ( ( "FROM" identifier ( "USING" "KEY" ( "(" )? identifier ( ")" )? )? | "WITH" ( "TABLE" )? "KEY" Name ( "COMPONENTS" | "=" Expression ) ( Name "=" Expression )* | "INDEX" Expression ( "USING" "KEY" Name )? ) )? ( ( "INTO" Var ( "COMPARING" ( "ALL" "FIELDS" | "NO" "FIELDS" | identifier ( identifier )* ) )? ( "TRANSPORTING" ( "ALL" "FIELDS" | identifier ( identifier )* ) )? | "ASSIGNING" Var ( "CASTING" )? | "REFERENCE" "INTO" identifier | "TRANSPORTING" "NO" "FIELDS" | "BINARY" "SEARCH" ) )? )* | "TEXTPOOL" identifier "INTO" identifier "LANGUAGE" identifier ) "." 
stSORT ::= "SORT" identifier ( "STABLE" )? ( ( "ASCENDING" | "DESCENDING" ) )? ( "AS" "TEXT" )? ( "BY" Expression ( ( "ASCENDING" | "DESCENDING" ) )? ( "AS" "TEXT" )? ( Expression ( ( "ASCENDING" | "DESCENDING" ) )? ( "AS" "TEXT" )? )* )? "." 
stSUBMIT ::= "SUBMIT" ( identifier | "(" identifier ")" ) ( "USING" "SELECTION-SCREEN" identifier )? ( "VIA" "SELECTION-SCREEN" )? ( "USING" "SELECTION-SET" identifier )? ( "USING" "SELECTION-SETS" "OF" "PROGRAM" identifier )? ( "WITH" "SELECTION-TABLE" identifier )? ( "WITH" identifier ( ( "EQ" | "NE" | "CP" | "NP" | "GE" | "LT" | "LE" | "GT" ) identifier ( identifier string1 )? | ( "NOT" )? "BETWEEN" identifier "AND" identifier ( identifier string1 )? | "IN" identifier ) )* ( "WITH" "FREE" "SELECTIONS" string1 )? ( "LINE-SIZE" number )? ( "LINE-COUNT" number )? ( ( "EXPORTING" "LIST" "TO" "MEMORY" )? | ( "TO" "SAP-SPOOL" "SPOOL" "PARAMETERS" identifier ( "ARCHIVE" "PARAMETERS" identifier )? "WITHOUT" "SPOOL" "DYNPRO" )? ) ( ( "USER" string1 )? "VIA" "JOB" identifier "NUMBER" number ( "LANGUAGE" identifier )? )? ( "AND" "RETURN" )? "." 
stTRY ::= "TRY" "." ( Statement )* ( "CATCH" ( "BEFORE" "UNWIND" )? ( Name )* ( "INTO" Var )? "." ( Statement )* )* ( "CLEANUP" ( "INTO" identifier )? "." ( Statement )* )? "ENDTRY" "." 
stADD ::= "ADD" Expression ( "TO" Name | ( "THEN" identifier "UNTIL" identifier ( "TO" identifier | "GIVING" identifier ( "ACCORDING" "TO" identifier )? ) | "FROM" number "TO" number "GIVING" identifier ) ( "RANGE" Expression )? ) "." 
stADD_CORRESPONDING ::= "ADD-CORRESPONDING" identifier "TO" identifier "." 
stALIASES ::= "ALIASES" identifier "FOR" Name "." 
stASSERT ::= "ASSERT" ( ( "ID" identifier ( "SUBKEY" identifier )? )? ( "FIELDS" identifier ( identifier )* )? "CONDITION" )? LogExp "." 
stASSIGN ::= "ASSIGN" ( ( "TABLE" "FIELD" )? "(" identifier ")" | "COMPONENT" Expression "OF" "STRUCTURE" identifier | Expression ( ( ( "+" number )? ( "(" number ")" )? | ( "->" | "=>" ) ( ( "*" | Name ) )? | "INCREMENT" number ) )? ) "TO" Var ( ( "CASTING" ( ( ( "TYPE" ( "HANDLE" )? Name )? ( "DECIMALS" number )? | "LIKE" identifier ) )? | ( "TYPE" identifier )? ( "DECIMALS" number )? ) )? ( "RANGE" Expression )? "." 
stAT ::= "AT" ( "NEW" identifier | "FIRST" | "LAST" | "END" "OF" identifier ) "." ( Statement )* "ENDAT" "." 
stBACK ::= "BACK" "." 
stBREAK_POINT ::= "BREAK-POINT" ( ( "ID" identifier | "(" string1 ")" ) )? "." 
stCHECK ::= "CHECK" LogExp "." 
stCLASS_EVENTS ::= "CLASS-EVENTS" identifier Event_options "." 
stCLASS_POOL ::= "CLASS-POOL" ( "MESSAGE-ID" identifier )? "." 
stCLEAR ::= "CLEAR" Expression ( ( "WITH" identifier ( "IN" ( "CHARACTER" | "BYTE" ) "MODE" )? | "WITH" "NULL" ) )? "." 
stCLOSE ::= "CLOSE" ( "CURSOR" "@" identifier | "DATASET" identifier ) "." 
stCOLLECT ::= "COLLECT" Name "INTO" Name ( ( "ASSIGNING" identifier ( "CASTING" )? )? | ( "REFERENCE" "INTO" identifier )? ) "." 
stCOMMIT ::= "COMMIT" ( "WORK" ( "AND" "WAIT" )? | "CONNECTION" identifier ) "." 
stCOMPUTE ::= "COMPUTE" ( "EXACT" )? identifier ( "?" )? "=" identifier "." 
stCONCATENATE ::= "CONCATENATE" ( Expression ( Expression )* | "LINES" "OF" identifier ) "INTO" Var ( "IN" ( "CHARACTER" | "BYTE" ) "MODE" )? ( "SEPARATED" "BY" Name )? ( "RESPECTING" "BLANKS" )? "." 
stCONDENSE ::= "CONDENSE" Expression ( "NO-GAPS" )? "." 
stCONTROLS ::= ( "CONTROLS" identifier "TYPE" "TABLEVIEW" "USING" "SCREEN" identifier | "TABSTRIP" "." ) 
stCONVERT ::= "CONVERT" ( | "TEXT" string1 "INTO" "SORTABLE" "CODE" string1 | "TIME" "STAMP" string1 "TIME" "ZONE" string1 "INTO" ( identifier string1 )? ( "TIME" string1 )? ( "DAYLIGHT" "SAVING" "TIME" string1 )? | identifier string1 ( "TIME" string1 ( "DAYLIGHT" "SAVING" "TIME" string1 )? )? "INTO" "TIME" "STAMP" string1 "TIME" "ZONE" string1 ) "." 
stCREATE ::= "CREATE" ( "DATA" identifier ( "AREA" "HANDLE" identifier )? ( ( TypeDes | LikeDes ) )? | "OBJECT" identifier ( "AREA" "HANDLE" identifier )? ( ( "TYPE" TypeName )? ( "EXPORTING" Expression ( Expression )* )? ( "EXCEPTIONS" Expression ( Expression )* ( "OTHERS" "=" identifier )? )? )? | ( ( "TYPE" "(" identifier ")" ( "EXPORTING" Expression ( Expression )* )? ( "EXCEPTIONS" Expression ( Expression )* ( "OTHERS" "=" identifier )? )? | ( "PARAMETER-TABLE" identifier )? ( "EXCEPTION-TABLE" identifier )? ) )? | "OBJECT" identifier identifier ( "NO" "FLUSH" )? ( "QUEUE-ONLY" )? ) "." 
stDEMAND ::= "DEMAND" Expression ( Expression )* "FROM" "CONTEXT" identifier ( "MESSAGES" "INTO" identifier )? "." 
stDESCRIBE ::= "DESCRIBE" ( "DISTANCE" "BETWEEN" identifier "AND" identifier "INTO" identifier "IN" ( "BYTE" | "CHARACTER" ) "MODE" | "FIELD" Expression ( "TYPE" identifier ( "COMPONENTS" identifier )? )? ( identifier Expression "IN" ( "BYTE" | "CHARACTER" ) "MODE" )? ( "DECIMALS" Expression )? ( "OUTPUT-LENGTH" Expression )? ( "HELP-ID" identifier )? ( "EDIT" "MASK" identifier )? | "LIST" ( "NUMBER" "OF" ( Expression | "PAGES" ) Expression | "LINE" Expression "PAGE" Expression | "PAGE" Expression ( "LINE-SIZE" Expression )? ( "LINE-COUNT" Expression )? ( Expression Expression )? ( "FIRST-LINE" Expression )? ( "TOP-LINES" Expression )? ( "TITLE-LINES" Expression )? ( "HEAD-LINES" Expression )? ( "END-LINES" Expression )? ) ( "INDEX" identifier )? | "TABLE" identifier ( ( "KIND" identifier )? ( Expression Expression )? ( "OCCURS" Expression )? )* ) "." 
stDETAIL ::= "DETAIL" "." 
stDIVIDE ::= "DIVIDE" identifier "BY" identifier "." 
stDIVIDE_CORRESPONDING ::= "DIVIDE-CORRESPONDING" identifier "BY" identifier "." 
stEDITOR_CALL ::= "EDITOR-CALL" "FOR" ( "REPORT" identifier ( "DISPLAY-MODE" )? | identifier ( "TITLE" string1 )? ( ( "DISPLAY-MODE" | "BACKUP" "INTO" identifier ) )? ) "." 
stEND_OF_PAGE ::= "END-OF-PAGE" "." 
stEND_OF_SELECTION ::= "END-OF-SELECTION" "." 
stEXIT ::= "EXIT" ( ( "FROM" "SQL" | "FROM" "STEP-LOOP" ) )? "." 
stEXPORT ::= "EXPORT" ( Expression ( Expression )* | identifier "FROM" identifier ( identifier "FROM" identifier )* | "(" identifier ")" ) "TO" ( "DATA" "BUFFER" identifier | "INTERNAL" "TABLE" identifier | "MEMORY" "ID" identifier | "DATABASE" identifier "(" identifier ")" ( "FROM" identifier )? identifier "ID" identifier | ( "SHARED" "MEMORY" | "BUFFER" ) identifier "(" identifier ")" ( "FROM" identifier )? ( "CLIENT" identifier )? "ID" identifier ) ( "COMPRESSION" ( "ON" | "OFF" ) )? "." 
stEXTRACT ::= "EXTRACT" identifier "." 
stFIELD_GROUPS ::= "FIELD-GROUPS" identifier "." 
stFIELD_SYMBOLS ::= "FIELD-SYMBOLS" identifier ( Typing | "STRUCTURE" identifier "DEFAULT" identifier ) "." 
stFIELDS ::= "FIELDS" identifier "." 
stFIND ::= "FIND" ( ( "FIRST" "OCCURRENCE" | "ALL" "OCCURRENCES" ) "OF" )? ( ( "SUBSTRING" )? ShiftExp | "REGEX" string1 ) "IN" ( ( "SECTION" ( "OFFSET" number )? ( "LENGTH" number )? "OF" )? Name | "TABLE" Expression ( "FROM" number ( "OFFSET" number )? )? ( "TO" number ( "OFFSET" number )? )? ) ( "IN" ( "CHARACTER" | "BYTE" ) "MODE" )? ( ( "RESPECTING" | "IGNORING" ) "CASE" )? ( "MATCH" "COUNT" number )? ( ( "MATCH" "LINE" number )? ( "MATCH" "OFFSET" number )? ( "MATCH" identifier number )? | ( "RESULTS" identifier )? ) ( "SUBMATCHES" string1 )? "." 
stFORMAT ::= "FORMAT" Format_options "." 
stFREE ::= "FREE" ( "MEMORY" "ID" Var | "OBJECT" Var ( "NO" "FLUSH" )? | Var ) "." 
stFUNCTION_POOL ::= "FUNCTION-POOL" identifier ( "NO" "STANDARD" "PAGE" "HEADING" )? ( "LINE-SIZE" number )? ( "LINE-COUNT" number ( "(" number ")" )? )? ( "MESSAGE-ID" identifier )? "." 
stGENERATE ::= "GENERATE" "SUBROUTINE" "POOL" identifier identifier identifier ( "MESSAGE" string1 )? ( "INCLUDE" string1 )? ( "LINE" number )? ( identifier string1 )? ( "OFFSET" Expression )? ( "MESSAGE-ID" identifier )? ( "SHORTDUMP-ID" identifier )? "." 
stGET ::= "GET" ( "BADI" identifier ( "FILTERS" Expression ( Expression )* )? | identifier "TYPE" "(" identifier ")" ( ( "FILTERS" Exps | "FILTER-TABLE" identifier ) )? ( "CONTEXT" identifier )? | "BIT" number "OF" string1 "INTO" identifier | "CURSOR" ( "FIELD" identifier ( "VALUE" string1 )? ( "LENGTH" number )? ( ( ( "DISPLAY" | "MEMORY" ) )? "OFFSET" number )? ( "LINE" number )? ( "AREA" identifier )? | "LINE" number ( "VALUE" string1 )? ( "LENGTH" number )? ( ( ( "DISPLAY" | "MEMORY" ) )? "OFFSET" number )? ) | "DATASET" identifier ( "POSITION" number )? ( "ATTRIBUTES" identifier )? | "LOCALE" "LANGUAGE" identifier "COUNTRY" string1 "MODIFIER" string1 | "PARAMETER" "ID" ( identifier | string1 ) "FIELD" identifier | "PF-STATUS" string1 ( "PROGRAM" identifier )? ( "EXCLUDING" identifier )? | "PROPERTY" "OF" identifier identifier "=" identifier ( "NO" "FLUSH" )? ( "QUEUE-ONLY" )? ( "EXPORTING" Exps )? | "REFERENCE" "OF" identifier "INTO" identifier | "RUN" "TIME" "FIELD" identifier | "TIME" ( ( "FIELD" identifier )? | "STAMP" "FIELD" identifier ) ) "." 
stHIDE ::= "HIDE" identifier "." 
stIMPORT ::= "IMPORT" ( ( Exps | "(" identifier ")" | identifier "TO" identifier ( identifier "TO" identifier )* ) "FROM" ( "DATA" "BUFFER" identifier | "INTERNAL" "TABLE" identifier | "MEMORY" "ID" identifier | ( "DATABASE" identifier "(" identifier ")" ( "TO" identifier )? ( "CLIENT" identifier )? "ID" identifier | "MAJOR-ID" identifier ( "MINOR-ID" identifier )? ) | "SHARED" ( "BUFFER" | "MEMORY" ) identifier "(" identifier ")" ( "TO" identifier )? ( "CLIENT" identifier )? "ID" identifier ) ( ( ( ( "ACCEPTING" "PADDING" )? ( "ACCEPTING" "TRUNCATION" )? | ( "IGNORING" "STRUCTURE" "BOUNDARIES" )? ) ( "IGNORING" "CONVERSION" "ERRORS" ( "REPLACEMENT" "CHARACTER" identifier )? )? | ( "IN" "CHAR-TO-HEX" "MODE" )? ) )? ( "CODE" "PAGE" "INTO" identifier )? ( "ENDIAN" "INTO" identifier )? | "DIRECTORY" "INTO" identifier "FROM" "DATABASE" identifier "(" identifier ")" ( "TO" identifier )? ( "CLIENT" identifier )? "ID" identifier ) "." 
stINCLUDE ::= "INCLUDE" ( ( "TYPE" identifier | "STRUCTURE" identifier ) ( "AS" identifier ( "RENAMING" "WITH" "SUFFIX" string1 )? )? | identifier ( "IF" "FOUND" )? ) "." 
stINFOTYPES ::= "INFOTYPES" identifier ( identifier identifier )? ( "OCCURS" number )? ( "MODE" identifier )? ( "VALID" "FROM" Expression "TO" Expression )? ( "AS" "PERSON" "TABLE" )? "." 
stINITIALIZATION ::= "INITIALIZATION" "." 
stINPUT ::= "INPUT" "." 
stINSERT ::= "INSERT" ( ( ( "INITIAL" "LINE" | Expression "OF" identifier ( "FROM" identifier )? ( "TO" identifier )? ( "USING" "KEY" Name )? | identifier ) )? ( ( "INTO" )? ( "(" Expression ")" | ( "TABLE" )? identifier ( "INDEX" identifier )? ) ( ( "USING" "CLIENT" identifier | "CLIENT" "SPECIFIED" ) )? ( "CONNECTION" ( "(" Expression ")" | identifier ) )? ( "VALUES" identifier )? ( ( "ASSIGNING" identifier ( "CASTING" )? | "REFERENCE" "INTO" identifier ) )? ( "FROM" ( identifier | "TABLE" identifier ( "ACCEPTING" "DUPLICATE" "KEYS" )? | stSELECT ) )? )* | "REPORT" identifier "FROM" identifier ( "MAXIMUM" "WIDTH" "INTO" identifier )? ( ( "KEEPING" "DIRECTORY" "ENTRY" )? | ( "PROGRAM" "TYPE" identifier )? ( "FIXED-POINT" "ARITHMETIC" identifier )? ( ( "VERSION" | "UNICODE" "ENABLING" identifier ) )? | ( "DIRECTORY" "ENTRY" string1 )? ) | "TEXTPOOL" identifier "FROM" identifier "LANGUAGE" identifier ) "." 
stINTERFACE_POOL ::= "INTERFACE-POOL" "." 
stINTERFACES ::= "INTERFACES" identifier ( "PARTIALLY" "IMPLEMENTED" )? ( ( "ABSTRACT" "METHODS" identifier )? ( "FINAL" "METHODS" identifier )? | ( "ALL" "METHODS" ( "ABSTRACT" | "FINAL" ) )? ) ( "DATA" "VALUES" Exps )? "." 
stLEAVE ::= "LEAVE" ( "LIST-PROCESSING" | "PROGRAM" | "SCREEN" | "TO" ( "TRANSACTION" identifier | "CURRENT" "TRANSACTION" | "LIST-PROCESSING" ( "AND" "RETURN" "TO" "SCREEN" identifier )? | "SCREEN" identifier ) ( "AND" "SKIP" "FIRST" "SCREEN" )? ) "." 
stLOAD_OF_PROGRAM ::= "LOAD-OF-PROGRAM" "." 
stLOCAL ::= "LOCAL" identifier "." 
stLOG_POINT ::= "LOG-POINT" "ID" identifier ( "SUBKEY" identifier )? ( "FIELDS" identifier )? "." 
stMAXIMUM ::= "MAXIMUM" identifier "." 
stMINIMUM ::= "MINIMUM" identifier "." 
stMODULE ::= "MODULE" string1 ( "OUTPUT" | ( "INPUT" )? ) "." Statements "ENDMODULE" "." 
stMULTIPLY ::= "MULTIPLY" identifier "BY" identifier "." 
stMULTIPLY_CORRESPONDING ::= "MULTIPLY-CORRESPONDING" identifier "BY" identifier "." 
stNEW_LINE ::= "NEW-LINE" ( ( "NO-SCROLLING" | "SCROLLING" ) )? "." 
stNEW_PAGE ::= "NEW-PAGE" ( ( "WITH-TITLE" | "NO-TITLE" ) )? ( ( "WITH-HEADING" | "NO-HEADING" ) )? ( "LINE-COUNT" number )? ( "LINE-SIZE" number )? ( "NO-TOPOFPAGE" )? ( ( "PRINT" "ON" ( "NEW-SECTION" )? "PARAMETERS" identifier ( "ARCHIVE" "PARAMETERS" identifier )? "NO" "DIALOG" | "PRINT" "OFF" ) )? "." 
stNEW_SECTION ::= "NEW-SECTION" "." 
stNODES ::= "NODES" identifier ( "TYPE" identifier )? "." 
stOVERLAY ::= "OVERLAY" string1 "WITH" string1 ( "ONLY" string1 )? "." 
stPACK ::= "PACK" identifier "TO" identifier "." 
stPARAMETERS ::= "PARAMETERS" identifier ( ( "(" number ")" | identifier number ) )? ( ( "TYPE" identifier ( "DECIMALS" number )? | "LIKE" ( "(" )? identifier ( ")" )? ) )? ( ( ( ( "OBLIGATORY" | "NO-DISPLAY" ) )? ( "VISIBLE" identifier number )? | "AS" ( "CHECKBOX" ( "USER-COMMAND" identifier )? | "LISTBOX" "VISIBLE" identifier number ( "USER-COMMAND" identifier )? ( "OBLIGATORY" )? ) | "RADIOBUTTON" "GROUP" identifier ( "USER-COMMAND" identifier )? ) )? ( ( "MODIF" "ID" identifier )? ( "LOWER" "CASE" )? ( "DEFAULT" Expression )? ( "MATCHCODE" "OBJECT" identifier )? ( "MEMORY" "ID" identifier )? ( "VALUE" "CHECK" )? )* ( "FOR" ( "TABLE" | "NODE" ) identifier ( "HELP-REQUEST" )? ( "VALUE-REQUEST" )? ( "AS" "SEARCH" "PATTERN" )? )? "." 
stPERFORM ::= "PERFORM" ( ( Expression ( "IN" "PROGRAM" ( Name )? ( "IF" "FOUND" )? | ( "IF" "FOUND" )? ) | number "OF" identifier ( identifier )* | identifier ) ( "TABLES" identifier ( identifier )* )? ( "USING" Expression ( Expression )* )? ( "CHANGING" Expression ( Expression )* )? | "ON" ( "COMMIT" ( "LEVEL" identifier )? | "ROLLBACK" ) ) "." 
stPOSITION ::= "POSITION" number "." 
stPRINT_CONTROL ::= "PRINT-CONTROL" "INDEX-LINE" number "." 
stPROGRAM ::= "PROGRAM" identifier ( "NO" "STANDARD" "PAGE" "HEADING" )? ( "LINE-SIZE" number )? ( "LINE-COUNT" number ( "(" number ")" )? )? ( "MESSAGE-ID" identifier )? ( "REDUCED" "FUNCTIONALITY" )? "." 
stRANGES ::= "RANGES" identifier "FOR" identifier ( "OCCURS" number )? "." 
stRECEIVE ::= "RECEIVE" "RESULTS" "FROM" "FUNCTION" identifier ( "KEEPING" "TASK" )? ( "IMPORTING" Exps )? ( "TABLES" Exps )? ( "EXCEPTIONS" ( Expression )* ( identifier "=" identifier ( "MESSAGE" string1 )? )? ( identifier "=" identifier ( "MESSAGE" string1 )? )? ( "OTHERS" "=" identifier )? )? "." 
stREFRESH ::= "REFRESH" ( "CONTROL" identifier "FROM" "SCREEN" identifier | Expression ( "FROM" "TABLE" identifier )? ) "." 
stREJECT ::= "REJECT" "[" identifier "]" "." 
stREPLACE ::= "REPLACE" ( ( ( ( ( "FIRST" "OCCURRENCE" | "ALL" "OCCURRENCES" "OF" ) )? ( "SUBSTRING" )? string1 | "REGEX" string1 "IN" ( ( "SECTION" ( "OFFSET" number )? ( identifier number )? "OF" )? identifier | "TABLE" identifier ( "FROM" number ( "OFFSET" number )? )? ( "TO" number ( "OFFSET" number )? )? ) "WITH" identifier ( "IN" ( "CHARACTER" | "BYTE" ) "MODE" )? ( ( "RESPECTING" | "IGNORING" ) "CASE" )? ( "REPLACEMENT" "COUNT" number )? ( ( "REPLACEMENT" "OFFSET" number )? ( "REPLACEMENT" identifier number )? ( "REPLACEMENT" "LINE" number )? | ( "RESULTS" identifier )? ) ) | "SECTION" ( "OFFSET" number )? ( identifier number )? "OF" identifier "WITH" identifier ( "IN" ( "CHARACTER" | "BYTE" ) "MODE" )? ) | string1 "WITH" identifier "INTO" identifier ( "IN" ( "BYTE" | "CHARACTER" ) "MODE" )? ( identifier number )? ) "." 
stRESERVE ::= "RESERVE" number Expression "." 
stRESUME ::= "RESUME" "." 
stRETRY ::= "RETRY" "." 
stRETURN ::= "RETURN" "." 
stROLLBACK ::= "ROLLBACK" ( "WORK" | "CONNECTION" identifier ) "." 
stSCROLL ::= "SCROLL" "LIST" ( ( "TO" "COLUMN" string1 | ( "LEFT" | "RIGHT" ) ( "BY" number "PLACES" )? ) )? ( ( "TO" ( "FIRST" "PAGE" | "LAST" "PAGE" | "PAGE" number ) ( "LINE" number )? | ( "FORWARD" | "BACKWARD" ) ( number "PAGES" )? ) )? ( "INDEX" identifier )? "." 
stSELECT_OPTIONS ::= "SELECT-OPTIONS" identifier "FOR" Name ( ( "OBLIGATORY" | "NO-DISPLAY" ) )? ( "VISIBLE" identifier number )? ( "NO-EXTENSION" )? ( "NO" "INTERVALS" )? ( "MODIF" "ID" identifier )? ( "DEFAULT" string1 ( "TO" identifier )? ( "OPTION" Expression )? ( identifier identifier )? )? ( "LOWER" "CASE" )? ( "MATCHCODE" "OBJECT" identifier )? ( "MEMORY" "ID" identifier )? ( "NO" "DATABASE" "SELECTION" )? ( "HELP-REQUEST" ( "FOR" ( "LOW" | "HIGH" ) )? )? ( "VALUE-REQUEST" ( "FOR" ( "LOW" | "HIGH" ) )? )? "." 
stSELECTION_SCREEN ::= "SELECTION-SCREEN" "TAB" number identifier "USER-COMMAND" identifier ( "DEFAULT" ( "PROGRAM" identifier )? "SCREEN" identifier )? ( "MODIF" "ID" identifier )? ( "FOR" ( "TABLE" | "NODE" ) identifier ( "ID" identifier )? )? "." 
stSET ::= "SET" ( "ASSOCIATION" identifier "=" identifier | "LIKE" identifier | "INITIAL" | "BIT" number "OF" string1 ( "TO" identifier )? | "BLANK" Expression ( "ON" | "OFF" ) | "COUNTRY" string1 | "CURSOR" ( "FIELD" identifier ( "LINE" number )? ( ( ( "DISPLAY" | "MEMORY" ) )? "OFFSET" identifier )? | "LINE" number ( ( ( "DISPLAY" | "MEMORY" ) )? "OFFSET" identifier )? | string1 number ) | "DATASET" identifier ( "POSITION" ( number | "END" "OF" "FILE" ) )? ( "ATTRIBUTES" identifier )? | "EXTENDED" "CHECK" ( "ON" | "OFF" ) | "HANDLER" identifier ( ( "FOR" identifier | "ALL" "INSTANCES" ) )? ( "ACTIVATION" identifier )? | "HOLD" "DATA" ( "ON" | "OFF" ) | "LANGUAGE" identifier | "LEFT" "SCROLL-BOUNDARY" ( "COLUMN" Expression )? | "LOCALE" "LANGUAGE" identifier ( "COUNTRY" string1 )? ( "MODIFIER" string1 )? | "MARGIN" number ( number )? | "PARAMETER" "ID" identifier "FIELD" identifier | "PF-STATUS" string1 ( "OF" "PROGRAM" identifier )? ( "EXCLUDING" identifier )? ( "IMMEDIATELY" )? | "PROPERTY" "OF" identifier identifier "=" identifier ( "NO" "FLUSH" )? ( "EXPORTING" Exps )? | "RUN" "TIME" ( "ANALYZER" ( "ON" | "OFF" ) | "CLOCK" "RESOLUTION" ( "HIGH" | "LOW" ) ) | "SCREEN" identifier | "TITLEBAR" string1 ( "OF" "PROGRAM" identifier )? ( "WITH" string1 string1 )? | "UPDATE" "TASK" "LOCAL" | "USER-COMMAND" identifier ) "." 
stSHIFT ::= "SHIFT" identifier ( ( ( ( "BY" number "PLACES" | "UP" "TO" string1 ) )? ( ( "LEFT" | "RIGHT" ) )? ( "CIRCULAR" )? | ( "LEFT" "DELETING" "LEADING" | "RIGHT" "DELETING" "TRAILING" string1 ) ) )? ( "IN" ( "CHARACTER" | "BYTE" ) "MODE" )? "." 
stSKIP ::= "SKIP" ( ( number )? | "TO" "LINE" number ) "." 
stSTOP ::= "STOP" "." 
stSUBTRACT ::= "SUBTRACT" identifier "FROM" identifier "." 
stSUBTRACT_CORRESPONDING ::= "SUBTRACT-CORRESPONDING" identifier "FROM" identifier "." 
stSUM ::= "SUM" "." 
stSUMMARY ::= "SUMMARY" "." 
stSUMMING ::= "SUMMING" identifier "." 
stSUPPLY ::= "SUPPLY" Exps "TO" "CONTEXT" identifier "." 
stSUPPRESS ::= "SUPPRESS" "DIALOG" "." 
stSYNTAX_CHECK ::= "SYNTAX-CHECK" "FOR" identifier "MESSAGE" string1 "LINE" number identifier string1 ( "PROGRAM" identifier )? ( "DIRECTORY" "ENTRY" string1 )? ( "WITH" "CURRENT" "SWITCHSTATES" )? ( "INCLUDE" string1 )? ( "OFFSET" number )? ( "MESSAGE-ID" identifier )? "." 
stTEST_INJECTION ::= "TEST-INJECTION" identifier "." ( Statements )? "END-TEST-INJECTION" "." 
stTEST_SEAM ::= "TEST-SEAM" identifier "." ( Statements )? "END-TEST-SEAM" "." 
stTOP_OF_PAGE ::= "TOP-OF-PAGE" ( "DURING" "LINE-SELECTION" )? "." 
stTRANSFER ::= "TRANSFER" identifier "TO" identifier ( identifier number )? ( "NO" "END" "OF" "LINE" )? "." 
stTRANSLATE ::= ( "TRANSLATE" identifier "TO" ( "UPPER" | "LOWER" ) "CASE" | "USING" string1 "." ) 
stTRUNCATE ::= ( "TRUNCATE" "DATASET" identifier "AT" "CURRENT" "POSITION" | "POSITION" number "." ) 
stTYPE_POOLS ::= "TYPE-POOLS" identifier "." 
stULINE ::= "ULINE" ( "AT" )? ( "/" )? ( number )? ( "(" number ")" )? ( "NO-GAP" )? "." 
stUNASSIGN ::= "UNASSIGN" Var "." 
stUNPACK ::= "UNPACK" identifier "TO" identifier "." 
stUPDATE ::= "UPDATE" Expression ( ( "USING" "CLIENT" identifier | "CLIENT" "SPECIFIED" ) )? ( "CONNECTION" Expression )? ( "SET" identifier "=" Expression ( "," identifier "=" Expression )* ( "WHERE" LogExp )? | ( "FROM" identifier | "TABLE" identifier ) ) "." 
stWAIT ::= ( "WAIT" "UP" "TO" number "SECONDS" | "FOR" ( "ASYNCHRONOUS" "TASKS" "UNTIL" Expression ( "UP" "TO" number "SECONDS" )? )? ( "MESSAGING" "CHANNELS" "UNTIL" Expression ( "UP" "TO" number "SECONDS" )? )? ( "PUSH" "CHANNELS" "UNTIL" Expression ( "UP" "TO" number "SECONDS" )? )? "." ) 
stWINDOW ::= "WINDOW" "STARTING" "AT" string1 number ( "ENDING" "AT" string1 number )? "." 
stSELECT ::= "SELECT" ( "SINGLE" ( "FOR" "UPDATE" )? )? ( sqlFields sqlFrom | sqlFrom sqlFields ) ( ( ( "FOR" "ALL" "ENTRIES" "IN" identifier )? ( "WHERE" SQLCondition )? )? ( ( "GROUP" "BY" ( identifier | Expression ) ( ( "," identifier | Expression ) )* | "(" identifier ")" ) )? ( "HAVING" SQLCondition )? ( "UNION" ( "ALL" | "DISTINCT" ) stSELECT )? ( sqlOrderBy )? ( sqlInto )? ( "EXTENDED" "RESULT" "@" identifier )? ( "CREATING" ( ( "READER" | "LOCATOR" ) "FOR" ( "COLUMNS" identifier ( identifier )* | "ALL" ( "OTHER" )? ( ( "BLOB" | "CLOB" ) )? "COLUMNS" ) | "(" identifier ")" ) )? ( "OFFSET" Expression )? ( "UP" "TO" Expression "ROWS" )? ( "BYPASSING" "BUFFER" )? ( "CONNECTION" Expression )? )* "." ( Statement )* ( "ENDSELECT" "." )? 
stENDSELECT ::= "ENDSELECT" "." 
sqlFields ::= ( "FIELDS" )? ( "DISTINCT" )? ( ( "*" | sqlColumn ( "," sqlColumn )* | "(" identifier ")" ) )* 
sqlColumn ::= ( identifier ( "~*" ( "," identifier "~*" )* )? | "aggregate" "(" ( "DISTINCT" )? identifier ")" | Expression ) ( "AS" identifier )? 
sqlFrom ::= "FROM" ( identifier ( "AS" identifier )? | ( "(" )? ( identifier ( "AS" identifier )? | sqlJoin ) ( ")" )? | "(" identifier ")" ( "AS" identifier )? ) ( ( "USING" "CLIENT" identifier | "CLIENT" "SPECIFIED" ( identifier "~" identifier ( "," identifier "~" identifier )* )? ) )? 
sqlJoin ::= ( ( "INNER" )? | ( "LEFT" | "RIGHT" ) ( "OUTER" )? | "CROSS" ) "JOIN" identifier ( "AS" identifier )? ( "ON" Expression )? 
sqlOrderBy ::= "ORDER" "BY" ( "PRIMARY" "KEY" | identifier ( ( "ASCENDING" | "DESCENDING" ) )? ( "," identifier ( ( "ASCENDING" | "DESCENDING" ) )? )* | "(" identifier ")" ) 
sqlInto ::= ( "INTO" | "APPENDING" ) ( ( ( "CORRESPONDING" "FIELDS" "OF" )? ( "TABLE" )? identifier ( "PACKAGE" "SIZE" Expression )? | "(" identifier ( "," identifier )* ")" ) | "@DATA" "(" identifier ")" | "TABLE" "@DATA" "(" identifier ")" ( "PACKAGE" "SIZE" Expression )? ) 
SQLCondition ::= LogExp 
Withline ::= "+" identifier ( identifier ( "," identifier )* )? "AS" identifier ( "," "+" identifier ( identifier ( "," identifier )* )? "AS" identifier )* stSELECT "." 
GroupBy ::= "GROUP" "BY" ( Expression ( Expression )* ( identifier "=" "GROUP" "SIZE" )? ( identifier "=" "GROUP" "INDEX" )? | identifier ) ( ( "ASCENDING" | "DESCENDING" ) ( "AS" "TEXT" )? )? ( "WITHOUT" "MEMBERS" )? ( ( "INTO" identifier | "ASSIGNING" identifier | "REFERENCE" "INTO" identifier ) )? 
LogExp ::= LogLogANDExp ( ( "||" | "OR" | "EQUIV" ) LogLogANDExp )* 
TypeDes ::= "TYPE" ( ( "LINE" "OF" )? TypeName ( ( "LENGTH" Expression )? ( "DECIMALS" number )? | ( "READER" | "LOCATOR" | "LOB" "HANDLE" ) | "FOR" "COLUMNS" identifier ( identifier )* ) ( "BOXED" )? | "REF" "TO" ( Expression | "DATA" ) | ( ( "STANDARD" | "SORTED" | "HASHED" ) )? "TABLE" "OF" ( "REF" "TO" )? TypeName ( "WITH" ( "EMPTY" "KEY" | "HEADER" "LINE" | ( ( "UNIQUE" | "NON-UNIQUE" ) )? ( ( "HASHED" | "SORTED" ) )? ( "KEY" ( "PRIMARY_KEY" ( "ALIAS" Name )? "COMPONENTS" )? Name ( Name )* | "DEFAULT" "KEY" ) ) )* ( "INITIAL" "SIZE" number )? | "RANGE" "OF" Type ( "INITIAL" "SIZE" number )? ( "WITH" "HEADER" "LINE" )? | "ALL" ( "OTHER" )? ( ( "BLOB" | "CLOB" ) )? "COLUMNS" ) 
LikeDes ::= "LIKE" ( ( "LINE" "OF" )? TypeName | "REF" "TO" TypeName | ( ( "STANDARD" | "SORTED" | "HASHED" ) )? "TABLE" "OF" ( "REF" "TO" )? TypeName ( ( "WITH" ( ( "UNIQUE" | "NON-UNIQUE" ) )? ( ( "KEY" ( "PRIMARY_KEY" ( "ALIAS" Name )? "COMPONENTS" )? Name ( Name )* | "DEFAULT" "KEY" ) )* | "WITH" "EMPTY" "KEY" ) )? ( ( "WITH" ( "UNIQUE" "HASHED" )* | ( ( ( "UNIQUE" | "NON-UNIQUE" ) )* "SORTED" )* "KEY" identifier "COMPONENTS" ( identifier )* ) )* ( "INITIAL" "SIZE" number )? ( "WITH" "HEADER" "LINE" )? | "RANGE" "OF" Type ( "INITIAL" "SIZE" number )? ( "WITH" "HEADER" "LINE" )? ) 
Format_options ::= ( ( "COLOR" ( ( ( "=" )? ( "COL_BACKGROUND" "COL_HEADING" | "COL_NORMAL" | "COL_TOTAL" | "COL_KEY" | "COL_POSITIVE" | "COL_NEGATIVE" | "COL_GROUP" | number ) ( "ON" )? | "OFF" ) | "=" string1 ) )? ( "INTENSIFIED" ( ( ( "ON" | "OFF" ) | "=" Expression ) )? )? ( "INVERSE" ( ( ( "ON" | "OFF" ) | "=" Expression ) )? )? ( "HOTSPOT" ( ( ( "ON" | "OFF" ) | "=" Expression ) )? )? ( "INPUT" ( ( ( "ON" | "OFF" ) | "=" Expression ) )? )? ( "FRAMES" ( ( ( "ON" | "OFF" ) | "=" Expression ) )? )? ( "RESET" )? )* 
Statements ::= Statement ( Statement )* 
AUTHORITY_CHECK_ITEM ::= "ID" identifier ( "FIELD" Expression | "DUMMY" ) 
VARYING ::= "VARYING" identifier "FROM" identifier "NEXT" identifier ( "RANGE" Expression )? 
Event_exp_item ::= "VALUE" Expression Typing ( ( "OPTIONAL" | "DEFAULT" Expression ) )? 
Typing ::= ( "TYPE" ( ( ( "LINE" "OF" | "REF" "TO" ) )? ( "DATA" | Expression ) | ( "ANY" | "INDEX" | "STANDARD" ) ( "TABLE" )? ) | "LIKE" ( ( ( "LINE" "OF" )? | "REF" "TO" ) )? Expression ) 
Event_options ::= "EXPORTING" Event_exp_item ( Event_exp_item )* 
ProvideFields ::= "FIELDS" ( "*" | identifier ( identifier )* ) "FROM" identifier "INTO" identifier "VALID" identifier "BOUNDS" number "AND" number ( "WHERE" LogExp )? 
Association ::= "ASSOCIATION" identifier "TO" identifier "ON" identifier "=" identifier ( "AND" identifier "=" identifier )* ( "USING" "KEY" identifier )? 
Types_mesh_stmt ::= "TYPES" NameInVarDef ( "TYPE" ( "REF" "TO" )? identifier | "LIKE" ( "REF" "TO" )? identifier ) ( Association )* "." 
CallFunction ::= ( "FUNCTION" ( Name | string1 ) ( ( ( "IN" "UPDATE" "TASK" )* | ( ( ( ( "STARTING" "NEW" "TASK" identifier )* | ( "IN" "BACKGROUND" "TASK" ( "AS" "SEPARATE" "UNIT" )? )* ) )? ( "DESTINATION" identifier )? )* | ( "IN" "BACKGROUND" "UNIT" )* ) )? ( ( ( "CALLING" identifier )* | ( "PERFORMING" identifier )* "ON" "END" "OF" "TASK" ) )? ( ( "EXPORTING" ( identifier "=" Expression )* )? ( "IMPORTING" ( identifier "=" Expression )* )? ( "TABLES" ( identifier "=" identifier )* )? ( "CHANGING" ( identifier "=" Expression )* )? ( "EXCEPTIONS" ( identifier "=" Expression )* ( "error_message" "=" string1 )? ( "system_failure" "=" string1 ( "MESSAGE" string1 )? )? ( "communication_failure" "=" string1 ( "MESSAGE" string1 )? )? ( "resource_failure" "=" string1 )? ( "OTHERS" "=" string1 )? )? )* | ( ( "PARAMETER-TABLE" identifier )? ( "EXCEPTION-TABLE" identifier )? )* "." ) 
CallBadi ::= ( "BADI" identifier "->" "(" identifier ")" ( "EXPORTING" Expression ( Expression )* )? ( "IMPORTING" Expression ( Expression )* )? ( "CHANGING" Expression ( Expression )* )? ( "RECEIVING" Expression )? ( "EXCEPTIONS" ( Expression )* ( "OTHERS" "=" Expression )? )? | ( "PARAMETER-TABLE" identifier )? ( "EXCEPTION-TABLE" identifier )? ) "." 
CallDialog ::= "DIALOG" identifier ( ( "AND" "SKIP" "FIRST" "SCREEN" | "USING" identifier ( "MODE" identifier )? ) )? ( "EXPORTING" identifier "FROM" identifier ( identifier "FROM" identifier )* )? ( "IMPORTING" identifier "TO" identifier ( identifier "TO" identifier )* )? 
CallCustomerFunction ::= "CUSTOMER-FUNCTION" identifier ( "EXPORTING" Expression ( Expression )* )? ( "IMPORTING" Expression ( Expression )* )? ( "CHANGING" Expression ( Expression )* )? ( "TABLES" Expression ( Expression )* )? ( "EXCEPTIONS" ( Expression )* ( string1 "=" identifier )? ( "OTHERS" "=" Expression )? )? 
CallDatabaseProcedure ::= "DATABASE" "PROCEDURE" "(" identifier ")" ( "CONNECTION" ( "(" Expression ")" | identifier ) )? ( ( "EXPORTING" ( Expression )* )? ( "IMPORTING" ( Expression )* )? | ( "PARAMETER-TABLE" identifier )? ) 
CallMethod ::= "METHOD" ( MethodName ( "=>" MethodName )* | "OF" identifier identifier ( "=" identifier )? ) ( ( "PARAMETER-TABLE" Name )? ( "EXCEPTION-TABLE" Name )? ( "EXPORTING" ( Name "=" Expression )* )? ( "IMPORTING" ( Name "=" Expression )* )? ( "CHANGING" ( Name "=" Expression )* )? ( "RECEIVING" Expression )? ( "NO" "FLUSH" )? ( "QUEUE-ONLY" )? )* 
CallScreen ::= "SCREEN" identifier ( "STARTING" "AT" string1 number ( "ENDING" "AT" string1 number )? )? 
CallSelectionScreen ::= "SELECTION-SCREEN" identifier ( "STARTING" "AT" string1 number ( "ENDING" "AT" string1 number )? )? ( "USING" "SELECTION-SET" identifier )? 
CallTransation ::= ( "TRANSACTION" identifier "WITH" | "WITHOUT" "AUTHORITY-CHECK" ( ( "AND" "SKIP" "FIRST" "SCREEN" )? | ( "USING" identifier ( ( "MODE" string1 )? ( "UPDATE" identifier )? | ( "OPTIONS" "FROM" identifier )? ) ( "MESSAGES" "INTO" identifier )? )? ) ) 
CallTransformation ::= ( "TRANSFORMATION" Name ( "PARAMETERS" ( ( Expression )* | "(" identifier ")" ) )? ( "OBJECTS" ( ( Expression )* | "(" identifier ")" ) )? ( "OPTIONS" ( Expression )* )? "SOURCE" "XML" identifier | ( ( Expression )* | "(" identifier ")" ) "RESULT" "XML" identifier | ( ( Expression )* | "(" identifier ")" ) ( "AREA" "HANDLE" identifier )? ) 
MethodName ::= ( ( string1 | identifier ) | "(" ( string1 | identifier ) ")" ) 
ShiftExp ::= AddExp ( ( "<<" | ">>" ) AddExp )* 
Conditional ::= LogORExp 
AssignmentOperator ::= ( "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "&=" | "^=" | "<<=" | ">>=" | "?=" ) 
LogORExp ::= LogANDExp ( ( "||" | "OR" | "EQUIV" ) LogANDExp )* 
LogANDExp ::= LogNOTExp ( ( "&&" | "AND" ) LogNOTExp )* 
LogNOTExp ::= ( "NOT" )? InclORExp 
InclORExp ::= ExclORExp ( "|" ExclORExp )* 
ExclORExp ::= ANDExp ( "^" ANDExp )* 
ANDExp ::= EqualExp ( "&" EqualExp )* 
EqualExp ::= RelationExp ( ( ( "EQ" | "<>" | "NE" | "LIKE" ) RelationExp )* | ( "NOT" )? "BETWEEN" RelationExp "AND" RelationExp | "IS" ( "NOT" )? PredefinedConstant ) 
RelationExp ::= ShiftExp ( ( "IN" | "<" | "LT" | ">" | "GT" | "<=" | "LE" | ">=" | "GE" | "CO" | "CN" | "CA" | "NA" | "CS" | "NS" | "CP" | "NP" | "BYTE-CO" | "BYTE-CN" | "BYTE-CA" | "BYTE-NA" | "BYTE-CS" | "BYTE-NS" ) ShiftExp )* 
PredefinedConstant ::= ( "INITIAL" | "BOUND" | "ASSIGNED" | "SUPPLIED" | "REQUESTED" ) 
AddExp ::= MultExp ( ( "+" | "-" | "&&" ) MultExp )* 
MultExp ::= CastExp ( ( "*" | "/" | "DIV" | "%" | "MOD" | "**" ) CastExp )* 
CastExp ::= UnaryExp 
UnaryExp ::= ( PostFixExp | UnaryOperator CastExp ) 
PostFixExp ::= Primary PostFix 
UnaryOperator ::= ( "+" | "-" | "*" | "!" | "&" | "~" | "NOT" | "INSTANCE" "OF" | "IN" ) 
PostFix ::= ( ( "[" ( Expression )? "]" | ( "#" )? FunctionCall | "->" identifier | "=>" identifier ) )* 
FunctionCall ::= "(" ( ( ( "EXPORTING" ( identifier "=" Expression )* )? ( "IMPORTING" ( identifier "=" Expression )* )? ( "CHANGING" ( identifier "=" Expression )* )? ( "RECEIVING" ( identifier "=" Expression )* )? ( "EXCEPTIONS" ( identifier "=" Expression )* ( "OTHERS" "=" Expression )? )? )* | ( Expression )* ) ")" 
Primary ::= ( string1 ( string1 )* | regex1 | "NEW" Creator | char | number | "(" Expression ")" | PredefinedConstant | NameInPrimary ) 
Creator ::= identifier ( FunctionCall )? 
LogLogANDExp ::= LogLogNOTExp ( "AND" LogLogNOTExp )* 
LogLogNOTExp ::= ( "NOT" )? LogInclORExp 
LogInclORExp ::= LogExclORExp ( "|" LogExclORExp )* 
LogExclORExp ::= LogANDExp2 ( "^" LogANDExp2 )* 
LogANDExp2 ::= LogEqualExp ( "&" LogEqualExp )* 
LogEqualExp ::= LogRelationExp ( ( ( "=" | "EQ" | "<>" | "NE" | "LIKE" ) LogRelationExp )* | ( "NOT" )? "BETWEEN" LogRelationExp "AND" LogRelationExp | "IS" ( "NOT" )? PredefinedConstant ) 
LogRelationExp ::= LogShiftExp ( ( "IN" | "<" | "LT" | ">" | "GT" | "<=" | "LE" | ">=" | "GE" | "CO" | "CN" | "CA" | "NA" | "CS" | "NS" | "CP" | "NP" | "BYTE-CO" | "BYTE-CN" | "BYTE-CA" | "BYTE-NA" | "BYTE-CS" | "BYTE-NS" ) LogShiftExp )* 
LogShiftExp ::= LogAddExp ( ( "<<" | ">>" ) LogAddExp )* 
LogAddExp ::= LogMultExp ( ( "+" | "-" | "&&" ) LogMultExp )* 
LogMultExp ::= LogCastExp ( ( "*" | "/" | "DIV" | "%" | "MOD" | "**" ) LogCastExp )* 
LogCastExp ::= LogUnaryExp 
LogUnaryExp ::= ( LogPostFixExp | UnaryOperator LogCastExp ) 
LogPostFixExp ::= LogPrimary PostFix 
LogPrimary ::= ( string1 ( string1 )* | regex1 | char | number | "(" LogExp ")" | PredefinedConstant | NameInPrimary ) 

//
// tokens
//

Colon ::= ":"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant