From 71acd811de3faa0259dc172bfb86d86485a7ae7c Mon Sep 17 00:00:00 2001
From: "James K. Lowden" <jklowden@symas.com>
Date: Mon, 13 May 2024 19:51:32 -0400
Subject: [PATCH] accept extra trailing dots, generally

---
 gcc/cobol/UAT/testsuite.src/syn_value.at |  2 +-
 gcc/cobol/scan.l                         | 28 +++++++++++++++---------
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/gcc/cobol/UAT/testsuite.src/syn_value.at b/gcc/cobol/UAT/testsuite.src/syn_value.at
index cca89052644e..be9854a5b97f 100644
--- a/gcc/cobol/UAT/testsuite.src/syn_value.at
+++ b/gcc/cobol/UAT/testsuite.src/syn_value.at
@@ -110,7 +110,7 @@ AT_DATA([prog.cob], [
            STOP RUN.
 ])
 AT_CHECK([$COMPILE_ONLY prog.cob], [1], ,
-[prog.cob:7: error: numeric type X-SPACE VALUE 'SPACES' requires numeric VALUE
+[prog.cob:8: error: numeric type X-SPACE VALUE 'SPACES' requires numeric VALUE
 prog.cob:9: error: numeric type X-ABC VALUE 'abc' requires numeric VALUE
 prog.cob:10: error: integer type X-12-3 VALUE '12.3' requires integer VALUE
 prog.cob:13: error: numeric X-1234 VALUE '1234' holds only 3 digits
diff --git a/gcc/cobol/scan.l b/gcc/cobol/scan.l
index 9e053d7baf10..5290286c9095 100644
--- a/gcc/cobol/scan.l
+++ b/gcc/cobol/scan.l
@@ -1132,7 +1132,8 @@ USE({SPC}FOR)?		{ return USE; }
   {COMMA} 			|
   [[:blank:]]*{EOL}		|
   [[:blank:]]+{EOL}?		{ yy_pop_state(); /* embedded/trailing blank */ }
-  {DOTSEP} 			{ yy_pop_state(); return '.'; }
+  {DOTSEP}[[:blank:].]+$	{ yy_pop_state(); return '.'; }
+  {DOTSEP}			{ yy_pop_state(); return '.'; }
 
 
   [[:blank:]]+[-+]/{EDITED} 	{ return picset(yytext[yyleng-1]); }
@@ -1185,7 +1186,8 @@ USE({SPC}FOR)?		{ return USE; }
   SUPPRESS      { return SUPPRESS; }
   REPLACING     { return REPLACING; }
   COPY          { penultimate(final_token); return COPY; }
-  {DOTSEP}      { pop_return *yytext; }
+  {DOTSEP}[[:blank:].]+$	{ pop_return *yytext; }
+  {DOTSEP}      		{ pop_return *yytext; }
 
   [(][^().]*[)]	{ ydflval.string = strdup(yytext);
 		  return SUBSCRIPT;
@@ -1299,15 +1301,16 @@ USE({SPC}FOR)?		{ return USE; }
 
   COMMON/[.]|{SPC}[[:alnum:].] 	{ return COMMON; }
   INITIAL/[.]|{SPC}[[:alnum:].]	{ return INITIAL_kw; }
-  RECURSIVE				{ return RECURSIVE; }
-  PROGRAM/[.]|{SPC}[[:alnum:].]  { return PROGRAM_kw; }
+  RECURSIVE			{ return RECURSIVE; }
+  PROGRAM/[.]|{SPC}[[:alnum:].] { return PROGRAM_kw; }
 
   INITIAL	{ pop_return INITIAL_kw; }
   COMMON	{ pop_return COMMON; }
   PROGRAM 	{ pop_return PROGRAM; }
 
   AS/{SPC} 	{ yyless(0); yy_pop_state(); } /* => ident_state */
-  {DOTEOL} 	{ pop_return '.'; }
+  [[:blank:]]*{DOTSEP}[[:blank:].]+{EOL} { pop_return '.'; }
+  {DOTEOL}		 		 { pop_return '.'; }
 }
 
 <name_state>{
@@ -1323,10 +1326,14 @@ USE({SPC}FOR)?		{ return USE; }
 			  yy_push_state(quoted2); }
 
   [.]/[[:blank:]]+.     { return *yytext; }
-  {DOTEOL}              { yy_pop_state(); yyless(0); }
+
+  [[:blank:]]*{DOTSEP}[[:blank:].]+{EOL} {
+			  yy_pop_state(); yyless(0); }
+  {DOTEOL}             	{ yy_pop_state(); yyless(0); }
 }
 <dot_state>{
-  [[:blank:]]*[.]       { pop_return '.'; }
+  [[:blank:]]*[.][[:blank:].]+{EOL} 	{ pop_return '.'; }
+  [[:blank:]]*[.]			{ pop_return '.'; }
 }
 
 <date_state>{
@@ -1944,9 +1951,10 @@ COPY		{
 }
 
 
-<*>OR 			{ return OR; }
-<*>AND			{ return AND; }
-<*>[().=*/+&-]		{ return *yytext; }
+<*>OR 				{ return OR; }
+<*>AND				{ return AND; }
+<*>{DOTSEP}[[:blank:].]+$	{ return '.'; }
+<*>[().=*/+&-]			{ return *yytext; }
 <*>[[:blank:]]+
 <*>\r?\n
 
-- 
GitLab