glsl/glcpp: Add flex options to eliminate the default rule.
authorCarl Worth <cworth@cworth.org>
Tue, 1 Jul 2014 22:04:38 +0000 (15:04 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 29 Jul 2014 22:11:51 +0000 (15:11 -0700)
We've had multiple bugs in the past where we have been inadvertently matching
the default rule, (which we never want to do). We recently added a catch-all
rule to avoid this, (and made this rule robust for future start conditions).

Kristian pointed out that flex allows us to go one step better. This syntax:

%option warn nodefault

instructs flex to not generate the default rule at all. Further, flex will
generate a warning at compile time if the set of rules we provide are
inadequate, (such that it would be possible for the default rule to be
matched).

With this warning in place, I found that the catch-all rule was in fact
missing something. The catch-all rule uses a pattern of "." which doesn't
match newlines. So here we extend the newline-matching rule to all start
conditions. That is enough to convince flex that it really doesn't need
any default rule.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
src/glsl/glcpp/glcpp-lex.l

index 79a7ad7b09a754beb713fc3e4b8a6841be3d6537..4b9ab23d07aaa58c3f2de1be12816c556205b9e8 100644 (file)
@@ -160,6 +160,7 @@ glcpp_lex_update_state_per_token (glcpp_parser_t *parser, int token)
 %option prefix="glcpp_"
 %option stack
 %option never-interactive
+%option warn nodefault
 
        /* Note: When adding any start conditions to this list, you must also
         * update the "Internal compiler error" catch-all rule near the end of
@@ -516,7 +517,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
 
        /* We preserve all newlines, even between #if 0..#endif, so no
        skipping.. */
-[\r\n] {
+<*>[\r\n] {
        if (parser->commented_newlines) {
                BEGIN NEWLINE_CATCHUP;
        }