glcpp: Fix so that trailing punctuation does not prevent macro expansion
authorCarl Worth <cworth@cworth.org>
Sat, 21 Jan 2012 17:24:11 +0000 (09:24 -0800)
committerCarl Worth <cworth@cworth.org>
Thu, 2 Feb 2012 20:05:21 +0000 (12:05 -0800)
The trick here is that flex always chooses the rule that matches the most
text. So with a input text of "two:" which we want to be lexed as an
IDENTIFIER token "two" followed by an OTHER token ":" the previous OTHER
rule would match longer as a single token of "two:" which we don't want.

We prevent this by forcing the OTHER pattern to never match any
characters that appear in other constructs, (no letters, numbers, #,
_, whitespace, nor any punctuation that appear in CPP operators).

Fixes bug #44764:

GLSL preprocessor doesn't replace defines ending with ":"
https://bugs.freedesktop.org/show_bug.cgi?id=44764

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
NOTE: This is a candidate for stable release branches.

src/glsl/glcpp/glcpp-lex.l

index 86618870885ab9a4f4c8aad6c3f7cb5ea0387a7c..b34f2c0e9ade9de31a5ca853b354e2058af16f04 100644 (file)
@@ -70,7 +70,15 @@ HSPACE               [ \t]
 HASH           ^{HSPACE}*#{HSPACE}*
 IDENTIFIER     [_a-zA-Z][_a-zA-Z0-9]*
 PUNCTUATION    [][(){}.&*~!/%<>^|;,=+-]
-OTHER          [^][(){}.&*~!/%<>^|;,=#[:space:]+-]+
+
+/* The OTHER class is simply a catch-all for things that the CPP
+parser just doesn't care about. Since flex regular expressions that
+match longer strings take priority over those matching shorter
+strings, we have to be careful to avoid OTHER matching and hiding
+something that CPP does care about. So we simply exclude all
+characters that appear in any other expressions. */
+
+OTHER          [^][_#[:space:]#a-zA-Z0-9(){}.&*~!/%<>^|;,=+-]
 
 DIGITS                 [0-9][0-9]*
 DECIMAL_INTEGER                [1-9][0-9]*[uU]?