This one is unavoidable as C is inherently ambiguous, (from the point-of-view of the parser), in the dangling-else case. Now, C is unambiguous in that the dangling "else" should bind to the innermost "if". This is exactly what bison accomplishes by preferring to shift rather than reduce.
The "expect" statement here tells bison to expect one shift/reduce conflict silently. It will then trigger an error if any future changes in the grammar introduce additional conflicts. --- src/glsl/glsl_parser.yy | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy index d849466..0af71e7 100644 --- a/src/glsl/glsl_parser.yy +++ b/src/glsl/glsl_parser.yy @@ -56,6 +56,12 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg) %lex-param {void *scanner} %parse-param {struct _mesa_glsl_parse_state *state} +/* C grammar has 1 unavoidable shift/reduce conflict, (the dangling- + * else ambiguity), which bison correctly resolves by preferring + * to shift. + */ +%expect 1 + %union { int n; float real; -- 1.7.10 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev