On Thu, Jun 26, 2014 at 3:19 PM, Carl Worth <cwo...@cworth.org> wrote: > In some of the recent glcpp bug-fixing, we found that glcpp was emitting > unrecognized characters from the input source file to stdout, and dropping > them from the source passed onto the compiler proper. > > This was obviously confusing, and totally undesired. > > The bogus behavior comes from an implicit default rule in flex, which is > that any unmatched character is implicitly matched and printed to stdout. > > To avoid this implicit matching and printing, here we add an explicit > catch-all rule. If this rule ever matches it prints an internal compiler > error. The correct response for anyt such error is fixing glcpp to handle > the unexpected character in the correct way. > --- > src/glsl/glcpp/glcpp-lex.l | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l > index 3d32cf4..721d8ae 100644 > --- a/src/glsl/glcpp/glcpp-lex.l > +++ b/src/glsl/glcpp/glcpp-lex.l > @@ -161,6 +161,10 @@ glcpp_lex_update_state_per_token (glcpp_parser_t > *parser, int token) > %option stack > %option never-interactive > > + /* Note: When adding any start conditions to this list, you must also > + * update the "Internal compiler error" catch-all rule near the end of > + * this file. */ > +
We could use %option nodefault instead: causes the _default rule_ (that unmatched scanner input is echoed to `stdout)' to be suppressed. If the scanner encounters input that does not match any of its rules, it aborts with an error. This option is useful for finding holes in a scanner's rule set. which would be a little more robust against editing the set o start conditions. Kristian > %x DONE COMMENT HASH UNREACHABLE DEFINE NEWLINE_CATCHUP > > SPACE [[:space:]] > @@ -534,6 +538,15 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]? > RETURN_TOKEN (NEWLINE); > } > > + /* This is a catch-all to avoid the annoying default flex action which > + * matches any character and prints it. If any input ever matches this > + * rule, then we have made a mistake above and need to fix one or more > + * of the preceding patterns to match that input. */ > + > +<INITIAL,DONE,COMMENT,DEFINE,HASH,NEWLINE_CATCHUP>. { > + glcpp_error(yylloc, yyextra, "Internal compiler error: Unexpected > character: %s", yytext); > +} > + > /* We don't actually use the UNREACHABLE start condition. We > only have this action here so that we can pretend to call some > generated functions, (to avoid "defined but not used" > -- > 2.0.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev