diff --git a/gcc/cobol/cdf.y b/gcc/cobol/cdf.y index 5e59a3cf4ea33d4334739689267afc6dad7e583e..84be0ddc4ac75724cf7d562c8b206a7976c0c158 100644 --- a/gcc/cobol/cdf.y +++ b/gcc/cobol/cdf.y @@ -759,10 +759,10 @@ defined_cmd( const char arg[] ) if(p) { *p++ = '\0'; int pos, number; - if( 1 == sscanf(p, "%d%n", &number, &pos) ) { - if( size_t(pos) == strlen(p) ) { + if( 1 == sscanf(p, "%d%n", &number, &pos) && size_t(pos) == strlen(p) ) { value = cdfval_t(number); - } + } else { + value = cdfval_t(p); // it's a string } } diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y index 7a33e90941905e6fc03688d9b270e6e1a9a98b0e..038f356ff738b28d3b5a08b8ca1edfa1dc9b40bc 100644 --- a/gcc/cobol/parse.y +++ b/gcc/cobol/parse.y @@ -6044,6 +6044,13 @@ stop_how: %empty { $$ = $stop_status? $stop_status : new_reference(literally_one); } + | RETURNING stop_status + { + if( ! dialect_mf() ) { + yyerror("error: RETURNING <number> requires -dialect mf"); + } + $$ = $stop_status? $stop_status : new_reference(literally_one); + } ; stop_status: status { $$ = NULL; } | status scalar { $$ = $2; } diff --git a/gcc/cobol/scan.l b/gcc/cobol/scan.l index 8a1f4fef073db1b5c35cb972b02fbbdd782f784c..6eddc2a4ee72703c083376fbb99898e886113b0c 100644 --- a/gcc/cobol/scan.l +++ b/gcc/cobol/scan.l @@ -1087,7 +1087,7 @@ USE({SPC}FOR)? { return USE; } FD/[[:blank:]]+ { parsing.need_level(false); return FD; } SD/[[:blank:]]+ { parsing.need_level(false); return SD; } - {NAME} { yylval.string = strdup(yytext); + {NAME} { ydflval.string = yylval.string = strdup(yytext); const char *value = is_numeric_constant(yytext); return value? numstr_of(value) : NAME; } @@ -1933,12 +1933,12 @@ COPY { } -<*>OR { return OR; } -<*>AND { return AND; } -<*>[().=*/+&-] { return *yytext; } - -<*>[[:blank:]]+ {} -<*>\r?\n {} +<*>OR { return OR; } +<*>AND { return AND; } +<*>[().=*/+&-] { return *yytext; } +<*>[.][[:blank:].]+ { return '.'; } +<*>[[:blank:]]+ +<*>\r?\n <*>{ {COMMA}