Paul Eggert wrote:
> "Peter O'Gorman" <[EMAIL PROTECTED]> writes:
>
>> -e { yyless (input () != 0); }
>> +e { yyless ((input () != 0)); }
>
> Why is this patch necessary? yyless is supposed to take an int
> parameter, and another set of parentheses shouldn't affect the
> parameter's type or value.
After macro expansion that line turns into:
{ do { *yy_cp = yy_hold_char; yy_c_buf_p = yy_cp = yy_bp + input () !=
0 - 0; yytext = yy_bp; yyleng = (int) (yy_cp - yy_bp); yy_hold_char =
*yy_cp; *yy_cp = '\0'; yy_c_buf_p = yy_cp;; } while ( 0 ); }
The compiler barfs an error with:
yy_c_buf_p = yy_cp = yy_bp + input () != 0 - 0;
Reducing to:
yy_cp = yy_bp + input () != 0;
The compiler errors out with:
A value of type "int" cannot be assigned to an entity of type "char *".
yy_cp = yy_bp + input () != 0;
^
1 error detected in the compilation of "cpp.c"
Now, I am not sure if the compiler is right or wrong, and am not really
bothered either way, the AC_PROG_LEX test is producing incorrect results
on irix6.5 because of this error.
Now, looking at the expanded version, I am unsure if my patch is
correct, is the test supposed to be that input() != 0 or that (yy_bp +
input ()) != 0 ? At the moment, due to operator precedence, it is
testing that yy_bp + input () is non-zero, is that intentional?
Peter
--
Peter O'Gorman
http://pogma.com