Commit 70ce27ba by Richard Kenner

(parse_number): Improve error message for bogus numbers.

(yylex): Consider `0xe-1' to be a (bogus) number if not traditional.

From-SVN: r10891
parent 9fb1a98e
...@@ -396,13 +396,6 @@ parse_number (olen) ...@@ -396,13 +396,6 @@ parse_number (olen)
register int digit, largest_digit = 0; register int digit, largest_digit = 0;
int spec_long = 0; int spec_long = 0;
for (c = 0; c < len; c++)
if (p[c] == '.') {
/* It's a float since it contains a point. */
yyerror ("floating point numbers not allowed in #if expressions");
return ERROR;
}
yylval.integer.unsignedp = 0; yylval.integer.unsignedp = 0;
if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) { if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
...@@ -439,8 +432,16 @@ parse_number (olen) ...@@ -439,8 +432,16 @@ parse_number (olen)
yyerror ("two `u's in integer constant"); yyerror ("two `u's in integer constant");
yylval.integer.unsignedp = 1; yylval.integer.unsignedp = 1;
} }
else else {
break; if (c == '.' || c == 'e' || c == 'E')
yyerror ("Floating point numbers not allowed in #if expressions");
else {
char *buf = (char *) alloca (p - lexptr + 40);
sprintf (buf, "missing white space after number `%.*s'",
(int) (p - lexptr - 1), lexptr);
yyerror (buf);
}
}
if (--len == 0) if (--len == 0)
break; break;
...@@ -456,11 +457,6 @@ parse_number (olen) ...@@ -456,11 +457,6 @@ parse_number (olen)
n = nd; n = nd;
} }
if (len != 0) {
yyerror ("Invalid number in #if expression");
return ERROR;
}
if (base <= largest_digit) if (base <= largest_digit)
warning ("integer constant contains digits beyond the radix"); warning ("integer constant contains digits beyond the radix");
...@@ -733,10 +729,14 @@ yylex () ...@@ -733,10 +729,14 @@ yylex ()
if (c >= '0' && c <= '9' && !keyword_parsing) { if (c >= '0' && c <= '9' && !keyword_parsing) {
/* It's a number */ /* It's a number */
for (namelen = 0; for (namelen = 1; ; namelen++) {
c = tokstart[namelen], is_idchar[c] || c == '.'; int d = tokstart[namelen];
namelen++) if (! ((is_idchar[d] || d == '.')
; || ((d == '-' || d == '+') && (c == 'e' || c == 'E')
&& ! traditional)))
break;
c = d;
}
return parse_number (namelen); return parse_number (namelen);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment