From af5c2360d8049b31b8d1b4323930c35e03ef6385 Mon Sep 17 00:00:00 2001
From: "James K. Lowden" <jklowden@symas.com>
Date: Fri, 31 Jan 2025 04:28:11 -0500
Subject: [PATCH] eliminate use of Bison yytname

---
 gcc/cobol/cdf.y             |  109 ++-
 gcc/cobol/cdftok.awk        |   12 +-
 gcc/cobol/parse.y           |  627 +++++++++++-----
 gcc/cobol/parse_ante.h      |   15 +-
 gcc/cobol/scan.l            |    4 +-
 gcc/cobol/scan_ante.h       |    1 -
 gcc/cobol/token_names.h     | 1373 +++++++++++++++++++++++++++++++++++
 gcc/cobol/token_names.h.gen |   67 ++
 gcc/cobol/util.cc           |   81 ---
 9 files changed, 1973 insertions(+), 316 deletions(-)
 create mode 100644 gcc/cobol/token_names.h
 create mode 100755 gcc/cobol/token_names.h.gen

diff --git a/gcc/cobol/cdf.y b/gcc/cobol/cdf.y
index 3f72dd7f70aa..78870b544940 100644
--- a/gcc/cobol/cdf.y
+++ b/gcc/cobol/cdf.y
@@ -57,8 +57,6 @@ integer_literal( const char input[] ) {
   return std::make_pair(v, fOK);
 }
 
-const char * cdf_token_str( int token );
-
 /* "The renamed symbols include 'yyparse', 'yylex', 'yyerror',
     'yynerrs', 'yylval', 'yylloc', 'yychar' and 'yydebug'.  [...] The
     renamed macros include 'YYSTYPE', 'YYLTYPE', and 'YYDEBUG'" */
@@ -227,7 +225,7 @@ apply_cdf_turn( exception_turns_t& turns ) {
   }
   if( getenv("SHOW_PARSE") ) enabled_exceptions.dump();
   return true;
-}			
+}
 %}
 
 %union {
@@ -251,8 +249,8 @@ apply_cdf_turn( exception_turns_t& turns ) {
 %type	<string>	LSUB RSUB SUBSCRIPT
 %type	<cdfarg>	namelit name_any name_one
 %type	<string>	name subscript subscripts inof
-%token <boolean>  BOOL 
-%token <number>  FEATURE 365  NUMBER 304  EXCEPTION_NAME 282 
+%token <boolean>  BOOL
+%token <number>  FEATURE 363  NUMBER 302  EXCEPTION_NAME 280    "EXCEPTION NAME"
 
 %type	<cdfval>	cdf_expr
 %type	<cdfval>	cdf_relexpr cdf_reloper cdf_and cdf_bool_expr
@@ -262,41 +260,48 @@ apply_cdf_turn( exception_turns_t& turns ) {
 %type   <file>		filename
 %type   <files>         filenames
 
-%token BY 479 
-%token COPY 362 
-%token CDF_DISPLAY 384 
-%token IN 598 
-%token NAME 288 
-%token NUMSTR 306 
-%token OF 679 
-%token PSEUDOTEXT 714 
-%token REPLACING 737 
-%token LITERAL 299 
-%token SUPPRESS 376 
-
-%token LSUB 367  SUBSCRIPT 375  RSUB 372 
-
-%token CDF_DEFINE 383 
-%token CDF_IF 385  CDF_ELSE 386  CDF_END_IF 387 
-%token CDF_EVALUATE 388  CDF_WHEN 389  CDF_END_EVALUATE 390 
-
-%token AS 461  CONSTANT 361  DEFINED 363 
+%token BY 476
+%token COPY 360
+%token CDF_DISPLAY 382    ">>DISPLAY"
+%token IN 595
+%token NAME 286
+%token NUMSTR 304    "numeric literal"
+%token OF 676
+%token PSEUDOTEXT 711
+%token REPLACING 734
+%token LITERAL 297
+%token SUPPRESS 374
+
+%token LSUB 365    "("
+%token SUBSCRIPT 373  RSUB 370    ")"
+
+%token CDF_DEFINE 381    ">>DEFINE"
+%token CDF_IF 383    ">>IF"
+%token CDF_ELSE 384    ">>ELSE"
+%token CDF_END_IF 385    ">>END-IF"
+%token CDF_EVALUATE 386    ">>EVALUATE"
+%token CDF_WHEN 387    ">>WHEN"
+%token CDF_END_EVALUATE 388    ">>END-EVALUATE"
+
+%token AS 458  CONSTANT 359  DEFINED 361
 %type	<boolean>	     DEFINED
-%token OTHER 691  PARAMETER_kw 368  OFF 680  OVERRIDE 369 
-%token THRU 931 
-%token TRUE_kw 807 
+%token OTHER 688  PARAMETER_kw 366    "PARAMETER"
+%token OFF 677  OVERRIDE 367
+%token THRU 930
+%token TRUE_kw 804    "True"
 
-%token CALL_COBOL 391  CALL_VERBATIM 392 
+%token CALL_COBOL 389    "CALL"
+%token CALL_VERBATIM 390    "CALL (as C)"
 
-%token TURN 809  CHECKING 489  LOCATION 642  ON 682  WITH 835 
+%token TURN 806  CHECKING 486  LOCATION 639  ON 679  WITH 832
 
-%left OR 932 
-%left AND 933 
-%right NOT 934 
-%left '<'  '>'  '='  NE 935  LE 936  GE 937 
-%left '-'  '+' 
-%left '*'  '/' 
-%right NEG 939 
+%left OR 931
+%left AND 932
+%right NOT 933
+%left '<'  '>'  '='  NE 934  LE 935  GE 936
+%left '-'  '+'
+%left '*'  '/'
+%right NEG 938
 
 %define api.prefix {ydf}
 %define api.token.prefix{YDF_}
@@ -344,7 +349,7 @@ cdf_display:	CDF_DISPLAY strings {
 		  }
 		}
 		;
-strings:	LITERAL { 
+strings:	LITERAL {
 		  display_msg = xstrdup($1);
 		}
 	|	strings LITERAL {
@@ -356,11 +361,11 @@ strings:	LITERAL {
 
 partials:	partial
 		{
-		  if( ! scanner_parsing() ) YYACCEPT; 
+		  if( ! scanner_parsing() ) YYACCEPT;
 		}
 	|	partials partial
 		{
-		  if( ! scanner_parsing() ) YYACCEPT; 
+		  if( ! scanner_parsing() ) YYACCEPT;
 		}
 		;
 partial:	cdf_if            /* text */
@@ -505,7 +510,7 @@ cdf_if:		CDF_IF cdf_cond_expr {
 		  ////if( scanner_parsing() ) yyerrok;
 		} CDF_END_IF { // not pushed, don't pop
 		  if( ! scanner_parsing() ) YYACCEPT;
-		} 
+		}
 		;
 
 cdf_evaluate:   CDF_EVALUATE cdf_expr
@@ -567,13 +572,13 @@ cdf_relexpr:	cdf_relexpr '<' cdf_expr { $$ = $1(@1) <  $3(@3); }
 		  {
 		      $$ = $1 == $3;
 		  } else {
-		    const char *msg = $1.string? 
+		    const char *msg = $1.string?
 		      "incommensurate comparison is FALSE: '%s' = %ld" :
 		      "incommensurate comparison is FALSE: %ld = '%s'" ;
 		    error_msg(@1, msg);
 		  }
 		}
-	|	cdf_relexpr NE cdf_expr 
+	|	cdf_relexpr NE cdf_expr
 		{
 		  $$ = cdfval_t(false);
 		  if( ( $1.string &&  $3.string) ||
@@ -581,7 +586,7 @@ cdf_relexpr:	cdf_relexpr '<' cdf_expr { $$ = $1(@1) <  $3(@3); }
 		  {
 		      $$ = $1 != $3;
 		  } else {
-		    const char *msg = $1.string? 
+		    const char *msg = $1.string?
 		      "incommensurate comparison is FALSE: '%s' = %ld" :
 		      "incommensurate comparison is FALSE: %ld = '%s'" ;
 		    error_msg(@1, msg);
@@ -807,13 +812,13 @@ defined_cmd( const char arg[] )
       value = cdfval_t(p);  // it's a string
     }
   }
-  
+
   dictionary[name] = value;
 
   auto cdf_name = dictionary.find(name);
   assert(cdf_name != dictionary.end());
   assert(cdf_name->second.is_numeric() || cdf_name->second.string != NULL);
-  
+
   if( yydebug ) {
     if( cdf_name->second.is_numeric() ) {
       dbgmsg("%s: added -D %s = %ld", __func__, name, cdf_name->second.as_number());
@@ -824,17 +829,6 @@ defined_cmd( const char arg[] )
   return true;
 }
 
-const char *
-cdf_token_str( int token ) {
-  if( token < 255 ) {
-    static char ascii[2];
-    ascii[0] = token;
-    return ascii;
-  }
-  size_t i = token - 255;
-  return i < COUNT_OF(yytname)? yytname[i] : NULL;
-}
-
 bool operator==( const cdfval_base_t& lhs, int rhs ) {
   gcc_assert( !lhs.string );
   return lhs.number == rhs;
@@ -957,5 +951,4 @@ cdfval_base_t&
 cdfval_base_t::operator()( const YDFLTYPE& loc ) {
   static cdfval_t zero(0);
   return verify_integer(loc, *this) ? *this : zero;
-}    
-      
+}
diff --git a/gcc/cobol/cdftok.awk b/gcc/cobol/cdftok.awk
index 8ebfedcc9242..30bb1ef0e03e 100755
--- a/gcc/cobol/cdftok.awk
+++ b/gcc/cobol/cdftok.awk
@@ -27,15 +27,22 @@ BEGIN {
 # match later are used.
 finding_tokens && /^ +[[:alnum:]_]+ =/ {
   gsub(/^ +/, "")
-  tokens[$1] = $3
+  value = $3
+  if( match($0, /".+"/) ) {
+    alias = substr($0, RSTART, RLENGTH)
+    value = value "    " alias
+  }
+  tokens[$1] = value
+  #rint "found:", $1, tokens[$1] > "/dev/stderr"
 }
 
 finding_tokens { next }
 
 /%(token|left|right)/ {
   sub(/ +$/, "")
+  sub(/["].+/, "") # delete any string value (must be only one on the line)
   for( i=2; i <= NF; i++ ) {
-    #rint i, "of", NF, "token:", $i, tokens[$i], "{" $0 "}"
+    #rint $i, "becomes", $i " " tokens[$i] >> "/dev/stderr"
     $i = $i " " tokens[$i]  # assign value from parse.h to token
     # delete next field if it holds the token's prior value
     if( i < NF && $(i+1) ~ /^[0-9]+$/ ) {
@@ -43,6 +50,7 @@ finding_tokens { next }
       $i = ""
     }
   }
+  sub(/ +$/, "")
 }
 
 { print }
diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index 009fb4e42139..f87b935e932c 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -314,19 +314,16 @@
 			END_PROGRAM    "END PROGRAM"
 			END_SUBPROGRAM "END PROGRAM <contained program>"
 
-%token			HIGH_ORDER_LEFT  "HIGH-ORDER-LEFT"
-			HIGH_ORDER_RIGHT "HIGH-ORDER-RIGHT"
-			
 %token			JUSTIFIED RETURNING NO_CONDITION "invalid token"
 
 %token  <string>        ALNUM ALPHED
-%token  <number>        ERROR EXCEPTION SIZE_ERROR
-%token	<ec_type>	EXCEPTION_NAME
-%token  <number>        LEVEL LEVEL66 LEVEL78 LEVEL88
+%token  <number>        ERROR EXCEPTION SIZE_ERROR "SIZE ERROR"
+%token	<ec_type>	EXCEPTION_NAME "EXCEPTION NAME"
+%token  <number>        LEVEL LEVEL66 "66" LEVEL78 "78" LEVEL88 "88"
 %token  <string>        CLASS_NAME "class name"
 			NAME
 			NAME88    "Level 88 NAME"
-			NUME      "NAME"
+			NUME      "Name"
 			NUMED     "NUMERIC-EDITED picture"
 			NUMED_CR  "NUMERIC-EDITED CR picture"
 			NUMED_DB  "NUMERIC-EDITED DB picture"
@@ -337,7 +334,7 @@
 %token  <string>        FILENAME
 %token  <number>        INVALID
 %token  <number>        NUMBER NEGATIVE
-%token  <numstr>        NUMSTR
+%token  <numstr>        NUMSTR    "numeric literal"
 %token  <number>        OVERFLOW
 %token  <computational> COMPUTATIONAL
 
@@ -366,6 +363,289 @@
 			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
+			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
+
+			QUOTE QUOTES
+
+			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
+			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
+			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"
@@ -703,7 +983,9 @@
 
                         CDF_DEFINE CDF_DISPLAY
                         CDF_IF CDF_ELSE CDF_END_IF
-                        CDF_EVALUATE CDF_WHEN CDF_END_EVALUATE
+                        CDF_EVALUATE
+			CDF_WHEN
+			CDF_END_EVALUATE
                         CALL_COBOL CALL_VERBATIM
 
 %right                  IF THEN ELSE
@@ -714,7 +996,6 @@
                         INITIALIZE INSPECT
                         MERGE MOVE MULTIPLY OPEN OVERFLOW PARAGRAPH PERFORM
                         READ RELEASE RETURN REWRITE
-                        SECTION_NAME
                         SEARCH SET SELECT SORT SORT_MERGE
                         STRING_kw STOP SUBTRACT START
                         UNSTRING WRITE WHEN INVALID
@@ -722,86 +1003,145 @@
 %left                   ABS ACCESS ACOS ACTUAL ADVANCING AFP_5A AFTER ALL
                         ALLOCATE
                         ALPHABET ALPHABETIC ALPHABETIC_LOWER
-                        ALPHABETIC_UPPER ALPHANUMERIC ALPHANUMERIC_EDITED
+                        ALPHABETIC_UPPER
+			ALPHANUMERIC
+			ALPHANUMERIC_EDITED
                         ALPHED ALSO ALTERNATE ANNUITY ANUM ANY ANYCASE APPLY ARE
                         AREA AREAS AS
                         ASCENDING ACTIVATING ASIN ASSIGN AT ATAN
 
                         BACKWARD BASED BASECONVERT
 			BEFORE BINARY BIT BIT_OF BIT_TO_CHAR 
-                        BLANK BLOCK BOOLEAN_OF_INTEGER BOTTOM BY BYTE BYTE_LENGTH
+                        BLANK BLOCK
+			BOOLEAN_OF_INTEGER
+			BOTTOM BY
+			BYTE BYTE_LENGTH
 
                         C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 CF CH
-                        CHANGED CHAR CHAR_NATIONAL CHARACTER CHARACTERS CHECKING CLASS
+                        CHANGED CHAR CHAR_NATIONAL
+			CHARACTER CHARACTERS CHECKING CLASS
                         COBOL CODE CODESET COLLATING
-                        COLUMN COMBINED_DATETIME COMMA COMMAND_LINE
-                        COMMAND_LINE_COUNT COMMIT COMMON COMPUTATIONAL
+                        COLUMN COMBINED_DATETIME
+			COMMA COMMAND_LINE
+                        COMMAND_LINE_COUNT
+			COMMIT COMMON COMPUTATIONAL
 
-                        CONCAT CONDITION CONFIGURATION_SECT CONSOLE CONTAINS
+                        CONCAT CONDITION CONFIGURATION_SECT
+			CONSOLE CONTAINS
                         CONTENT CONTROL CONTROLS CONVERT CONVERTING CORRESPONDING COS
                         COUNT CSP CURRENCY CURRENT CURRENT_DATE
 
-                        DATA DATE DATE_COMPILED DATE_OF_INTEGER DATE_TO_YYYYMMDD
-                        DATE_FMT TIME_FMT DATETIME_FMT
-                        DATE_WRITTEN DAY DAY_OF_INTEGER DAY_OF_WEEK
-                        DAY_TO_YYYYDDD DBCS DE DEBUGGING DECIMAL_POINT
+                        DATA DATE DATE_COMPILED
+			DATE_OF_INTEGER
+			DATE_TO_YYYYMMDD
+                        DATE_FMT
+			TIME_FMT
+			DATETIME_FMT
+                        DATE_WRITTEN
+			DAY DAY_OF_INTEGER
+			DAY_OF_WEEK
+                        DAY_TO_YYYYDDD
+			DBCS DE DEBUGGING DECIMAL_POINT
                         DECLARATIVES DEFAULT DELIMITED DELIMITER DEPENDING
-                        DESCENDING DETAIL DIRECT DIRECT_ACCESS DOWN DUPLICATES
+                        DESCENDING DETAIL DIRECT
+			DIRECT_ACCESS
+			DOWN DUPLICATES
                         DYNAMIC
 
                         E EBCDIC EC EGCS ENTRY ENVIRONMENT EQUAL ERROR EVERY
                         EXAMINE EXCEPTION EXHIBIT EXP EXP10 EXTEND EXTERNAL
 
-                        EXCEPTION_FILE EXCEPTION_FILE_N
-                        EXCEPTION_LOCATION EXCEPTION_LOCATION_N
-                        EXCEPTION_NAME
-                        EXCEPTION_STATEMENT EXCEPTION_STATUS
-
-                        FACTORIAL FALSE_kw FD FILENAME FILE_CONTROL FILE_KW
-                        FILE_LIMIT FINAL FINALLY FIND_STRING FIRST FIXED FOOTING FOR
-                        FORMATTED_CURRENT_DATE FORMATTED_DATE FORMATTED_DATETIME
-                        FORMATTED_TIME FORM_OVERFLOW FREE
-                        FRACTION_PART FROM FUNCTION FUNCTION_UDF
+                        EXCEPTION_FILE      
+			EXCEPTION_FILE_N    
+                        EXCEPTION_LOCATION  
+			EXCEPTION_LOCATION_N
+                        EXCEPTION_NAME      
+                        EXCEPTION_STATEMENT 
+			EXCEPTION_STATUS    
+
+                        FACTORIAL FALSE_kw FD FILENAME
+			FILE_CONTROL
+			FILE_KW
+                        FILE_LIMIT
+			FINAL FINALLY
+			FIND_STRING
+			FIRST FIXED FOOTING FOR
+                        FORMATTED_CURRENT_DATE
+			FORMATTED_DATE
+			FORMATTED_DATETIME
+                        FORMATTED_TIME
+			FORM_OVERFLOW
+			FREE 
+                        FRACTION_PART
+			FROM FUNCTION
+			FUNCTION_UDF
 
                         GENERATE GIVING GLOBAL GO GROUP
 
-                        HEADING HEX HEX_OF HEX_TO_CHAR
-                        HIGH_VALUES HIGHEST_ALGEBRAIC HOLD
+                        HEADING HEX
+			HEX_OF
+			HEX_TO_CHAR
+                        HIGH_VALUES
+			HIGHEST_ALGEBRAIC
+			HOLD
 
                         IBM_360 IN INCLUDE INDEX INDEXED INDICATE INITIAL_kw
                         INITIATE INPUT INSTALLATION INTERFACE
-                        INTEGER INTEGER_OF_BOOLEAN INTEGER_OF_DATE
-                        INTEGER_OF_DAY INTEGER_OF_FORMATTED_DATE INTEGER_PART
-                        INTO INTRINSIC INVOKE IO IO_CONTROL IS ISNT
+                        INTEGER
+			INTEGER_OF_BOOLEAN
+			INTEGER_OF_DATE
+                        INTEGER_OF_DAY
+			INTEGER_OF_FORMATTED_DATE
+			INTEGER_PART
+                        INTO INTRINSIC INVOKE IO IO_CONTROL
+			IS ISNT
 
                         KANJI KEY
 
-                        LABEL LAST LEADING LEFT LENGTH LENGTH_OF LEVEL LEVEL66
-                        LEVEL88 LIMIT LIMITS LINE LINES LINE_COUNTER
+                        LABEL LAST LEADING LEFT LENGTH
+			LENGTH_OF
+			LEVEL LEVEL66
+                        LEVEL88 LIMIT LIMITS LINE LINES
+			LINE_COUNTER
                         LINAGE LINKAGE LOCALE LOCALE_COMPARE
-                        LOCALE_DATE LOCALE_TIME LOCALE_TIME_FROM_SECONDS
-                        LOCAL_STORAGE LOCATION
-                        LOCK LOCK_ON LOG LOG10 LOWER_CASE LOW_VALUES
-                        LOWEST_ALGEBRAIC LPAREN
+                        LOCALE_DATE
+			LOCALE_TIME
+			LOCALE_TIME_FROM_SECONDS
+                        LOCAL_STORAGE
+			LOCATION
+                        LOCK LOCK_ON LOG LOG10
+			LOWER_CASE
+			LOW_VALUES
+                        LOWEST_ALGEBRAIC
+			LPAREN
 
                         MANUAL MAXX MEAN MEDIAN MIDRANGE
-                        MIGHT_BE MINN MULTIPLE MOD MODE MODULE_NAME 
+                        MIGHT_BE MINN MULTIPLE MOD MODE
+			MODULE_NAME 
 
-                        NAMED NAT NATIONAL NATIONAL_EDITED NATIONAL_OF
+                        NAMED NAT NATIONAL
+			NATIONAL_EDITED
+			NATIONAL_OF
                         NATIVE NEGATIVE NESTED NEXT
 			NINEDOT NINES NINEV NO NOTE NO_CONDITION 
 			NULLS NULLPTR NUMBER
                         NUME NUMED NUMED_CR NUMED_DB NUMERIC
-                        NUMERIC_EDITED NUMSTR NUMVAL NUMVAL_C NUMVAL_F
+                        NUMERIC_EDITED NUMSTR NUMVAL
+			NUMVAL_C
+			NUMVAL_F
 
                         OCCURS OF OFF OMITTED ON ONLY OPTIONAL OPTIONS ORD ORDER
-                        ORD_MAX ORD_MIN ORGANIZATION OTHER OTHERWISE OUTPUT
+                        ORD_MAX
+			ORD_MIN
+			ORGANIZATION OTHER OTHERWISE OUTPUT
 
-                        PACKED_DECIMAL PADDING PAGE PAGE_COUNTER
+                        PACKED_DECIMAL PADDING PAGE
+			PAGE_COUNTER
                         PF PH PI PIC PICTURE PIC_P
                         PLUS POINTER POSITIVE PRESENT_VALUE PRINT_SWITCH
                         PROCEDURE PROCEDURES PROCEED PROCESS
-                        PROGRAM_ID PROGRAM_kw PROPERTY PROTOTYPE PSEUDOTEXT
+                        PROGRAM_ID
+			PROGRAM_kw PROPERTY PROTOTYPE PSEUDOTEXT
 
                         QUOTE QUOTES
 
@@ -812,20 +1152,36 @@
                         REPOSITORY RERUN RESERVE RESTRICTED RESUME
                         REVERSE REVERSED REWIND RF RH RIGHT ROUNDED RUN
 
-                        S01 S02 S03 S04 S05 SAME SCREEN SD SECONDS_FROM_FORMATTED_TIME
-                        SECONDS_PAST_MIDNIGHT SECTION SECURITY
-                        SEPARATE SEQUENCE SEQUENTIAL SHARING SIMPLE_EXIT
-                        SIGN SIN SIZE SIZE_ERROR SMALLEST_ALGEBRAIC SOURCE SOURCE_COMPUTER
+                        S01 S02 S03 S04 S05 SAME SCREEN SD
+			SECONDS_FROM_FORMATTED_TIME
+                        SECONDS_PAST_MIDNIGHT
+			SECTION SECURITY
+                        SEPARATE SEQUENCE SEQUENTIAL SHARING
+			SIMPLE_EXIT
+                        SIGN SIN SIZE SIZE_ERROR
+			SMALLEST_ALGEBRAIC
+			SOURCE
+			SOURCE_COMPUTER
                         SPACES SPECIAL_NAMES SQRT STACK
-			STANDARD STANDARD_ALPHABET STANDARD_1 STANDARD_DEVIATION 
-                        STANDARD_COMPARE STATUS STRONG STDERR STDIN STDOUT
+			STANDARD
+			STANDARD_ALPHABET
+			STANDARD_1
+			STANDARD_DEVIATION 
+                        STANDARD_COMPARE
+			STATUS STRONG STDERR STDIN STDOUT
                         LITERAL SUBSTITUTE SUM SWITCH SYMBOL SYMBOLIC SYNCHRONIZED
                         SYSIN SYSIPT SYSLST SYSOUT SYSPCH SYSPUNCH
    
-                        TALLY TALLYING TAN TERMINATE TEST TEST_DATE_YYYYMMDD
-                        TEST_DAY_YYYYDDD TEST_FORMATTED_DATETIME TEST_NUMVAL
-                        TEST_NUMVAL_C TEST_NUMVAL_F THAN TIME TIMES
-			TO TOP TOP_LEVEL
+                        TALLY TALLYING TAN TERMINATE TEST
+			TEST_DATE_YYYYMMDD
+                        TEST_DAY_YYYYDDD
+			TEST_FORMATTED_DATETIME
+			TEST_NUMVAL
+                        TEST_NUMVAL_C
+			TEST_NUMVAL_F
+			THAN TIME TIMES
+			TO TOP
+			TOP_LEVEL
                         TRACKS TRACK_AREA TRAILING TRANSFORM TRIM TRUE_kw TRY
                         TURN TYPE TYPEDEF
 
@@ -841,35 +1197,57 @@
                         ZERO
 
                         /* unused Context Words */
-                        ARITHMETIC ATTRIBUTE AUTO AUTOMATIC AWAY_FROM_ZERO
-                        BACKGROUND_COLOR BELL BINARY_ENCODING BLINK
+                        ARITHMETIC ATTRIBUTE AUTO AUTOMATIC
+			AWAY_FROM_ZERO
+                        BACKGROUND_COLOR
+			BELL
+			BINARY_ENCODING
+			BLINK
                         CAPACITY CENTER CLASSIFICATION CYCLE
-                        DECIMAL_ENCODING ENTRY_CONVENTION EOL EOS ERASE EXPANDS
-                        FLOAT_BINARY FLOAT_DECIMAL FOREGROUND_COLOR FOREVER FULL
-                        HIGHLIGHT HIGH_ORDER_LEFT HIGH_ORDER_RIGHT
+                        DECIMAL_ENCODING
+			ENTRY_CONVENTION EOL EOS ERASE EXPANDS
+                        FLOAT_BINARY
+			FLOAT_DECIMAL
+			FOREGROUND_COLOR FOREVER FULL
+                        HIGHLIGHT
+			HIGH_ORDER_LEFT
+			HIGH_ORDER_RIGHT
                         IGNORING IMPLEMENTS INITIALIZED INTERMEDIATE
-                        LC_ALL_kw LC_COLLATE_kw LC_CTYPE_kw LC_MESSAGES_kw
-                        LC_MONETARY_kw LC_NUMERIC_kw LC_TIME_kw
+                        LC_ALL_kw      
+			LC_COLLATE_kw  
+			LC_CTYPE_kw    
+			LC_MESSAGES_kw 
+                        LC_MONETARY_kw 
+			LC_NUMERIC_kw  
+			LC_TIME_kw     
                         LOWLIGHT
-                        NEAREST_AWAY_FROM_ZERO NEAREST_EVEN NEAREST_TOWARD_ZERO
+                        NEAREST_AWAY_FROM_ZERO
+			NEAREST_EVEN NEAREST_TOWARD_ZERO
                         NONE NORMAL NUMBERS
                         PREFIXED PREVIOUS PROHIBITED RELATION REQUIRED
                         REVERSE_VIDEO ROUNDING
-                        SECONDS SECURE SHORT SIGNED STANDARD_BINARY
-                        STANDARD_DECIMAL STATEMENT STEP STRUCTURE
-                        TOWARD_GREATER TOWARD_LESSER TRUNCATION
-                        UCS_4 UNDERLINE UNSIGNED UTF_16 UTF_8
+                        SECONDS SECURE SHORT SIGNED
+			STANDARD_BINARY
+                        STANDARD_DECIMAL
+			STATEMENT STEP STRUCTURE
+                        TOWARD_GREATER
+			TOWARD_LESSER
+			TRUNCATION
+                        UCS_4
+			UNDERLINE UNSIGNED
+			UTF_16
+			UTF_8
 
 %left                   CLASS_NAME NAME NAME88
 %left                   ADDRESS
 %left                   END_ACCEPT END_ADD END_CALL END_COMPUTE
-                        END_DELETE END_DISPLAY END_DIVIDE
-                        END_EVALUATE END_MULTIPLY END_PERFORM
-                        END_READ END_RETURN END_REWRITE
-                        END_SEARCH END_STRING END_SUBTRACT END_START
-                        END_UNSTRING END_WRITE
+			END_DELETE END_DISPLAY END_DIVIDE
+			END_EVALUATE END_MULTIPLY END_PERFORM
+			END_READ END_RETURN END_REWRITE
+			END_SEARCH END_START END_STRING END_SUBTRACT
+			END_UNSTRING END_WRITE
                         error
-                        END_IF
+			END_IF
 			
 %left  THRU
 %left  OR
@@ -10743,38 +11121,18 @@ struct string_match {
   }
 };
 
-int
-keyword_of( const char name[] ) {
-  auto eotname = yytname + COUNT_OF(yytname);
-  auto p = std::find_if( yytname, eotname, string_match(name) );
-  return p == eotname? 0 : 255 + int(eotname - p);
-}
-
 const char *
 keyword_str( int token ) {
   if( token == YYEOF )   return "YYEOF";
   if( token == YYEMPTY ) return "YYEMPTY";
 
-  if( token < 255 ) {
+  if( token < 256 ) {
     static char ascii[2];
     ascii[0] = token;
     return ascii;
   }
 
-  static const std::map<int, const char*> misaligned = {
-      {NE, "NE"},
-      {LE, "LE"},
-      {GE, "GE"},
-      {NEG, "NEG"},
-      {POW, "POW"},
-  };
-
-  auto p = misaligned.find(token);
-  if( p != misaligned.end() ) return p->second;
-
-  int i = token - 255;
-  assert( i < int(COUNT_OF(yytname)) );
-  return yytname[i];
+  return tokens.name_of(token);
 }
 
 /*
@@ -10785,67 +11143,10 @@ keyword_str( int token ) {
  * All function names are rejected here; the lexer uses typed_name to check
  * REPOSITORY names.
  */
-static struct kw_t { const char *lexeme, *name; } kws[] = {
-    { "CODE_SET", "CODESET" },
-    { "DATA", "DATA_DIV" },
-    { "ENVIRONMENT", "ENVIRONMENT_DIV" },
-    { "FALSE", "FALSE_kw" },
-    { "FILE", "FILE_KW" },
-    { "FILLER", "FILLER_kw" },
-    { "IDENTIFICATION", "IDENTIFICATION_DIV" },
-    { "I_O", "IO" },
-    { "INITIAL", "INITIAL_kw" },
-    { "PIC", "PICTURE" },
-    { "PROCEDURE", "PROCEDURE_DIV" },
-    { "PROGRAM", "PROGRAM_kw" },
-    { "QUOTE", "QUOTES" },
-    { "STRING", "STRING_kw" },
-    { "THROUGH", "THRU" },
-    { "TRUE", "TRUE_kw" },
-}, *eokws = kws + COUNT_OF(kws);
-
-tokenset_t::tokenset_t( const char * const *first,
-	      const char * const *last ) {
-    // Initialize a map of lexemes, as found in the COBOL text, to their token values.
-    int i = 3 + 255;
-
-    for( auto name = first; name < last; name++ ) {
-      static cbl_name_t lname;
-
-      strcpy(lname, *name);
-      // Correct for names in parse.c::yytname that do not match the string
-      // provided in the COBOL text.
-      auto p = std::find_if( kws, eokws,
-			     [](kw_t kw) {
-			       return 0 == strcasecmp(lname, kw.name);
-			     } );
-      if( p != eokws ) {
-	strcpy(lname, p->lexeme);
-      }
-
-      if( 0 == strcasecmp(lname, "THROUGH") ) tokens["thru"] = i;
-
-      std::replace(lname, lname + strlen(lname), '_', '-');
-      std::transform(lname, lname + strlen(lname) + 1, lname, tolower);
-      tokens[lname] = i++;
-    }
 
-    // Insert token aliases into the token map.
-    static struct kw_t aliases[] = {
-      { "null",      "nulls" },
-      { "space",     "spaces" },
-      { "through",   "thru" },
-      { "zeroes",    "zero" },
-      { "zeros",     "zero" },
-    }, *eoaliases = aliases + COUNT_OF(aliases);
-    
-    std::transform( aliases, eoaliases, std::inserter(tokens, tokens.begin()),
-		    [this]( const kw_t& kw ) {
-		      auto p = tokens.find(kw.name);
-		      assert(p != tokens.end());
-		      int token = p->second;
-		      return std::make_pair(kw.lexeme, token);
-		    } );
+// tokens.h is generated as needed from parse.h with tokens.h.gen
+tokenset_t::tokenset_t() {
+#include "token_names.h"
 }
 
 // Look up the lowercase form of a keyword, excluding some CDF names.
@@ -10890,16 +11191,6 @@ tokenset_t::find( const cbl_name_t name, bool include_intrinsics ) {
   return intrinsic_cname(token)? 0 : token;
 }
 
-const char * const *
-current_tokens_t::last_terminal() {
-  auto last = std::find_if(yytname + 3, yytname + COUNT_OF(yytname),
-			   [] ( const char *name ) {
-			     return 0 == strcmp(name, "$accept"); });
-  return last;
-}
-
-current_tokens_t::current_tokens_t() : tokens( yytname + 3, last_terminal() ) {}
-
 int
 keyword_tok( const char * text, bool include_intrinsics ) {
   return tokens.find(text, include_intrinsics);  
diff --git a/gcc/cobol/parse_ante.h b/gcc/cobol/parse_ante.h
index db9333b0d76e..e3f125489847 100644
--- a/gcc/cobol/parse_ante.h
+++ b/gcc/cobol/parse_ante.h
@@ -906,6 +906,7 @@ teed_up_names() {
 }
 
 class tokenset_t {
+  std::vector<const char *>token_names;
   std::map <std::string, int> tokens;
   std::set<std::string> cobol_words;
 
@@ -917,8 +918,7 @@ class tokenset_t {
   }
   
  public:
-  tokenset_t( const char * const *first,
-              const char * const *last );
+  tokenset_t();
   int find( const cbl_name_t name, bool include_intrinsics );
   
   bool equate( const YYLTYPE& loc, int token, const cbl_name_t name ) {
@@ -976,13 +976,17 @@ class tokenset_t {
     }
     return 0;
   }
+  const char * name_of( int tok ) const {
+    tok -= (255 + 3);
+    gcc_assert(0 <= tok && size_t(tok) < token_names.size());
+    return token_names[tok];
+  }
 };
 
 class current_tokens_t {
   tokenset_t tokens;
-  static const char * const *last_terminal();
  public:
-  current_tokens_t();
+  current_tokens_t() {}
   int find( const cbl_name_t name, bool include_intrinsics ) {
     return tokens.find(name, include_intrinsics);  
   }
@@ -1011,6 +1015,9 @@ class current_tokens_t {
   int redefined_as( const cbl_name_t name ) {
     return tokens.redefined_as(name);
   }
+  const char * name_of( int tok ) const {
+    return tokens.name_of(tok);
+  }
 } tokens;
 
 int
diff --git a/gcc/cobol/scan.l b/gcc/cobol/scan.l
index be2f630ced10..bebb80cc2b67 100644
--- a/gcc/cobol/scan.l
+++ b/gcc/cobol/scan.l
@@ -2233,7 +2233,7 @@ BASIS		{ yy_push_state(basis); return BASIS; }
   EXIT	{ return EXIT; }
   EXTEND	{ return EXTEND; }
   EXTERNAL	{ return EXTERNAL; }
-  FALSE	{ return FALSE; }
+
   FD	{ return FD; }
   FINAL	{ return FINAL; }
   FINALLY	{ return FINALLY; }
@@ -2402,7 +2402,7 @@ BASIS		{ yy_push_state(basis); return BASIS; }
   TO	{ return TO; }
   TOP	{ return TOP; }
   TRAILING	{ return TRAILING; }
-  TRUE	{ return TRUE; }
+
   TYPE	{ return TYPE; }
   TYPEDEF	{ return TYPEDEF; }
   UNIT	{ return UNIT; }
diff --git a/gcc/cobol/scan_ante.h b/gcc/cobol/scan_ante.h
index 74945a97a169..0ab41d3734a2 100644
--- a/gcc/cobol/scan_ante.h
+++ b/gcc/cobol/scan_ante.h
@@ -53,7 +53,6 @@ bool include_debug();
 int lexer_input( char buf[], int max_size, FILE *input );
 
 const char * keyword_str( int token );
-const char * cdf_token_str( int token );
 
 int repository_function_tok( const char name[] );
 
diff --git a/gcc/cobol/token_names.h b/gcc/cobol/token_names.h
new file mode 100644
index 000000000000..13f17c2f21d0
--- /dev/null
+++ b/gcc/cobol/token_names.h
@@ -0,0 +1,1373 @@
+// generated by ./token_names.h.gen ../../build/gcc/cobol/parse.h
+// Fri Jan 31 04:26:41 EST 2025
+tokens = {
+	{ "identification", IDENTIFICATION_DIV }, // 258
+	{ "environment", ENVIRONMENT_DIV }, // 259
+	{ "procedure", PROCEDURE_DIV }, // 260
+	{ "data", DATA_DIV }, // 261
+	{ "file", FILE_SECT }, // 262
+	{ "input-output", INPUT_OUTPUT_SECT }, // 263
+	{ "linkage", LINKAGE_SECT }, // 264
+	{ "local-storage", LOCAL_STORAGE_SECT }, // 265
+	{ "working-storage", WORKING_STORAGE_SECT }, // 266
+	{ "object-computer", OBJECT_COMPUTER }, // 267
+	{ "display-of", DISPLAY_OF }, // 268
+	{ "end-function", END_FUNCTION }, // 269
+	{ "end-program", END_PROGRAM }, // 270
+	{ "end-subprogram", END_SUBPROGRAM }, // 271
+	{ "justified", JUSTIFIED }, // 272
+	{ "returning", RETURNING }, // 273
+	{ "no-condition", NO_CONDITION }, // 274
+	{ "alnum", ALNUM }, // 275
+	{ "alphed", ALPHED }, // 276
+	{ "error", ERROR }, // 277
+	{ "exception", EXCEPTION }, // 278
+	{ "size-error", SIZE_ERROR }, // 279
+	{ "exception-name", EXCEPTION_NAME }, // 280
+	{ "level", LEVEL }, // 281
+	{ "level66", LEVEL66 }, // 282
+	{ "level78", LEVEL78 }, // 283
+	{ "level88", LEVEL88 }, // 284
+	{ "class-name", CLASS_NAME }, // 285
+	{ "name", NAME }, // 286
+	{ "name88", NAME88 }, // 287
+	{ "nume", NUME }, // 288
+	{ "numed", NUMED }, // 289
+	{ "numed-cr", NUMED_CR }, // 290
+	{ "numed-db", NUMED_DB }, // 291
+	{ "ninedot", NINEDOT }, // 292
+	{ "nines", NINES }, // 293
+	{ "ninev", NINEV }, // 294
+	{ "pic-p", PIC_P }, // 295
+	{ "spaces", SPACES }, // 296
+	{ "space", SPACES }, // 296
+	{ "literal", LITERAL }, // 297
+	{ "end", END }, // 298
+	{ "eop", EOP }, // 299
+	{ "filename", FILENAME }, // 300
+	{ "invalid", INVALID }, // 301
+	{ "number", NUMBER }, // 302
+	{ "negative", NEGATIVE }, // 303
+	{ "numstr", NUMSTR }, // 304
+	{ "overflow", OVERFLOW }, // 305
+	{ "computational", COMPUTATIONAL }, // 306
+	{ "perform", PERFORM }, // 307
+	{ "backward", BACKWARD }, // 308
+	{ "positive", POSITIVE }, // 309
+	{ "pointer", POINTER }, // 310
+	{ "section", SECTION }, // 311
+	{ "standard-alphabet", STANDARD_ALPHABET }, // 312
+	{ "switch", SWITCH }, // 313
+	{ "upsi", UPSI }, // 314
+	{ "zero", ZERO }, // 315
+	{ "zeros", ZERO }, // 315
+	{ "zeroeo", ZERO }, // 315
+	{ "sysin", SYSIN }, // 316
+	{ "sysipt", SYSIPT }, // 317
+	{ "sysout", SYSOUT }, // 318
+	{ "syslist", SYSLIST }, // 319
+	{ "syslst", SYSLST }, // 320
+	{ "syspunch", SYSPUNCH }, // 321
+	{ "syspch", SYSPCH }, // 322
+	{ "console", CONSOLE }, // 323
+	{ "c01", C01 }, // 324
+	{ "c02", C02 }, // 325
+	{ "c03", C03 }, // 326
+	{ "c04", C04 }, // 327
+	{ "c05", C05 }, // 328
+	{ "c06", C06 }, // 329
+	{ "c07", C07 }, // 330
+	{ "c08", C08 }, // 331
+	{ "c09", C09 }, // 332
+	{ "c10", C10 }, // 333
+	{ "c11", C11 }, // 334
+	{ "c12", C12 }, // 335
+	{ "csp", CSP }, // 336
+	{ "s01", S01 }, // 337
+	{ "s02", S02 }, // 338
+	{ "s03", S03 }, // 339
+	{ "s04", S04 }, // 340
+	{ "s05", S05 }, // 341
+	{ "afp-5a", AFP_5A }, // 342
+	{ "stdin", STDIN }, // 343
+	{ "stdout", STDOUT }, // 344
+	{ "stderr", STDERR }, // 345
+	{ "list", LIST }, // 346
+	{ "map", MAP }, // 347
+	{ "nolist", NOLIST }, // 348
+	{ "nomap", NOMAP }, // 349
+	{ "nosource", NOSOURCE }, // 350
+	{ "might-be", MIGHT_BE }, // 351
+	{ "function-udf", FUNCTION_UDF }, // 352
+	{ "function-udf-0", FUNCTION_UDF_0 }, // 353
+	{ "date-fmt", DATE_FMT }, // 354
+	{ "time-fmt", TIME_FMT }, // 355
+	{ "datetime-fmt", DATETIME_FMT }, // 356
+	{ "basis", BASIS }, // 357
+	{ "cbl", CBL }, // 358
+	{ "constant", CONSTANT }, // 359
+	{ "copy", COPY }, // 360
+	{ "defined", DEFINED }, // 361
+	{ "enter", ENTER }, // 362
+	{ "feature", FEATURE }, // 363
+	{ "insertt", INSERTT }, // 364
+	{ "lsub", LSUB }, // 365
+	{ "parameter", PARAMETER_kw }, // 366
+	{ "override", OVERRIDE }, // 367
+	{ "ready", READY }, // 368
+	{ "reset", RESET }, // 369
+	{ "rsub", RSUB }, // 370
+	{ "service-reload", SERVICE_RELOAD }, // 371
+	{ "star-cbl", STAR_CBL }, // 372
+	{ "subscript", SUBSCRIPT }, // 373
+	{ "suppress", SUPPRESS }, // 374
+	{ "title", TITLE }, // 375
+	{ "trace", TRACE }, // 376
+	{ "use", USE }, // 377
+	{ "cobol-words", COBOL_WORDS }, // 378
+	{ "equate", EQUATE }, // 379
+	{ "undefine", UNDEFINE }, // 380
+	{ "cdf-define", CDF_DEFINE }, // 381
+	{ "cdf-display", CDF_DISPLAY }, // 382
+	{ "cdf-if", CDF_IF }, // 383
+	{ "cdf-else", CDF_ELSE }, // 384
+	{ "cdf-end-if", CDF_END_IF }, // 385
+	{ "cdf-evaluate", CDF_EVALUATE }, // 386
+	{ "cdf-when", CDF_WHEN }, // 387
+	{ "cdf-end-evaluate", CDF_END_EVALUATE }, // 388
+	{ "call-cobol", CALL_COBOL }, // 389
+	{ "call-verbatim", CALL_VERBATIM }, // 390
+	{ "if", IF }, // 391
+	{ "then", THEN }, // 392
+	{ "else", ELSE }, // 393
+	{ "sentence", SENTENCE }, // 394
+	{ "accept", ACCEPT }, // 395
+	{ "add", ADD }, // 396
+	{ "alter", ALTER }, // 397
+	{ "call", CALL }, // 398
+	{ "cancel", CANCEL }, // 399
+	{ "close", CLOSE }, // 400
+	{ "compute", COMPUTE }, // 401
+	{ "continue", CONTINUE }, // 402
+	{ "delete", DELETE }, // 403
+	{ "display", DISPLAY }, // 404
+	{ "divide", DIVIDE }, // 405
+	{ "evaluate", EVALUATE }, // 406
+	{ "exit", EXIT }, // 407
+	{ "filler", FILLER_kw }, // 408
+	{ "goback", GOBACK }, // 409
+	{ "goto", GOTO }, // 410
+	{ "initialize", INITIALIZE }, // 411
+	{ "inspect", INSPECT }, // 412
+	{ "merge", MERGE }, // 413
+	{ "move", MOVE }, // 414
+	{ "multiply", MULTIPLY }, // 415
+	{ "open", OPEN }, // 416
+	{ "paragraph", PARAGRAPH }, // 417
+	{ "read", READ }, // 418
+	{ "release", RELEASE }, // 419
+	{ "return", RETURN }, // 420
+	{ "rewrite", REWRITE }, // 421
+	{ "search", SEARCH }, // 422
+	{ "set", SET }, // 423
+	{ "select", SELECT }, // 424
+	{ "sort", SORT }, // 425
+	{ "sort-merge", SORT_MERGE }, // 426
+	{ "string", STRING_kw }, // 427
+	{ "stop", STOP }, // 428
+	{ "subtract", SUBTRACT }, // 429
+	{ "start", START }, // 430
+	{ "unstring", UNSTRING }, // 431
+	{ "write", WRITE }, // 432
+	{ "when", WHEN }, // 433
+	{ "abs", ABS }, // 434
+	{ "access", ACCESS }, // 435
+	{ "acos", ACOS }, // 436
+	{ "actual", ACTUAL }, // 437
+	{ "advancing", ADVANCING }, // 438
+	{ "after", AFTER }, // 439
+	{ "all", ALL }, // 440
+	{ "allocate", ALLOCATE }, // 441
+	{ "alphabet", ALPHABET }, // 442
+	{ "alphabetic", ALPHABETIC }, // 443
+	{ "alphabetic-lower", ALPHABETIC_LOWER }, // 444
+	{ "alphabetic-upper", ALPHABETIC_UPPER }, // 445
+	{ "alphanumeric", ALPHANUMERIC }, // 446
+	{ "alphanumeric-edited", ALPHANUMERIC_EDITED }, // 447
+	{ "also", ALSO }, // 448
+	{ "alternate", ALTERNATE }, // 449
+	{ "annuity", ANNUITY }, // 450
+	{ "anum", ANUM }, // 451
+	{ "any", ANY }, // 452
+	{ "anycase", ANYCASE }, // 453
+	{ "apply", APPLY }, // 454
+	{ "are", ARE }, // 455
+	{ "area", AREA }, // 456
+	{ "areas", AREAS }, // 457
+	{ "as", AS }, // 458
+	{ "ascending", ASCENDING }, // 459
+	{ "activating", ACTIVATING }, // 460
+	{ "asin", ASIN }, // 461
+	{ "assign", ASSIGN }, // 462
+	{ "at", AT }, // 463
+	{ "atan", ATAN }, // 464
+	{ "based", BASED }, // 465
+	{ "baseconvert", BASECONVERT }, // 466
+	{ "before", BEFORE }, // 467
+	{ "binary", BINARY }, // 468
+	{ "bit", BIT }, // 469
+	{ "bit-of", BIT_OF }, // 470
+	{ "bit-to-char", BIT_TO_CHAR }, // 471
+	{ "blank", BLANK }, // 472
+	{ "block", BLOCK }, // 473
+	{ "boolean-of-integer", BOOLEAN_OF_INTEGER }, // 474
+	{ "bottom", BOTTOM }, // 475
+	{ "by", BY }, // 476
+	{ "byte", BYTE }, // 477
+	{ "byte-length", BYTE_LENGTH }, // 478
+	{ "cf", CF }, // 479
+	{ "ch", CH }, // 480
+	{ "changed", CHANGED }, // 481
+	{ "char", CHAR }, // 482
+	{ "char-national", CHAR_NATIONAL }, // 483
+	{ "character", CHARACTER }, // 484
+	{ "characters", CHARACTERS }, // 485
+	{ "checking", CHECKING }, // 486
+	{ "class", CLASS }, // 487
+	{ "cobol", COBOL }, // 488
+	{ "code", CODE }, // 489
+	{ "code-set", CODESET }, // 490
+	{ "collating", COLLATING }, // 491
+	{ "column", COLUMN }, // 492
+	{ "combined-datetime", COMBINED_DATETIME }, // 493
+	{ "comma", COMMA }, // 494
+	{ "command-line", COMMAND_LINE }, // 495
+	{ "command-line-count", COMMAND_LINE_COUNT }, // 496
+	{ "commit", COMMIT }, // 497
+	{ "common", COMMON }, // 498
+	{ "concat", CONCAT }, // 499
+	{ "condition", CONDITION }, // 500
+	{ "configuration", CONFIGURATION_SECT }, // 501
+	{ "contains", CONTAINS }, // 502
+	{ "content", CONTENT }, // 503
+	{ "control", CONTROL }, // 504
+	{ "controls", CONTROLS }, // 505
+	{ "convert", CONVERT }, // 506
+	{ "converting", CONVERTING }, // 507
+	{ "corresponding", CORRESPONDING }, // 508
+	{ "cos", COS }, // 509
+	{ "count", COUNT }, // 510
+	{ "currency", CURRENCY }, // 511
+	{ "current", CURRENT }, // 512
+	{ "current-date", CURRENT_DATE }, // 513
+	{ "data", DATA }, // 514
+	{ "date", DATE }, // 515
+	{ "date-compiled", DATE_COMPILED }, // 516
+	{ "date-of-integer", DATE_OF_INTEGER }, // 517
+	{ "date-to-yyyymmdd", DATE_TO_YYYYMMDD }, // 518
+	{ "date-written", DATE_WRITTEN }, // 519
+	{ "day", DAY }, // 520
+	{ "day-of-integer", DAY_OF_INTEGER }, // 521
+	{ "day-of-week", DAY_OF_WEEK }, // 522
+	{ "day-to-yyyyddd", DAY_TO_YYYYDDD }, // 523
+	{ "dbcs", DBCS }, // 524
+	{ "de", DE }, // 525
+	{ "debugging", DEBUGGING }, // 526
+	{ "decimal-point", DECIMAL_POINT }, // 527
+	{ "declaratives", DECLARATIVES }, // 528
+	{ "default", DEFAULT }, // 529
+	{ "delimited", DELIMITED }, // 530
+	{ "delimiter", DELIMITER }, // 531
+	{ "depending", DEPENDING }, // 532
+	{ "descending", DESCENDING }, // 533
+	{ "detail", DETAIL }, // 534
+	{ "direct", DIRECT }, // 535
+	{ "direct-access", DIRECT_ACCESS }, // 536
+	{ "down", DOWN }, // 537
+	{ "duplicates", DUPLICATES }, // 538
+	{ "dynamic", DYNAMIC }, // 539
+	{ "e", E }, // 540
+	{ "ebcdic", EBCDIC }, // 541
+	{ "ec", EC }, // 542
+	{ "egcs", EGCS }, // 543
+	{ "entry", ENTRY }, // 544
+	{ "environment", ENVIRONMENT }, // 545
+	{ "equal", EQUAL }, // 546
+	{ "every", EVERY }, // 547
+	{ "examine", EXAMINE }, // 548
+	{ "exhibit", EXHIBIT }, // 549
+	{ "exp", EXP }, // 550
+	{ "exp10", EXP10 }, // 551
+	{ "extend", EXTEND }, // 552
+	{ "external", EXTERNAL }, // 553
+	{ "exception-file", EXCEPTION_FILE }, // 554
+	{ "exception-file-n", EXCEPTION_FILE_N }, // 555
+	{ "exception-location", EXCEPTION_LOCATION }, // 556
+	{ "exception-location-n", EXCEPTION_LOCATION_N }, // 557
+	{ "exception-statement", EXCEPTION_STATEMENT }, // 558
+	{ "exception-status", EXCEPTION_STATUS }, // 559
+	{ "factorial", FACTORIAL }, // 560
+	{ "false", FALSE_kw }, // 561
+	{ "fd", FD }, // 562
+	{ "file-control", FILE_CONTROL }, // 563
+	{ "file", FILE_KW }, // 564
+	{ "file-limit", FILE_LIMIT }, // 565
+	{ "final", FINAL }, // 566
+	{ "finally", FINALLY }, // 567
+	{ "find-string", FIND_STRING }, // 568
+	{ "first", FIRST }, // 569
+	{ "fixed", FIXED }, // 570
+	{ "footing", FOOTING }, // 571
+	{ "for", FOR }, // 572
+	{ "formatted-current-date", FORMATTED_CURRENT_DATE }, // 573
+	{ "formatted-date", FORMATTED_DATE }, // 574
+	{ "formatted-datetime", FORMATTED_DATETIME }, // 575
+	{ "formatted-time", FORMATTED_TIME }, // 576
+	{ "form-overflow", FORM_OVERFLOW }, // 577
+	{ "free", FREE }, // 578
+	{ "fraction-part", FRACTION_PART }, // 579
+	{ "from", FROM }, // 580
+	{ "function", FUNCTION }, // 581
+	{ "generate", GENERATE }, // 582
+	{ "giving", GIVING }, // 583
+	{ "global", GLOBAL }, // 584
+	{ "go", GO }, // 585
+	{ "group", GROUP }, // 586
+	{ "heading", HEADING }, // 587
+	{ "hex", HEX }, // 588
+	{ "hex-of", HEX_OF }, // 589
+	{ "hex-to-char", HEX_TO_CHAR }, // 590
+	{ "high-values", HIGH_VALUES }, // 591
+	{ "highest-algebraic", HIGHEST_ALGEBRAIC }, // 592
+	{ "hold", HOLD }, // 593
+	{ "ibm-360", IBM_360 }, // 594
+	{ "in", IN }, // 595
+	{ "include", INCLUDE }, // 596
+	{ "index", INDEX }, // 597
+	{ "indexed", INDEXED }, // 598
+	{ "indicate", INDICATE }, // 599
+	{ "initial", INITIAL_kw }, // 600
+	{ "initiate", INITIATE }, // 601
+	{ "input", INPUT }, // 602
+	{ "installation", INSTALLATION }, // 603
+	{ "interface", INTERFACE }, // 604
+	{ "integer", INTEGER }, // 605
+	{ "integer-of-boolean", INTEGER_OF_BOOLEAN }, // 606
+	{ "integer-of-date", INTEGER_OF_DATE }, // 607
+	{ "integer-of-day", INTEGER_OF_DAY }, // 608
+	{ "integer-of-formatted-date", INTEGER_OF_FORMATTED_DATE }, // 609
+	{ "integer-part", INTEGER_PART }, // 610
+	{ "into", INTO }, // 611
+	{ "intrinsic", INTRINSIC }, // 612
+	{ "invoke", INVOKE }, // 613
+	{ "i-o", IO }, // 614
+	{ "i-o-control", IO_CONTROL }, // 615
+	{ "is", IS }, // 616
+	{ "isnt", ISNT }, // 617
+	{ "kanji", KANJI }, // 618
+	{ "key", KEY }, // 619
+	{ "label", LABEL }, // 620
+	{ "last", LAST }, // 621
+	{ "leading", LEADING }, // 622
+	{ "left", LEFT }, // 623
+	{ "length", LENGTH }, // 624
+	{ "length-of", LENGTH_OF }, // 625
+	{ "limit", LIMIT }, // 626
+	{ "limits", LIMITS }, // 627
+	{ "line", LINE }, // 628
+	{ "lines", LINES }, // 629
+	{ "line-counter", LINE_COUNTER }, // 630
+	{ "linage", LINAGE }, // 631
+	{ "linkage", LINKAGE }, // 632
+	{ "locale", LOCALE }, // 633
+	{ "locale-compare", LOCALE_COMPARE }, // 634
+	{ "locale-date", LOCALE_DATE }, // 635
+	{ "locale-time", LOCALE_TIME }, // 636
+	{ "locale-time-from-seconds", LOCALE_TIME_FROM_SECONDS }, // 637
+	{ "local-storage", LOCAL_STORAGE }, // 638
+	{ "location", LOCATION }, // 639
+	{ "lock", LOCK }, // 640
+	{ "lock-on", LOCK_ON }, // 641
+	{ "log", LOG }, // 642
+	{ "log10", LOG10 }, // 643
+	{ "lower-case", LOWER_CASE }, // 644
+	{ "low-values", LOW_VALUES }, // 645
+	{ "lowest-algebraic", LOWEST_ALGEBRAIC }, // 646
+	{ "lparen", LPAREN }, // 647
+	{ "manual", MANUAL }, // 648
+	{ "maxx", MAXX }, // 649
+	{ "mean", MEAN }, // 650
+	{ "median", MEDIAN }, // 651
+	{ "midrange", MIDRANGE }, // 652
+	{ "minn", MINN }, // 653
+	{ "multiple", MULTIPLE }, // 654
+	{ "mod", MOD }, // 655
+	{ "mode", MODE }, // 656
+	{ "module-name", MODULE_NAME }, // 657
+	{ "named", NAMED }, // 658
+	{ "nat", NAT }, // 659
+	{ "national", NATIONAL }, // 660
+	{ "national-edited", NATIONAL_EDITED }, // 661
+	{ "national-of", NATIONAL_OF }, // 662
+	{ "native", NATIVE }, // 663
+	{ "nested", NESTED }, // 664
+	{ "next", NEXT }, // 665
+	{ "no", NO }, // 666
+	{ "note", NOTE }, // 667
+	{ "nulls", NULLS }, // 668
+	{ "null", NULLS }, // 668
+	{ "nullptr", NULLPTR }, // 669
+	{ "numeric", NUMERIC }, // 670
+	{ "numeric-edited", NUMERIC_EDITED }, // 671
+	{ "numval", NUMVAL }, // 672
+	{ "numval-c", NUMVAL_C }, // 673
+	{ "numval-f", NUMVAL_F }, // 674
+	{ "occurs", OCCURS }, // 675
+	{ "of", OF }, // 676
+	{ "off", OFF }, // 677
+	{ "omitted", OMITTED }, // 678
+	{ "on", ON }, // 679
+	{ "only", ONLY }, // 680
+	{ "optional", OPTIONAL }, // 681
+	{ "options", OPTIONS }, // 682
+	{ "ord", ORD }, // 683
+	{ "order", ORDER }, // 684
+	{ "ord-max", ORD_MAX }, // 685
+	{ "ord-min", ORD_MIN }, // 686
+	{ "organization", ORGANIZATION }, // 687
+	{ "other", OTHER }, // 688
+	{ "otherwise", OTHERWISE }, // 689
+	{ "output", OUTPUT }, // 690
+	{ "packed-decimal", PACKED_DECIMAL }, // 691
+	{ "padding", PADDING }, // 692
+	{ "page", PAGE }, // 693
+	{ "page-counter", PAGE_COUNTER }, // 694
+	{ "pf", PF }, // 695
+	{ "ph", PH }, // 696
+	{ "pi", PI }, // 697
+	{ "pic", PIC }, // 698
+	{ "pic", PICTURE }, // 699
+	{ "plus", PLUS }, // 700
+	{ "present-value", PRESENT_VALUE }, // 701
+	{ "print-switch", PRINT_SWITCH }, // 702
+	{ "procedure", PROCEDURE }, // 703
+	{ "procedures", PROCEDURES }, // 704
+	{ "proceed", PROCEED }, // 705
+	{ "process", PROCESS }, // 706
+	{ "program-id", PROGRAM_ID }, // 707
+	{ "program", PROGRAM_kw }, // 708
+	{ "property", PROPERTY }, // 709
+	{ "prototype", PROTOTYPE }, // 710
+	{ "pseudotext", PSEUDOTEXT }, // 711
+	{ "quote", QUOTE }, // 712
+	{ "quote", QUOTES }, // 713
+	{ "random", RANDOM }, // 714
+	{ "random-seed", RANDOM_SEED }, // 715
+	{ "range", RANGE }, // 716
+	{ "raise", RAISE }, // 717
+	{ "raising", RAISING }, // 718
+	{ "rd", RD }, // 719
+	{ "record", RECORD }, // 720
+	{ "recording", RECORDING }, // 721
+	{ "records", RECORDS }, // 722
+	{ "recursive", RECURSIVE }, // 723
+	{ "redefines", REDEFINES }, // 724
+	{ "reel", REEL }, // 725
+	{ "reference", REFERENCE }, // 726
+	{ "relative", RELATIVE }, // 727
+	{ "rem", REM }, // 728
+	{ "remainder", REMAINDER }, // 729
+	{ "remarks", REMARKS }, // 730
+	{ "removal", REMOVAL }, // 731
+	{ "renames", RENAMES }, // 732
+	{ "replace", REPLACE }, // 733
+	{ "replacing", REPLACING }, // 734
+	{ "report", REPORT }, // 735
+	{ "reporting", REPORTING }, // 736
+	{ "reports", REPORTS }, // 737
+	{ "repository", REPOSITORY }, // 738
+	{ "rerun", RERUN }, // 739
+	{ "reserve", RESERVE }, // 740
+	{ "restricted", RESTRICTED }, // 741
+	{ "resume", RESUME }, // 742
+	{ "reverse", REVERSE }, // 743
+	{ "reversed", REVERSED }, // 744
+	{ "rewind", REWIND }, // 745
+	{ "rf", RF }, // 746
+	{ "rh", RH }, // 747
+	{ "right", RIGHT }, // 748
+	{ "rounded", ROUNDED }, // 749
+	{ "run", RUN }, // 750
+	{ "same", SAME }, // 751
+	{ "screen", SCREEN }, // 752
+	{ "sd", SD }, // 753
+	{ "seconds-from-formatted-time", SECONDS_FROM_FORMATTED_TIME }, // 754
+	{ "seconds-past-midnight", SECONDS_PAST_MIDNIGHT }, // 755
+	{ "security", SECURITY }, // 756
+	{ "separate", SEPARATE }, // 757
+	{ "sequence", SEQUENCE }, // 758
+	{ "sequential", SEQUENTIAL }, // 759
+	{ "sharing", SHARING }, // 760
+	{ "simple-exit", SIMPLE_EXIT }, // 761
+	{ "sign", SIGN }, // 762
+	{ "sin", SIN }, // 763
+	{ "size", SIZE }, // 764
+	{ "smallest-algebraic", SMALLEST_ALGEBRAIC }, // 765
+	{ "source", SOURCE }, // 766
+	{ "source-computer", SOURCE_COMPUTER }, // 767
+	{ "special-names", SPECIAL_NAMES }, // 768
+	{ "sqrt", SQRT }, // 769
+	{ "stack", STACK }, // 770
+	{ "standard", STANDARD }, // 771
+	{ "standard-1", STANDARD_1 }, // 772
+	{ "standard-deviation", STANDARD_DEVIATION }, // 773
+	{ "standard-compare", STANDARD_COMPARE }, // 774
+	{ "status", STATUS }, // 775
+	{ "strong", STRONG }, // 776
+	{ "substitute", SUBSTITUTE }, // 777
+	{ "sum", SUM }, // 778
+	{ "symbol", SYMBOL }, // 779
+	{ "symbolic", SYMBOLIC }, // 780
+	{ "synchronized", SYNCHRONIZED }, // 781
+	{ "tally", TALLY }, // 782
+	{ "tallying", TALLYING }, // 783
+	{ "tan", TAN }, // 784
+	{ "terminate", TERMINATE }, // 785
+	{ "test", TEST }, // 786
+	{ "test-date-yyyymmdd", TEST_DATE_YYYYMMDD }, // 787
+	{ "test-day-yyyyddd", TEST_DAY_YYYYDDD }, // 788
+	{ "test-formatted-datetime", TEST_FORMATTED_DATETIME }, // 789
+	{ "test-numval", TEST_NUMVAL }, // 790
+	{ "test-numval-c", TEST_NUMVAL_C }, // 791
+	{ "test-numval-f", TEST_NUMVAL_F }, // 792
+	{ "than", THAN }, // 793
+	{ "time", TIME }, // 794
+	{ "times", TIMES }, // 795
+	{ "to", TO }, // 796
+	{ "top", TOP }, // 797
+	{ "top-level", TOP_LEVEL }, // 798
+	{ "tracks", TRACKS }, // 799
+	{ "track-area", TRACK_AREA }, // 800
+	{ "trailing", TRAILING }, // 801
+	{ "transform", TRANSFORM }, // 802
+	{ "trim", TRIM }, // 803
+	{ "true", TRUE_kw }, // 804
+	{ "try", TRY }, // 805
+	{ "turn", TURN }, // 806
+	{ "type", TYPE }, // 807
+	{ "typedef", TYPEDEF }, // 808
+	{ "ulength", ULENGTH }, // 809
+	{ "unbounded", UNBOUNDED }, // 810
+	{ "unit", UNIT }, // 811
+	{ "units", UNITS }, // 812
+	{ "unit-record", UNIT_RECORD }, // 813
+	{ "until", UNTIL }, // 814
+	{ "up", UP }, // 815
+	{ "upon", UPON }, // 816
+	{ "upos", UPOS }, // 817
+	{ "upper-case", UPPER_CASE }, // 818
+	{ "usage", USAGE }, // 819
+	{ "using", USING }, // 820
+	{ "usubstr", USUBSTR }, // 821
+	{ "usupplementary", USUPPLEMENTARY }, // 822
+	{ "utility", UTILITY }, // 823
+	{ "uuid4", UUID4 }, // 824
+	{ "uvalid", UVALID }, // 825
+	{ "uwidth", UWIDTH }, // 826
+	{ "value", VALUE }, // 827
+	{ "variance", VARIANCE }, // 828
+	{ "varying", VARYING }, // 829
+	{ "volatile", VOLATILE }, // 830
+	{ "when-compiled", WHEN_COMPILED }, // 831
+	{ "with", WITH }, // 832
+	{ "working-storage", WORKING_STORAGE }, // 833
+	{ "xml", XML }, // 834
+	{ "xmlgenerate", XMLGENERATE }, // 835
+	{ "xmlparse", XMLPARSE }, // 836
+	{ "year-to-yyyy", YEAR_TO_YYYY }, // 837
+	{ "yyyyddd", YYYYDDD }, // 838
+	{ "yyyymmdd", YYYYMMDD }, // 839
+	{ "arithmetic", ARITHMETIC }, // 840
+	{ "attribute", ATTRIBUTE }, // 841
+	{ "auto", AUTO }, // 842
+	{ "automatic", AUTOMATIC }, // 843
+	{ "away-from-zero", AWAY_FROM_ZERO }, // 844
+	{ "background-color", BACKGROUND_COLOR }, // 845
+	{ "bell", BELL }, // 846
+	{ "binary-encoding", BINARY_ENCODING }, // 847
+	{ "blink", BLINK }, // 848
+	{ "capacity", CAPACITY }, // 849
+	{ "center", CENTER }, // 850
+	{ "classification", CLASSIFICATION }, // 851
+	{ "cycle", CYCLE }, // 852
+	{ "decimal-encoding", DECIMAL_ENCODING }, // 853
+	{ "entry-convention", ENTRY_CONVENTION }, // 854
+	{ "eol", EOL }, // 855
+	{ "eos", EOS }, // 856
+	{ "erase", ERASE }, // 857
+	{ "expands", EXPANDS }, // 858
+	{ "float-binary", FLOAT_BINARY }, // 859
+	{ "float-decimal", FLOAT_DECIMAL }, // 860
+	{ "foreground-color", FOREGROUND_COLOR }, // 861
+	{ "forever", FOREVER }, // 862
+	{ "full", FULL }, // 863
+	{ "highlight", HIGHLIGHT }, // 864
+	{ "high-order-left", HIGH_ORDER_LEFT }, // 865
+	{ "high-order-right", HIGH_ORDER_RIGHT }, // 866
+	{ "ignoring", IGNORING }, // 867
+	{ "implements", IMPLEMENTS }, // 868
+	{ "initialized", INITIALIZED }, // 869
+	{ "intermediate", INTERMEDIATE }, // 870
+	{ "lc-all", LC_ALL_kw }, // 871
+	{ "lc-collate", LC_COLLATE_kw }, // 872
+	{ "lc-ctype", LC_CTYPE_kw }, // 873
+	{ "lc-messages", LC_MESSAGES_kw }, // 874
+	{ "lc-monetary", LC_MONETARY_kw }, // 875
+	{ "lc-numeric", LC_NUMERIC_kw }, // 876
+	{ "lc-time", LC_TIME_kw }, // 877
+	{ "lowlight", LOWLIGHT }, // 878
+	{ "nearest-away-from-zero", NEAREST_AWAY_FROM_ZERO }, // 879
+	{ "nearest-even", NEAREST_EVEN }, // 880
+	{ "nearest-toward-zero", NEAREST_TOWARD_ZERO }, // 881
+	{ "none", NONE }, // 882
+	{ "normal", NORMAL }, // 883
+	{ "numbers", NUMBERS }, // 884
+	{ "prefixed", PREFIXED }, // 885
+	{ "previous", PREVIOUS }, // 886
+	{ "prohibited", PROHIBITED }, // 887
+	{ "relation", RELATION }, // 888
+	{ "required", REQUIRED }, // 889
+	{ "reverse-video", REVERSE_VIDEO }, // 890
+	{ "rounding", ROUNDING }, // 891
+	{ "seconds", SECONDS }, // 892
+	{ "secure", SECURE }, // 893
+	{ "short", SHORT }, // 894
+	{ "signed", SIGNED }, // 895
+	{ "standard-binary", STANDARD_BINARY }, // 896
+	{ "standard-decimal", STANDARD_DECIMAL }, // 897
+	{ "statement", STATEMENT }, // 898
+	{ "step", STEP }, // 899
+	{ "structure", STRUCTURE }, // 900
+	{ "toward-greater", TOWARD_GREATER }, // 901
+	{ "toward-lesser", TOWARD_LESSER }, // 902
+	{ "truncation", TRUNCATION }, // 903
+	{ "ucs-4", UCS_4 }, // 904
+	{ "underline", UNDERLINE }, // 905
+	{ "unsigned", UNSIGNED }, // 906
+	{ "utf-16", UTF_16 }, // 907
+	{ "utf-8", UTF_8 }, // 908
+	{ "address", ADDRESS }, // 909
+	{ "end-accept", END_ACCEPT }, // 910
+	{ "end-add", END_ADD }, // 911
+	{ "end-call", END_CALL }, // 912
+	{ "end-compute", END_COMPUTE }, // 913
+	{ "end-delete", END_DELETE }, // 914
+	{ "end-display", END_DISPLAY }, // 915
+	{ "end-divide", END_DIVIDE }, // 916
+	{ "end-evaluate", END_EVALUATE }, // 917
+	{ "end-multiply", END_MULTIPLY }, // 918
+	{ "end-perform", END_PERFORM }, // 919
+	{ "end-read", END_READ }, // 920
+	{ "end-return", END_RETURN }, // 921
+	{ "end-rewrite", END_REWRITE }, // 922
+	{ "end-search", END_SEARCH }, // 923
+	{ "end-start", END_START }, // 924
+	{ "end-string", END_STRING }, // 925
+	{ "end-subtract", END_SUBTRACT }, // 926
+	{ "end-unstring", END_UNSTRING }, // 927
+	{ "end-write", END_WRITE }, // 928
+	{ "end-if", END_IF }, // 929
+	{ "through", THRU }, // 930
+	{ "or", OR }, // 931
+	{ "and", AND }, // 932
+	{ "not", NOT }, // 933
+	{ "ne", NE }, // 934
+	{ "le", LE }, // 935
+	{ "ge", GE }, // 936
+	{ "pow", POW }, // 937
+	{ "neg", NEG }, // 938
+};
+
+token_names = {
+	"identification", // 0 (258)
+	"environment", // 1 (259)
+	"procedure", // 2 (260)
+	"data", // 3 (261)
+	"file", // 4 (262)
+	"input-output", // 5 (263)
+	"linkage", // 6 (264)
+	"local-storage", // 7 (265)
+	"working-storage", // 8 (266)
+	"object-computer", // 9 (267)
+	"display-of", // 10 (268)
+	"end-function", // 11 (269)
+	"end-program", // 12 (270)
+	"end-subprogram", // 13 (271)
+	"justified", // 14 (272)
+	"returning", // 15 (273)
+	"no-condition", // 16 (274)
+	"alnum", // 17 (275)
+	"alphed", // 18 (276)
+	"error", // 19 (277)
+	"exception", // 20 (278)
+	"size-error", // 21 (279)
+	"exception-name", // 22 (280)
+	"level", // 23 (281)
+	"level66", // 24 (282)
+	"level78", // 25 (283)
+	"level88", // 26 (284)
+	"class-name", // 27 (285)
+	"name", // 28 (286)
+	"name88", // 29 (287)
+	"nume", // 30 (288)
+	"numed", // 31 (289)
+	"numed-cr", // 32 (290)
+	"numed-db", // 33 (291)
+	"ninedot", // 34 (292)
+	"nines", // 35 (293)
+	"ninev", // 36 (294)
+	"pic-p", // 37 (295)
+	"space", // 38 (296)
+	"literal", // 39 (297)
+	"end", // 40 (298)
+	"eop", // 41 (299)
+	"filename", // 42 (300)
+	"invalid", // 43 (301)
+	"number", // 44 (302)
+	"negative", // 45 (303)
+	"numstr", // 46 (304)
+	"overflow", // 47 (305)
+	"computational", // 48 (306)
+	"perform", // 49 (307)
+	"backward", // 50 (308)
+	"positive", // 51 (309)
+	"pointer", // 52 (310)
+	"section", // 53 (311)
+	"standard-alphabet", // 54 (312)
+	"switch", // 55 (313)
+	"upsi", // 56 (314)
+	"zero", // 57 (315)
+	"sysin", // 58 (316)
+	"sysipt", // 59 (317)
+	"sysout", // 60 (318)
+	"syslist", // 61 (319)
+	"syslst", // 62 (320)
+	"syspunch", // 63 (321)
+	"syspch", // 64 (322)
+	"console", // 65 (323)
+	"c01", // 66 (324)
+	"c02", // 67 (325)
+	"c03", // 68 (326)
+	"c04", // 69 (327)
+	"c05", // 70 (328)
+	"c06", // 71 (329)
+	"c07", // 72 (330)
+	"c08", // 73 (331)
+	"c09", // 74 (332)
+	"c10", // 75 (333)
+	"c11", // 76 (334)
+	"c12", // 77 (335)
+	"csp", // 78 (336)
+	"s01", // 79 (337)
+	"s02", // 80 (338)
+	"s03", // 81 (339)
+	"s04", // 82 (340)
+	"s05", // 83 (341)
+	"afp-5a", // 84 (342)
+	"stdin", // 85 (343)
+	"stdout", // 86 (344)
+	"stderr", // 87 (345)
+	"list", // 88 (346)
+	"map", // 89 (347)
+	"nolist", // 90 (348)
+	"nomap", // 91 (349)
+	"nosource", // 92 (350)
+	"might-be", // 93 (351)
+	"function-udf", // 94 (352)
+	"function-udf-0", // 95 (353)
+	"date-fmt", // 96 (354)
+	"time-fmt", // 97 (355)
+	"datetime-fmt", // 98 (356)
+	"basis", // 99 (357)
+	"cbl", // 100 (358)
+	"constant", // 101 (359)
+	"copy", // 102 (360)
+	"defined", // 103 (361)
+	"enter", // 104 (362)
+	"feature", // 105 (363)
+	"insertt", // 106 (364)
+	"lsub", // 107 (365)
+	"parameter", // 108 (366)
+	"override", // 109 (367)
+	"ready", // 110 (368)
+	"reset", // 111 (369)
+	"rsub", // 112 (370)
+	"service-reload", // 113 (371)
+	"star-cbl", // 114 (372)
+	"subscript", // 115 (373)
+	"suppress", // 116 (374)
+	"title", // 117 (375)
+	"trace", // 118 (376)
+	"use", // 119 (377)
+	"cobol-words", // 120 (378)
+	"equate", // 121 (379)
+	"undefine", // 122 (380)
+	"cdf-define", // 123 (381)
+	"cdf-display", // 124 (382)
+	"cdf-if", // 125 (383)
+	"cdf-else", // 126 (384)
+	"cdf-end-if", // 127 (385)
+	"cdf-evaluate", // 128 (386)
+	"cdf-when", // 129 (387)
+	"cdf-end-evaluate", // 130 (388)
+	"call-cobol", // 131 (389)
+	"call-verbatim", // 132 (390)
+	"if", // 133 (391)
+	"then", // 134 (392)
+	"else", // 135 (393)
+	"sentence", // 136 (394)
+	"accept", // 137 (395)
+	"add", // 138 (396)
+	"alter", // 139 (397)
+	"call", // 140 (398)
+	"cancel", // 141 (399)
+	"close", // 142 (400)
+	"compute", // 143 (401)
+	"continue", // 144 (402)
+	"delete", // 145 (403)
+	"display", // 146 (404)
+	"divide", // 147 (405)
+	"evaluate", // 148 (406)
+	"exit", // 149 (407)
+	"filler", // 150 (408)
+	"goback", // 151 (409)
+	"goto", // 152 (410)
+	"initialize", // 153 (411)
+	"inspect", // 154 (412)
+	"merge", // 155 (413)
+	"move", // 156 (414)
+	"multiply", // 157 (415)
+	"open", // 158 (416)
+	"paragraph", // 159 (417)
+	"read", // 160 (418)
+	"release", // 161 (419)
+	"return", // 162 (420)
+	"rewrite", // 163 (421)
+	"search", // 164 (422)
+	"set", // 165 (423)
+	"select", // 166 (424)
+	"sort", // 167 (425)
+	"sort-merge", // 168 (426)
+	"string", // 169 (427)
+	"stop", // 170 (428)
+	"subtract", // 171 (429)
+	"start", // 172 (430)
+	"unstring", // 173 (431)
+	"write", // 174 (432)
+	"when", // 175 (433)
+	"abs", // 176 (434)
+	"access", // 177 (435)
+	"acos", // 178 (436)
+	"actual", // 179 (437)
+	"advancing", // 180 (438)
+	"after", // 181 (439)
+	"all", // 182 (440)
+	"allocate", // 183 (441)
+	"alphabet", // 184 (442)
+	"alphabetic", // 185 (443)
+	"alphabetic-lower", // 186 (444)
+	"alphabetic-upper", // 187 (445)
+	"alphanumeric", // 188 (446)
+	"alphanumeric-edited", // 189 (447)
+	"also", // 190 (448)
+	"alternate", // 191 (449)
+	"annuity", // 192 (450)
+	"anum", // 193 (451)
+	"any", // 194 (452)
+	"anycase", // 195 (453)
+	"apply", // 196 (454)
+	"are", // 197 (455)
+	"area", // 198 (456)
+	"areas", // 199 (457)
+	"as", // 200 (458)
+	"ascending", // 201 (459)
+	"activating", // 202 (460)
+	"asin", // 203 (461)
+	"assign", // 204 (462)
+	"at", // 205 (463)
+	"atan", // 206 (464)
+	"based", // 207 (465)
+	"baseconvert", // 208 (466)
+	"before", // 209 (467)
+	"binary", // 210 (468)
+	"bit", // 211 (469)
+	"bit-of", // 212 (470)
+	"bit-to-char", // 213 (471)
+	"blank", // 214 (472)
+	"block", // 215 (473)
+	"boolean-of-integer", // 216 (474)
+	"bottom", // 217 (475)
+	"by", // 218 (476)
+	"byte", // 219 (477)
+	"byte-length", // 220 (478)
+	"cf", // 221 (479)
+	"ch", // 222 (480)
+	"changed", // 223 (481)
+	"char", // 224 (482)
+	"char-national", // 225 (483)
+	"character", // 226 (484)
+	"characters", // 227 (485)
+	"checking", // 228 (486)
+	"class", // 229 (487)
+	"cobol", // 230 (488)
+	"code", // 231 (489)
+	"code-set", // 232 (490)
+	"collating", // 233 (491)
+	"column", // 234 (492)
+	"combined-datetime", // 235 (493)
+	"comma", // 236 (494)
+	"command-line", // 237 (495)
+	"command-line-count", // 238 (496)
+	"commit", // 239 (497)
+	"common", // 240 (498)
+	"concat", // 241 (499)
+	"condition", // 242 (500)
+	"configuration", // 243 (501)
+	"contains", // 244 (502)
+	"content", // 245 (503)
+	"control", // 246 (504)
+	"controls", // 247 (505)
+	"convert", // 248 (506)
+	"converting", // 249 (507)
+	"corresponding", // 250 (508)
+	"cos", // 251 (509)
+	"count", // 252 (510)
+	"currency", // 253 (511)
+	"current", // 254 (512)
+	"current-date", // 255 (513)
+	"data", // 256 (514)
+	"date", // 257 (515)
+	"date-compiled", // 258 (516)
+	"date-of-integer", // 259 (517)
+	"date-to-yyyymmdd", // 260 (518)
+	"date-written", // 261 (519)
+	"day", // 262 (520)
+	"day-of-integer", // 263 (521)
+	"day-of-week", // 264 (522)
+	"day-to-yyyyddd", // 265 (523)
+	"dbcs", // 266 (524)
+	"de", // 267 (525)
+	"debugging", // 268 (526)
+	"decimal-point", // 269 (527)
+	"declaratives", // 270 (528)
+	"default", // 271 (529)
+	"delimited", // 272 (530)
+	"delimiter", // 273 (531)
+	"depending", // 274 (532)
+	"descending", // 275 (533)
+	"detail", // 276 (534)
+	"direct", // 277 (535)
+	"direct-access", // 278 (536)
+	"down", // 279 (537)
+	"duplicates", // 280 (538)
+	"dynamic", // 281 (539)
+	"e", // 282 (540)
+	"ebcdic", // 283 (541)
+	"ec", // 284 (542)
+	"egcs", // 285 (543)
+	"entry", // 286 (544)
+	"environment", // 287 (545)
+	"equal", // 288 (546)
+	"every", // 289 (547)
+	"examine", // 290 (548)
+	"exhibit", // 291 (549)
+	"exp", // 292 (550)
+	"exp10", // 293 (551)
+	"extend", // 294 (552)
+	"external", // 295 (553)
+	"exception-file", // 296 (554)
+	"exception-file-n", // 297 (555)
+	"exception-location", // 298 (556)
+	"exception-location-n", // 299 (557)
+	"exception-statement", // 300 (558)
+	"exception-status", // 301 (559)
+	"factorial", // 302 (560)
+	"false", // 303 (561)
+	"fd", // 304 (562)
+	"file-control", // 305 (563)
+	"file", // 306 (564)
+	"file-limit", // 307 (565)
+	"final", // 308 (566)
+	"finally", // 309 (567)
+	"find-string", // 310 (568)
+	"first", // 311 (569)
+	"fixed", // 312 (570)
+	"footing", // 313 (571)
+	"for", // 314 (572)
+	"formatted-current-date", // 315 (573)
+	"formatted-date", // 316 (574)
+	"formatted-datetime", // 317 (575)
+	"formatted-time", // 318 (576)
+	"form-overflow", // 319 (577)
+	"free", // 320 (578)
+	"fraction-part", // 321 (579)
+	"from", // 322 (580)
+	"function", // 323 (581)
+	"generate", // 324 (582)
+	"giving", // 325 (583)
+	"global", // 326 (584)
+	"go", // 327 (585)
+	"group", // 328 (586)
+	"heading", // 329 (587)
+	"hex", // 330 (588)
+	"hex-of", // 331 (589)
+	"hex-to-char", // 332 (590)
+	"high-values", // 333 (591)
+	"highest-algebraic", // 334 (592)
+	"hold", // 335 (593)
+	"ibm-360", // 336 (594)
+	"in", // 337 (595)
+	"include", // 338 (596)
+	"index", // 339 (597)
+	"indexed", // 340 (598)
+	"indicate", // 341 (599)
+	"initial", // 342 (600)
+	"initiate", // 343 (601)
+	"input", // 344 (602)
+	"installation", // 345 (603)
+	"interface", // 346 (604)
+	"integer", // 347 (605)
+	"integer-of-boolean", // 348 (606)
+	"integer-of-date", // 349 (607)
+	"integer-of-day", // 350 (608)
+	"integer-of-formatted-date", // 351 (609)
+	"integer-part", // 352 (610)
+	"into", // 353 (611)
+	"intrinsic", // 354 (612)
+	"invoke", // 355 (613)
+	"i-o", // 356 (614)
+	"i-o-control", // 357 (615)
+	"is", // 358 (616)
+	"isnt", // 359 (617)
+	"kanji", // 360 (618)
+	"key", // 361 (619)
+	"label", // 362 (620)
+	"last", // 363 (621)
+	"leading", // 364 (622)
+	"left", // 365 (623)
+	"length", // 366 (624)
+	"length-of", // 367 (625)
+	"limit", // 368 (626)
+	"limits", // 369 (627)
+	"line", // 370 (628)
+	"lines", // 371 (629)
+	"line-counter", // 372 (630)
+	"linage", // 373 (631)
+	"linkage", // 374 (632)
+	"locale", // 375 (633)
+	"locale-compare", // 376 (634)
+	"locale-date", // 377 (635)
+	"locale-time", // 378 (636)
+	"locale-time-from-seconds", // 379 (637)
+	"local-storage", // 380 (638)
+	"location", // 381 (639)
+	"lock", // 382 (640)
+	"lock-on", // 383 (641)
+	"log", // 384 (642)
+	"log10", // 385 (643)
+	"lower-case", // 386 (644)
+	"low-values", // 387 (645)
+	"lowest-algebraic", // 388 (646)
+	"lparen", // 389 (647)
+	"manual", // 390 (648)
+	"maxx", // 391 (649)
+	"mean", // 392 (650)
+	"median", // 393 (651)
+	"midrange", // 394 (652)
+	"minn", // 395 (653)
+	"multiple", // 396 (654)
+	"mod", // 397 (655)
+	"mode", // 398 (656)
+	"module-name", // 399 (657)
+	"named", // 400 (658)
+	"nat", // 401 (659)
+	"national", // 402 (660)
+	"national-edited", // 403 (661)
+	"national-of", // 404 (662)
+	"native", // 405 (663)
+	"nested", // 406 (664)
+	"next", // 407 (665)
+	"no", // 408 (666)
+	"note", // 409 (667)
+	"null", // 410 (668)
+	"nullptr", // 411 (669)
+	"numeric", // 412 (670)
+	"numeric-edited", // 413 (671)
+	"numval", // 414 (672)
+	"numval-c", // 415 (673)
+	"numval-f", // 416 (674)
+	"occurs", // 417 (675)
+	"of", // 418 (676)
+	"off", // 419 (677)
+	"omitted", // 420 (678)
+	"on", // 421 (679)
+	"only", // 422 (680)
+	"optional", // 423 (681)
+	"options", // 424 (682)
+	"ord", // 425 (683)
+	"order", // 426 (684)
+	"ord-max", // 427 (685)
+	"ord-min", // 428 (686)
+	"organization", // 429 (687)
+	"other", // 430 (688)
+	"otherwise", // 431 (689)
+	"output", // 432 (690)
+	"packed-decimal", // 433 (691)
+	"padding", // 434 (692)
+	"page", // 435 (693)
+	"page-counter", // 436 (694)
+	"pf", // 437 (695)
+	"ph", // 438 (696)
+	"pi", // 439 (697)
+	"pic", // 440 (698)
+	"pic", // 441 (699)
+	"plus", // 442 (700)
+	"present-value", // 443 (701)
+	"print-switch", // 444 (702)
+	"procedure", // 445 (703)
+	"procedures", // 446 (704)
+	"proceed", // 447 (705)
+	"process", // 448 (706)
+	"program-id", // 449 (707)
+	"program", // 450 (708)
+	"property", // 451 (709)
+	"prototype", // 452 (710)
+	"pseudotext", // 453 (711)
+	"quote", // 454 (712)
+	"quote", // 455 (713)
+	"random", // 456 (714)
+	"random-seed", // 457 (715)
+	"range", // 458 (716)
+	"raise", // 459 (717)
+	"raising", // 460 (718)
+	"rd", // 461 (719)
+	"record", // 462 (720)
+	"recording", // 463 (721)
+	"records", // 464 (722)
+	"recursive", // 465 (723)
+	"redefines", // 466 (724)
+	"reel", // 467 (725)
+	"reference", // 468 (726)
+	"relative", // 469 (727)
+	"rem", // 470 (728)
+	"remainder", // 471 (729)
+	"remarks", // 472 (730)
+	"removal", // 473 (731)
+	"renames", // 474 (732)
+	"replace", // 475 (733)
+	"replacing", // 476 (734)
+	"report", // 477 (735)
+	"reporting", // 478 (736)
+	"reports", // 479 (737)
+	"repository", // 480 (738)
+	"rerun", // 481 (739)
+	"reserve", // 482 (740)
+	"restricted", // 483 (741)
+	"resume", // 484 (742)
+	"reverse", // 485 (743)
+	"reversed", // 486 (744)
+	"rewind", // 487 (745)
+	"rf", // 488 (746)
+	"rh", // 489 (747)
+	"right", // 490 (748)
+	"rounded", // 491 (749)
+	"run", // 492 (750)
+	"same", // 493 (751)
+	"screen", // 494 (752)
+	"sd", // 495 (753)
+	"seconds-from-formatted-time", // 496 (754)
+	"seconds-past-midnight", // 497 (755)
+	"security", // 498 (756)
+	"separate", // 499 (757)
+	"sequence", // 500 (758)
+	"sequential", // 501 (759)
+	"sharing", // 502 (760)
+	"simple-exit", // 503 (761)
+	"sign", // 504 (762)
+	"sin", // 505 (763)
+	"size", // 506 (764)
+	"smallest-algebraic", // 507 (765)
+	"source", // 508 (766)
+	"source-computer", // 509 (767)
+	"special-names", // 510 (768)
+	"sqrt", // 511 (769)
+	"stack", // 512 (770)
+	"standard", // 513 (771)
+	"standard-1", // 514 (772)
+	"standard-deviation", // 515 (773)
+	"standard-compare", // 516 (774)
+	"status", // 517 (775)
+	"strong", // 518 (776)
+	"substitute", // 519 (777)
+	"sum", // 520 (778)
+	"symbol", // 521 (779)
+	"symbolic", // 522 (780)
+	"synchronized", // 523 (781)
+	"tally", // 524 (782)
+	"tallying", // 525 (783)
+	"tan", // 526 (784)
+	"terminate", // 527 (785)
+	"test", // 528 (786)
+	"test-date-yyyymmdd", // 529 (787)
+	"test-day-yyyyddd", // 530 (788)
+	"test-formatted-datetime", // 531 (789)
+	"test-numval", // 532 (790)
+	"test-numval-c", // 533 (791)
+	"test-numval-f", // 534 (792)
+	"than", // 535 (793)
+	"time", // 536 (794)
+	"times", // 537 (795)
+	"to", // 538 (796)
+	"top", // 539 (797)
+	"top-level", // 540 (798)
+	"tracks", // 541 (799)
+	"track-area", // 542 (800)
+	"trailing", // 543 (801)
+	"transform", // 544 (802)
+	"trim", // 545 (803)
+	"true", // 546 (804)
+	"try", // 547 (805)
+	"turn", // 548 (806)
+	"type", // 549 (807)
+	"typedef", // 550 (808)
+	"ulength", // 551 (809)
+	"unbounded", // 552 (810)
+	"unit", // 553 (811)
+	"units", // 554 (812)
+	"unit-record", // 555 (813)
+	"until", // 556 (814)
+	"up", // 557 (815)
+	"upon", // 558 (816)
+	"upos", // 559 (817)
+	"upper-case", // 560 (818)
+	"usage", // 561 (819)
+	"using", // 562 (820)
+	"usubstr", // 563 (821)
+	"usupplementary", // 564 (822)
+	"utility", // 565 (823)
+	"uuid4", // 566 (824)
+	"uvalid", // 567 (825)
+	"uwidth", // 568 (826)
+	"value", // 569 (827)
+	"variance", // 570 (828)
+	"varying", // 571 (829)
+	"volatile", // 572 (830)
+	"when-compiled", // 573 (831)
+	"with", // 574 (832)
+	"working-storage", // 575 (833)
+	"xml", // 576 (834)
+	"xmlgenerate", // 577 (835)
+	"xmlparse", // 578 (836)
+	"year-to-yyyy", // 579 (837)
+	"yyyyddd", // 580 (838)
+	"yyyymmdd", // 581 (839)
+	"arithmetic", // 582 (840)
+	"attribute", // 583 (841)
+	"auto", // 584 (842)
+	"automatic", // 585 (843)
+	"away-from-zero", // 586 (844)
+	"background-color", // 587 (845)
+	"bell", // 588 (846)
+	"binary-encoding", // 589 (847)
+	"blink", // 590 (848)
+	"capacity", // 591 (849)
+	"center", // 592 (850)
+	"classification", // 593 (851)
+	"cycle", // 594 (852)
+	"decimal-encoding", // 595 (853)
+	"entry-convention", // 596 (854)
+	"eol", // 597 (855)
+	"eos", // 598 (856)
+	"erase", // 599 (857)
+	"expands", // 600 (858)
+	"float-binary", // 601 (859)
+	"float-decimal", // 602 (860)
+	"foreground-color", // 603 (861)
+	"forever", // 604 (862)
+	"full", // 605 (863)
+	"highlight", // 606 (864)
+	"high-order-left", // 607 (865)
+	"high-order-right", // 608 (866)
+	"ignoring", // 609 (867)
+	"implements", // 610 (868)
+	"initialized", // 611 (869)
+	"intermediate", // 612 (870)
+	"lc-all", // 613 (871)
+	"lc-collate", // 614 (872)
+	"lc-ctype", // 615 (873)
+	"lc-messages", // 616 (874)
+	"lc-monetary", // 617 (875)
+	"lc-numeric", // 618 (876)
+	"lc-time", // 619 (877)
+	"lowlight", // 620 (878)
+	"nearest-away-from-zero", // 621 (879)
+	"nearest-even", // 622 (880)
+	"nearest-toward-zero", // 623 (881)
+	"none", // 624 (882)
+	"normal", // 625 (883)
+	"numbers", // 626 (884)
+	"prefixed", // 627 (885)
+	"previous", // 628 (886)
+	"prohibited", // 629 (887)
+	"relation", // 630 (888)
+	"required", // 631 (889)
+	"reverse-video", // 632 (890)
+	"rounding", // 633 (891)
+	"seconds", // 634 (892)
+	"secure", // 635 (893)
+	"short", // 636 (894)
+	"signed", // 637 (895)
+	"standard-binary", // 638 (896)
+	"standard-decimal", // 639 (897)
+	"statement", // 640 (898)
+	"step", // 641 (899)
+	"structure", // 642 (900)
+	"toward-greater", // 643 (901)
+	"toward-lesser", // 644 (902)
+	"truncation", // 645 (903)
+	"ucs-4", // 646 (904)
+	"underline", // 647 (905)
+	"unsigned", // 648 (906)
+	"utf-16", // 649 (907)
+	"utf-8", // 650 (908)
+	"address", // 651 (909)
+	"end-accept", // 652 (910)
+	"end-add", // 653 (911)
+	"end-call", // 654 (912)
+	"end-compute", // 655 (913)
+	"end-delete", // 656 (914)
+	"end-display", // 657 (915)
+	"end-divide", // 658 (916)
+	"end-evaluate", // 659 (917)
+	"end-multiply", // 660 (918)
+	"end-perform", // 661 (919)
+	"end-read", // 662 (920)
+	"end-return", // 663 (921)
+	"end-rewrite", // 664 (922)
+	"end-search", // 665 (923)
+	"end-start", // 666 (924)
+	"end-string", // 667 (925)
+	"end-subtract", // 668 (926)
+	"end-unstring", // 669 (927)
+	"end-write", // 670 (928)
+	"end-if", // 671 (929)
+	"through", // 672 (930)
+	"or", // 673 (931)
+	"and", // 674 (932)
+	"not", // 675 (933)
+	"ne", // 676 (934)
+	"le", // 677 (935)
+	"ge", // 678 (936)
+	"pow", // 679 (937)
+	"neg", // 680 (938)
+};
diff --git a/gcc/cobol/token_names.h.gen b/gcc/cobol/token_names.h.gen
new file mode 100755
index 000000000000..1d9915b9519e
--- /dev/null
+++ b/gcc/cobol/token_names.h.gen
@@ -0,0 +1,67 @@
+#! /usr/bin/awk -f
+
+# From the generated parse.h, generate a map of token names in their
+# COBOL form to their integer values.  While we're at it, generate an
+# array of the same names to support keywork_str().
+
+BEGIN {
+  FS = "[ ,=]+"
+  script = PROCINFO["argv"][2]
+  input = PROCINFO["argv"][3]
+  print "// generated by", script, input
+  printf "// "
+  system("date")
+  print "tokens = {"
+}
+
+/^ +enum yytokentype/,/[}];/ {
+  if( $0 ~ /enum yytokentype/ ) { next }
+  if( $0 ~ /[{}]/ ) { next }
+  if( $3 < 3 + 255 ) { next }
+
+  orig = $2
+
+  # remove conventional suffix
+  gsub( /_(DIV|SECT|KW|kw)$/, "", $2 )
+
+  gsub( /^CODESET/, "CODE-SET", $2 )
+  gsub( /^IO/, "I-O", $2 )
+  gsub( /^PICTURE/, "PIC", $2 )
+  gsub( /^QUOTES/, "QUOTE", $2 )
+  gsub( /^THRU/, "THROUGH", $2 )
+
+  gsub(/_/, "-")
+  name = tolower($2)
+  print "\t{ \"" name "\",", orig, "}, //", $3
+
+  # Aliases
+  if( name == "nulls" ) {
+    name = "null"
+    print "\t{ \"" name "\",", orig, "}, //", $3
+  }
+  if( name == "spaces" ) {
+    name = "space"
+    print "\t{ \"" name "\",", orig, "}, //", $3
+  }
+  if( name == "thru" ) {
+    name = "through"
+    print "\t{ \"" name "\",", orig, "}, //", $3
+  }   
+  if( name == "zero" ) {
+    print "\t{ \"" name "s\",", orig, "}, //", $3
+    print "\t{ \"" name "eo\",", orig, "}, //", $3
+  }                      
+
+  tok = $3 - (3 + 255)
+  kw_array[tok] = name
+}
+
+END {
+  print "};\n"
+
+  print "token_names = {" 
+  for( tok in kw_array ) {
+    print "\t\"" kw_array[tok] "\",", "//", tok, "(" tok + 3 + 255 ")"
+  }
+  print "};"
+}
diff --git a/gcc/cobol/util.cc b/gcc/cobol/util.cc
index 2dd65da4173c..5891ae853dd1 100644
--- a/gcc/cobol/util.cc
+++ b/gcc/cobol/util.cc
@@ -1720,87 +1720,6 @@ corresponding_arith_fields( cbl_field_t *lhs, cbl_field_t *rhs ) {
   return corresponding_fields( lhs, rhs, find_corresponding::arith_op );
 }
 
-typedef int (*file_sort_cmp_t)(const void *, const void *, void *);
-
-/*
- * Concatenate files, appending src to tgt.  Used by SORT.
- * Files must be open.
- * Returns FALSE only on OS error; errno is intact.
- */
-bool
-cbl_file_union( int tgt, int src ) {
-  static const unsigned int flags = 0;
-  struct stat sb;
-
-  if( 0 != fstat(tgt, &sb) ) {
-    return false;
-  }
-  loff_t off_in = sb.st_size, off_out = 0;
-
-  if( 0 != fstat(src, &sb) ) {
-    return false;
-  }
-  size_t len = sb.st_size;
-
-  // extend target file
-  if( 0 != ftruncate(tgt, off_in + len) ) {
-    return false;
-  }
-
-  ssize_t n = copy_file_range(src, &off_in, tgt, &off_out, len, flags);
-
-  return n == (ssize_t)len;
-}
-
-/*
- * Break a 2-token string into parts, and determine which if any are
- * keywords.  Return 1st token length if the string is a name-keyword
- * pair, and fill token with the token describing the 1st of the two,
- * else return 0.
- */
-int keyword_of( const char name[] );
-
-int
-name_space_kw( const char input[], int *token ) {
-  regex_t reg;
-  int erc, cflags = REG_EXTENDED, eflags=0;
-  regmatch_t m[5];
-
-  const char pattern[] = "^[[:alnum:]_]+[[:space:]]+[[:alnum:]_]+$";
-
-  if( (erc = regcomp(&reg, pattern, cflags)) != 0 ) {
-    char msg[80];
-    regerror(erc, &reg, msg, sizeof(msg));
-    cbl_errx( "%s: regcomp: %s", __func__, msg );
-  }
-
-  if( REG_NOMATCH == regexec(&reg, input, COUNT_OF(m), m, eflags) ) {
-    cbl_errx( "%s: regexec: no match", __func__ );
-  }
-
-  regfree(&reg);
-
-  assert( m[0].rm_eo == (int)strlen(input) );
-  assert( m[1].rm_so == 0 );
-  assert( m[1].rm_eo < m[2].rm_so );
-  assert( m[2].rm_eo < m[3].rm_so );
-  assert( m[3].rm_so < m[3].rm_eo );
-
-  char candidate[ strlen(input) ];
-  const int len1 = m[1].rm_eo;
-  sprintf( candidate, "%.*s", len1, input );
-
-  if( (*token = keyword_of(candidate)) > 0 ) {
-    return 0; // not name-space-token
-  }
-  assert(token == 0);
-
-  int len2 = m[3].rm_eo - m[3].rm_so;
-  sprintf( candidate, "%.*s", len2, input );
-
-  return keyword_of(candidate)? len1 : 0; // 1st is NAME, 2nd is keyword
-}
-
 char
 date_time_fmt( const char input[] ) {
   if( ! input ) return 0;
-- 
GitLab