[Mesa-dev] [PATCH 22/23] glsl/glcpp: Add a catch-all rule for unexpected characters.
Kristian Høgsberg
krh at bitplanet.net
Fri Jun 27 09:11:16 PDT 2014
On Thu, Jun 26, 2014 at 3:19 PM, Carl Worth <cworth at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list