/* * Copyright (c) 2021-2025 Symas Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of the Symas Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ %code requires { #include // Before cobol-system because it uses poisoned functions #include "cobol-system.h" #include "coretypes.h" #include "../../libgcobol/io.h" #include "../../libgcobol/ec.h" #include "tree.h" #pragma GCC diagnostic ignored "-Wmissing-field-initializers" enum radix_t { decimal_e = 10, hexadecimal_e = 16, boolean_e = 2, }; enum accept_func_t { accept_done_e, accept_command_line_e, accept_envar_e, }; class literal_t { size_t isym; public: char prefix[3]; size_t len; char *data; bool empty() const { return data == NULL; } size_t isymbol() const { return isym; } const char * symbol_name() const { return isym? cbl_field_of(symbol_at(isym))->name : ""; } literal_t& set( size_t len, char *data, const char prefix[] ) { set_prefix(prefix, strlen(prefix)); set_data(len, data); return *this; } literal_t& set( const cbl_field_t * field ) { assert(field->has_attr(constant_e)); assert(is_literal(field)); set_prefix( "", 0 ); set_data( field->data.capacity, const_cast(field->data.initial), field_index(field) ); return *this; } literal_t& set_data( size_t len, char *data, size_t isym = 0 ) { this->isym = isym; this->len = len; this->data = data; if( this->prefix[0] == 'Z' ) { this->data = new char[++this->len]; auto p = std::copy(data, data + len, this->data); *p = '\0'; } return *this; } literal_t& set_prefix( const char *input, size_t len ) { assert(len < sizeof(prefix)); std::fill(prefix, prefix + sizeof(prefix), '\0'); std::transform(input, input + len, prefix, toupper); return *this; } bool compatible_prefix( const literal_t& that ) const { if( prefix[0] != that.prefix[0] ) { return prefix[0] != 'N' && that.prefix[0] != 'N'; } return true; } }; struct acrc_t { // Abbreviated combined relation condition cbl_refer_t *term; relop_t op; bool invert; acrc_t& init( cbl_refer_t *term = NULL, relop_t op = relop_t(-1), bool invert = false ) { this->term = term; this->op = op; this->invert = invert; return *this; } static acrc_t make( cbl_refer_t *term = NULL, relop_t op = relop_t(-1), bool invert = false ) { acrc_t output; return output.init( term, op, invert ); } relop_t relop_from( relop_t ante_op ) const { assert(ante_op != -1); return op != -1? op : ante_op; } bool is_relation_condition() const { return term && term->field; } }; typedef std::list acrcs_t; enum data_category_t { data_category_none, data_category_all, data_alphabetic_e, data_alphanumeric_e, data_alphanumeric_edited_e, data_boolean_e, data_data_pointer_e, data_function_pointer_e, data_msg_tag_e, data_dbcs_e, data_egcs_e, data_national_e, data_national_edited_e, data_numeric_e, data_numeric_edited_e, data_object_referenc_e, data_program_pointer_e, }; const char * data_category_str( data_category_t category ); typedef std::map category_map_t; struct substitution_t { enum subst_fl_t { subst_all_e, subst_first_e = 'F', subst_last_e = 'L' }; bool anycase; subst_fl_t first_last; cbl_refer_t *orig, *replacement; substitution_t& init( bool anycase, char first_last, cbl_refer_t *orig, cbl_refer_t *replacement ) { this->anycase = anycase; switch(first_last) { case 'F': this->first_last = subst_first_e; break; case 'L': this->first_last = subst_last_e; break; default: this->first_last = subst_all_e; break; } this->orig = orig; this->replacement = replacement; return *this; } }; typedef std::list substitutions_t; struct init_statement_t { bool to_value; data_category_t category; category_map_t replacement; init_statement_t( category_map_t replacement ) : to_value(false) , category(data_category_none) , replacement(replacement) {} init_statement_t( bool to_value = false ) : to_value(to_value) , category(data_category_none) , replacement(category_map_t()) {} }; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-function" static data_category_t data_category_of( const cbl_refer_t& refer ); static REAL_VALUE_TYPE numstr2i( const char input[], radix_t radix ); struct cbl_field_t; static inline cbl_field_t * new_literal( const char initial[], enum radix_t radix ); #pragma GCC diagnostic pop enum select_clause_t { access_clause_e = 0x0001, alt_key_clause_e = 0x0002, assign_clause_e = 0x0004, collating_clause_e = 0x0008, file_status_clause_e = 0x0010, lock_mode_clause_e = 0x0020, organization_clause_e = 0x0040, padding_clause_e = 0x0080, record_delim_clause_e = 0x0100, record_key_clause_e = 0x0200, relative_key_clause_e = 0x0400, reserve_clause_e = 0x0800, sharing_clause_e = 0x1000, }; struct symbol_elem_t; struct symbol_elem_t * symbols_begin( size_t first ); struct symbol_elem_t * symbols_end(); void field_done(); template struct Elem_list_t { std::list elems; Elem_list_t() {} Elem_list_t( E elem ) { elems.push_back(elem); } Elem_list_t * push_back( E elem ) { elems.push_back(elem); return this; } void clear() { for( auto p = elems.begin(); p != elems.end(); p++ ) { assert( !(symbols_begin(0) <= *p && *p < symbols_end()) ); delete *p; } elems.clear(); } }; struct file_list_t; struct cbl_label_t; typedef struct Elem_list_t Label_list_t; struct cbl_file_key_t; typedef struct Elem_list_t key_list_t; struct cbl_declarative_t; typedef struct Elem_list_t declarative_list_t; typedef struct Elem_list_t ec_list_t; typedef struct Elem_list_t isym_list_t; struct rel_part_t; bool set_debug(bool); #include "../../libgcobol/ec.h" #include "../../libgcobol/common-defs.h" #include "inspect.h" } %{ #include // Before cobol-system because it uses poisoned functions #include "cobol-system.h" #include "coretypes.h" #include "tree.h" #undef cobol_dialect #undef cobol_exceptions #undef yy_flex_debug #include "cdfval.h" #include "../../libgcobol/ec.h" #include "../../libgcobol/common-defs.h" #include "util.h" #include "cbldiag.h" #include "symbols.h" #include "inspect.h" #include "../../libgcobol/io.h" #include "genapi.h" #include "../../libgcobol/exceptl.h" #include "exceptg.h" #include "parse_ante.h" %} %token IDENTIFICATION_DIV "IDENTIFICATION DIVISION" ENVIRONMENT_DIV "ENVIRONMENT DIVISION" PROCEDURE_DIV "PROCEDURE DIVISION" DATA_DIV "DATA DIVISION" FILE_SECT "FILE SECTION" INPUT_OUTPUT_SECT "INPUT-OUTPUT SECTION" LINKAGE_SECT "LINKAGE SECTION" LOCAL_STORAGE_SECT "LOCAL-STORAGE SECTION" WORKING_STORAGE_SECT "WORKING-STORAGE SECTION" %token OBJECT_COMPUTER "OBJECT COMPUTER" %token DISPLAY_OF "DISPLAY OF" END_FUNCTION "END FUNCTION" END_PROGRAM "END PROGRAM" END_SUBPROGRAM "END PROGRAM " %token JUSTIFIED RETURNING NO_CONDITION "invalid token" %token ALNUM ALPHED %token ERROR EXCEPTION SIZE_ERROR "SIZE ERROR" %token EXCEPTION_NAME "EXCEPTION NAME" %token LEVEL LEVEL66 "66" LEVEL78 "78" LEVEL88 "88" %token CLASS_NAME "class name" NAME NAME88 "Level 88 NAME" NUME "Name" NUMED "NUMERIC-EDITED picture" NUMED_CR "NUMERIC-EDITED CR picture" NUMED_DB "NUMERIC-EDITED DB picture" %token NINEDOT NINES NINEV PIC_P %token SPACES %token LITERAL %token END EOP %token FILENAME %token INVALID %token NUMBER NEGATIVE %token NUMSTR "numeric literal" %token OVERFLOW_kw "OVERFLOW" %token COMPUTATIONAL %token PERFORM BACKWARD %token POSITIVE %token POINTER %token SECTION %token STANDARD_ALPHABET "STANDARD ALPHABET" %token SWITCH %token UPSI %token ZERO /* environment names */ %token SYSIN SYSIPT SYSOUT SYSLIST SYSLST SYSPUNCH SYSPCH CONSOLE %token C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 CSP %token S01 S02 S03 S04 S05 AFP_5A "AFP 5A" %token STDIN STDOUT STDERR /* intrinsics */ %token LIST MAP NOLIST NOMAP NOSOURCE %token MIGHT_BE "IS or IS NOT" FUNCTION_UDF "UDF name" FUNCTION_UDF_0 "UDF" %token DATE_FMT "date format" TIME_FMT "time format" DATETIME_FMT "datetime format" /* tokens without semantic value */ /* CDF (COPY and >> defined here but used in cdf.y) */ %token BASIS CBL CONSTANT COPY DEFINED ENTER FEATURE INSERTT LSUB "(" PARAMETER_kw "PARAMETER" OVERRIDE READY RESET RSUB ")" SERVICE_RELOAD "SERVICE RELOAD" STAR_CBL "*CBL" SUBSCRIPT SUPPRESS TITLE TRACE USE COBOL_WORDS ">>COBOL-WORDS" EQUATE UNDEFINE CDF_DEFINE ">>DEFINE" CDF_DISPLAY ">>DISPLAY" CDF_IF ">>IF" CDF_ELSE ">>ELSE" CDF_END_IF ">>END-IF" CDF_EVALUATE ">>EVALUATE" CDF_WHEN ">>WHEN" CDF_END_EVALUATE ">>END-EVALUATE" CALL_COBOL "CALL" CALL_VERBATIM "CALL (as C)" IF THEN ELSE SENTENCE ACCEPT ADD ALTER CALL CANCEL CLOSE COMPUTE CONTINUE DELETE DISPLAY DIVIDE EVALUATE EXIT FILLER_kw "FILLER" GOBACK GOTO INITIALIZE INSPECT MERGE MOVE MULTIPLY OPEN PARAGRAPH READ RELEASE RETURN REWRITE SEARCH SET SELECT SORT SORT_MERGE "SORT-MERGE" STRING_kw "STRING" STOP SUBTRACT START UNSTRING WRITE WHEN ABS ACCESS ACOS ACTUAL ADVANCING AFTER ALL ALLOCATE ALPHABET ALPHABETIC ALPHABETIC_LOWER "ALPHABETIC-LOWER" ALPHABETIC_UPPER "ALPHABETIC-UPPER" ALPHANUMERIC ALPHANUMERIC_EDITED "ALPHANUMERIC-EDITED" ALSO ALTERNATE ANNUITY ANUM ANY ANYCASE APPLY ARE AREA AREAS AS ASCENDING ACTIVATING ASIN ASSIGN AT ATAN BASED BASECONVERT BEFORE BINARY BIT BIT_OF "BIT-OF" BIT_TO_CHAR "BIT-TO-CHAR" BLANK BLOCK_kw BOOLEAN_OF_INTEGER "BOOLEAN-OF-INTEGER" BOTTOM BY BYTE BYTE_LENGTH "BYTE-LENGTH" CF CH CHANGED CHAR CHAR_NATIONAL "CHAR-NATIONAL" CHARACTER CHARACTERS CHECKING CLASS COBOL CODE CODESET COLLATING COLUMN COMBINED_DATETIME "COMBINED-DATETIME" COMMA COMMAND_LINE "COMMAND-LINE" COMMAND_LINE_COUNT "COMMAND-LINE-COUNT" COMMIT COMMON CONCAT CONDITION CONFIGURATION_SECT "CONFIGURATION SECTION" CONTAINS CONTENT CONTROL CONTROLS CONVERT CONVERTING CORRESPONDING COS COUNT CURRENCY CURRENT CURRENT_DATE DATA DATE DATE_COMPILED DATE_OF_INTEGER "DATE-OF-INTEGER" DATE_TO_YYYYMMDD "DATE-TO-YYYYMMDD" DATE_WRITTEN "DATE-WRITTEN" DAY DAY_OF_INTEGER "DAY-OF-INTEGER" DAY_OF_WEEK "DAY-OF-WEEK" DAY_TO_YYYYDDD "DAY-TO-YYYYDDD" DBCS DE DEBUGGING DECIMAL_POINT DECLARATIVES DEFAULT DELIMITED DELIMITER DEPENDING DESCENDING DETAIL DIRECT DIRECT_ACCESS "DIRECT-ACCESS" DOWN DUPLICATES DYNAMIC E EBCDIC EC EGCS ENTRY ENVIRONMENT EQUAL EVERY EXAMINE EXHIBIT EXP EXP10 EXTEND EXTERNAL EXCEPTION_FILE "EXCEPTION-FILE" EXCEPTION_FILE_N "EXCEPTION-FILE-N" EXCEPTION_LOCATION "EXCEPTION-LOCATION" EXCEPTION_LOCATION_N "EXCEPTION-LOCATION-N" EXCEPTION_STATEMENT "EXCEPTION-STATEMENT" EXCEPTION_STATUS "EXCEPTION-STATUS" FACTORIAL FALSE_kw "False" FD FILE_CONTROL "FILE-CONTROL" FILE_KW "File" FILE_LIMIT "FILE-LIMIT" FINAL FINALLY FIND_STRING "FIND-STRING" FIRST FIXED FOOTING FOR FORMATTED_CURRENT_DATE "FORMATTED-CURRENT-DATE" FORMATTED_DATE "FORMATTED-DATE" FORMATTED_DATETIME "FORMATTED-DATETIME" FORMATTED_TIME "FORMATTED-TIME" FORM_OVERFLOW "FORM-OVERFLOW" FREE FRACTION_PART "FRACTION-PART" FROM FUNCTION GENERATE GIVING GLOBAL GO GROUP HEADING HEX HEX_OF "HEX-OF" HEX_TO_CHAR "HEX-TO-CHAR" HIGH_VALUES "HIGH-VALUES" HIGHEST_ALGEBRAIC "HIGHEST-ALGEBRAIC" HOLD IBM_360 IN INCLUDE INDEX INDEXED INDICATE INITIAL_kw "INITIAL" INITIATE INPUT INSTALLATION INTERFACE INTEGER INTEGER_OF_BOOLEAN "INTEGER-OF-BOOLEAN" INTEGER_OF_DATE "INTEGER-OF-DATE" INTEGER_OF_DAY "INTEGER-OF-DAY" INTEGER_OF_FORMATTED_DATE "INTEGER-OF-FORMATTED-DATE" INTEGER_PART "INTEGER-PART" INTO INTRINSIC INVOKE IO IO_CONTROL "IO-CONTROL" IS ISNT "IS NOT" KANJI KEY LABEL LAST LEADING LEFT LENGTH LENGTH_OF "LENGTH-OF" LIMIT LIMITS LINE LINES LINE_COUNTER "LINE-COUNTER" LINAGE LINKAGE LOCALE LOCALE_COMPARE "LOCALE-COMPARE" LOCALE_DATE "LOCALE-DATE" LOCALE_TIME "LOCALE-TIME" LOCALE_TIME_FROM_SECONDS "LOCALE-TIME-FROM-SECONDS" LOCAL_STORAGE "LOCAL-STORAGE" LOCATION LOCK LOCK_ON LOG LOG10 LOWER_CASE "LOWER-CASE" LOW_VALUES "LOW-VALUES" LOWEST_ALGEBRAIC "LOWEST-ALGEBRAIC" LPAREN " )" MANUAL MAXX "Max" MEAN MEDIAN MIDRANGE MINN "Min" MULTIPLE MOD MODE MODULE_NAME "MODULE-NAME " NAMED NAT NATIONAL NATIONAL_EDITED "NATIONAL-EDITED" NATIONAL_OF "NATIONAL-OF" NATIVE NESTED NEXT NO NOTE NULLS NULLPTR NUMERIC NUMERIC_EDITED NUMVAL NUMVAL_C "NUMVAL-C" NUMVAL_F "NUMVAL-F" OCCURS OF OFF OMITTED ON ONLY OPTIONAL OPTIONS ORD ORDER ORD_MAX "ORD-MAX" ORD_MIN "ORD-MIN" ORGANIZATION OTHER OTHERWISE OUTPUT PACKED_DECIMAL PADDING PAGE PAGE_COUNTER "PAGE-COUNTER" PF PH PI PIC PICTURE PLUS PRESENT_VALUE PRINT_SWITCH PROCEDURE PROCEDURES PROCEED PROCESS PROGRAM_ID "PROGRAM-ID" PROGRAM_kw "Program" PROPERTY PROTOTYPE PSEUDOTEXT QUOTES "QUOTE" RANDOM RANDOM_SEED RANGE RAISE RAISING RD RECORD RECORDING RECORDS RECURSIVE REDEFINES REEL REFERENCE RELATIVE REM REMAINDER REMARKS REMOVAL RENAMES REPLACE REPLACING REPORT REPORTING REPORTS REPOSITORY RERUN RESERVE RESTRICTED RESUME REVERSE REVERSED REWIND RF RH RIGHT ROUNDED RUN SAME SCREEN SD SECONDS_FROM_FORMATTED_TIME "SECONDS-FROM-FORMATTED-TIME" SECONDS_PAST_MIDNIGHT "SECONDS-PAST-MIDNIGHT" SECURITY SEPARATE SEQUENCE SEQUENTIAL SHARING SIMPLE_EXIT "(simple) EXIT" SIGN SIN SIZE SMALLEST_ALGEBRAIC "SMALLEST-ALGEBRAIC" SOURCE SOURCE_COMPUTER "SOURCE-COMPUTER" SPECIAL_NAMES SQRT STACK STANDARD STANDARD_1 "STANDARD-1" STANDARD_DEVIATION "STANDARD-DEVIATION " STANDARD_COMPARE "STANDARD-COMPARE" STATUS STRONG SUBSTITUTE SUM SYMBOL SYMBOLIC SYNCHRONIZED TALLY TALLYING TAN TERMINATE TEST TEST_DATE_YYYYMMDD "TEST-DATE-YYYYMMDD" TEST_DAY_YYYYDDD "TEST-DAY-YYYYDDD" TEST_FORMATTED_DATETIME "TEST-FORMATTED-DATETIME" TEST_NUMVAL "TEST-NUMVAL" TEST_NUMVAL_C "TEST-NUMVAL-C" TEST_NUMVAL_F "TEST-NUMVAL-F" THAN TIME TIMES TO TOP TOP_LEVEL TRACKS TRACK_AREA TRAILING TRANSFORM TRIM TRUE_kw "True" TRY TURN TYPE TYPEDEF ULENGTH UNBOUNDED UNIT UNITS UNIT_RECORD UNTIL UP UPON UPOS UPPER_CASE USAGE USING USUBSTR USUPPLEMENTARY UTILITY UUID4 UVALID UWIDTH VALUE VARIANCE VARYING VOLATILE WHEN_COMPILED WITH WORKING_STORAGE XML XMLGENERATE XMLPARSE YEAR_TO_YYYY YYYYDDD YYYYMMDD /* unused Context Words */ ARITHMETIC ATTRIBUTE AUTO AUTOMATIC AWAY_FROM_ZERO "AWAY-FROM-ZERO" BACKGROUND_COLOR "BACKGROUND-COLOR" BELL BINARY_ENCODING "BINARY-ENCODING" BLINK CAPACITY CENTER CLASSIFICATION CYCLE DECIMAL_ENCODING "DECIMAL-ENCODING" ENTRY_CONVENTION EOL EOS ERASE EXPANDS FLOAT_BINARY "FLOAT-BINARY" FLOAT_DECIMAL "FLOAT-DECIMAL" FOREGROUND_COLOR FOREVER FULL HIGHLIGHT HIGH_ORDER_LEFT "HIGH-ORDER-LEFT" HIGH_ORDER_RIGHT "HIGH-ORDER-RIGHT" IGNORING IMPLEMENTS INITIALIZED INTERMEDIATE LC_ALL_kw "LC-ALL" LC_COLLATE_kw "LC-COLLATE" LC_CTYPE_kw "LC-CTYPE" LC_MESSAGES_kw "LC-MESSAGES" LC_MONETARY_kw "LC-MONETARY" LC_NUMERIC_kw "LC-NUMERIC" LC_TIME_kw "LC-TIME" LOWLIGHT NEAREST_AWAY_FROM_ZERO "NEAREST-AWAY-FROM-ZERO" NEAREST_EVEN NEAREST_TOWARD_ZERO "NEAREST-EVEN NEAREST-TOWARD-ZERO" NONE NORMAL NUMBERS PREFIXED PREVIOUS PROHIBITED RELATION REQUIRED REVERSE_VIDEO ROUNDING SECONDS SECURE SHORT SIGNED_kw STANDARD_BINARY "STANDARD-BINARY" STANDARD_DECIMAL "STANDARD-DECIMAL" STATEMENT STEP STRUCTURE TOWARD_GREATER "TOWARD-GREATER" TOWARD_LESSER "TOWARD-LESSER" TRUNCATION UCS_4 "UCS-4" UNDERLINE UNSIGNED_kw UTF_16 "UTF-16" UTF_8 "UTF-8" ADDRESS END_ACCEPT "END-ACCEPT" END_ADD "END-ADD" END_CALL "END-CALL" END_COMPUTE "END-COMPUTE" END_DELETE "END-DELETE" END_DISPLAY "END-DISPLAY" END_DIVIDE "END-DIVIDE" END_EVALUATE "END-EVALUATE" END_MULTIPLY "END-MULTIPLY" END_PERFORM "END-PERFORM" END_READ "END-READ" END_RETURN "END-RETURN" END_REWRITE "END-REWRITE" END_SEARCH "END-SEARCH" END_START "END-START" END_STRING "END-STRING" END_SUBTRACT "END-SUBTRACT" END_UNSTRING "END-UNSTRING" END_WRITE "END-WRITE" END_IF "END-IF" /* end tokens without semantic value */ // YYEOF added for compatibility with Bison 3.5 // https://savannah.gnu.org/forum/forum.php?forum_id=9735 %token YYEOF 0 "end of file" %type sentence statements statement %type star_cbl_opt close_how %type test_before usage_clause1 might_be %type all optional sign_leading on_off initialized strong %type count data_clauses data_clause %type nine nines nps relop spaces_etc reserved_value signed %type variable_type %type true_false posneg eval_posneg %type open_io alphabet_etc %type device_name %type numed collating_sequence context_word ctx_name locale_spec %type namestr alphabet_lit program_as repo_as %type perform_cond kind_of_name %type alloc_ret %type log_term rel_expr rel_abbr eval_abbr %type num_value num_term value factor %type simple_cond bool_expr %type log_expr rel_abbrs eval_abbrs %type rel_term rel_term1 %type value78 %type literal name nume typename %type num_literal signed_literal %type perform_start %type perform_times %type perform_verb perform_inline perform_except %type eval_subject1 %type vargs disp_vargs; %type level_name %type fd_name picture_sym name66 paragraph_name %type literalism %type bound advance_when org_clause1 read_next %type access_mode multiple lock_how lock_mode %type select_clauses %type select_clause access_clause alt_key_clause assign_clause collate_clause status_clause lock_mode_clause org_clause padding_clause record_delim_clause record_key_clause relative_key_clause reserve_clause sharing_clause %type filename read_body write_body delete_body %type rewrite_body %type record_vary rec_contains from_to record_desc %type read_file rewrite1 write_file %type data_descr data_descr1 write_what file_record %type name88 %type advancing advance_by %type alphaval alpha_val numeref scalar scalar88 %type tableref tableish %type varg varg1 varg1a %type expr expr_term compute_expr free_tgt by_value_arg %type move_tgt selected_name read_key read_into vary_by %type accept_refer num_operand envar search_expr any_arg %type accept_body %type expr_list subscripts arg_list free_tgts %type move_tgts set_tgts %type search_varying %type search_term search_terms %type