فهرست منبع

cmListFileLexer: Fix lexing of single '[' character (#15092)

The lexer changes in commit v3.0.0-rc1~495^2 (Add Lua-style long
brackets and long comments to CMake language, 2013-08-06) accidentally
left out matching '[' as a single character in an unquoted argument.
Add a lexer rule to match it and extend the RunCMake.Syntax test to
cover this case.
Brad King 11 سال پیش
والد
کامیت
02b3cba9df
4فایلهای تغییر یافته به همراه51 افزوده شده و 35 حذف شده
  1. 42 33
      Source/cmListFileLexer.c
  2. 7 0
      Source/cmListFileLexer.in.l
  3. 1 1
      Tests/RunCMake/Syntax/Unquoted1-stderr.txt
  4. 1 1
      Tests/RunCMake/Syntax/Unquoted1.cmake

+ 42 - 33
Source/cmListFileLexer.c

@@ -369,8 +369,8 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
         *yy_cp = '\0'; \
         *yy_cp = '\0'; \
         yyg->yy_c_buf_p = yy_cp;
         yyg->yy_c_buf_p = yy_cp;
 
 
-#define YY_NUM_RULES 23
-#define YY_END_OF_BUFFER 24
+#define YY_NUM_RULES 24
+#define YY_END_OF_BUFFER 25
 /* This struct is not used in this scanner,
 /* This struct is not used in this scanner,
    but its presence is necessary. */
    but its presence is necessary. */
 struct yy_trans_info
 struct yy_trans_info
@@ -381,10 +381,10 @@ struct yy_trans_info
 static yyconst flex_int16_t yy_accept[77] =
 static yyconst flex_int16_t yy_accept[77] =
     {   0,
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    4,    4,
         0,    0,    0,    0,    0,    0,    0,    0,    4,    4,
-       24,   13,   21,    1,   15,    3,   13,    5,    6,    7,
-       22,   22,   16,   18,   19,   20,   10,   11,    8,   12,
-        9,    4,   13,    0,   13,    0,   21,    0,    0,    7,
-       13,    0,   13,    0,    2,    0,   13,   16,    0,   17,
+       25,   13,   22,    1,   16,    3,   13,    5,    6,    7,
+       15,   23,   17,   19,   20,   21,   10,   11,    8,   12,
+        9,    4,   13,    0,   13,    0,   22,    0,    0,    7,
+       13,    0,   13,    0,    2,    0,   13,   17,    0,   18,
        10,    8,    4,    0,   14,    0,    0,    0,    0,   14,
        10,    8,    4,    0,   14,    0,    0,    0,    0,   14,
         0,    0,   14,    0,    0,    0,    2,   14,    0,    0,
         0,    0,   14,    0,    0,    0,    2,   14,    0,    0,
         0,    0,    0,    0,    0,    0
         0,    0,    0,    0,    0,    0
@@ -523,10 +523,10 @@ static yyconst flex_int16_t yy_chk[253] =
     } ;
     } ;
 
 
 /* Table of booleans, true if rule could match eol. */
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[24] =
+static yyconst flex_int32_t yy_rule_can_match_eol[25] =
     {   0,
     {   0,
-1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0,
-    0, 0, 0, 0,     };
+1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0,     };
 
 
 /* The intent behind this definition is that it'll catch
 /* The intent behind this definition is that it'll catch
  * any uses of REJECT which flex missed.
  * any uses of REJECT which flex missed.
@@ -615,7 +615,7 @@ static void cmListFileLexerDestroy(cmListFileLexer* lexer);
 
 
 
 
 
 
-#line 621 "cmListFileLexer.c"
+#line 628 "cmListFileLexer.c"
 
 
 #define INITIAL 0
 #define INITIAL 0
 #define STRING 1
 #define STRING 1
@@ -850,7 +850,7 @@ YY_DECL
 #line 91 "cmListFileLexer.in.l"
 #line 91 "cmListFileLexer.in.l"
 
 
 
 
-#line 858 "cmListFileLexer.c"
+#line 865 "cmListFileLexer.c"
 
 
         if ( !yyg->yy_init )
         if ( !yyg->yy_init )
                 {
                 {
@@ -1110,6 +1110,15 @@ YY_RULE_SETUP
 case 15:
 case 15:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 215 "cmListFileLexer.in.l"
 #line 215 "cmListFileLexer.in.l"
+{
+  lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted;
+  cmListFileLexerSetToken(lexer, yytext, yyleng);
+  lexer->column += yyleng;
+  return 1;
+}
+case 16:
+YY_RULE_SETUP
+#line 222 "cmListFileLexer.in.l"
 {
 {
   lexer->token.type = cmListFileLexer_Token_ArgumentQuoted;
   lexer->token.type = cmListFileLexer_Token_ArgumentQuoted;
   cmListFileLexerSetToken(lexer, "", 0);
   cmListFileLexerSetToken(lexer, "", 0);
@@ -1117,69 +1126,69 @@ YY_RULE_SETUP
   BEGIN(STRING);
   BEGIN(STRING);
 }
 }
         YY_BREAK
         YY_BREAK
-case 16:
+case 17:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 222 "cmListFileLexer.in.l"
+#line 229 "cmListFileLexer.in.l"
 {
 {
   cmListFileLexerAppend(lexer, yytext, yyleng);
   cmListFileLexerAppend(lexer, yytext, yyleng);
   lexer->column += yyleng;
   lexer->column += yyleng;
 }
 }
         YY_BREAK
         YY_BREAK
-case 17:
-/* rule 17 can match eol */
+case 18:
+/* rule 18 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 227 "cmListFileLexer.in.l"
+#line 234 "cmListFileLexer.in.l"
 {
 {
   /* Continuation: text is not part of string */
   /* Continuation: text is not part of string */
   ++lexer->line;
   ++lexer->line;
   lexer->column = 1;
   lexer->column = 1;
 }
 }
         YY_BREAK
         YY_BREAK
-case 18:
-/* rule 18 can match eol */
+case 19:
+/* rule 19 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 233 "cmListFileLexer.in.l"
+#line 240 "cmListFileLexer.in.l"
 {
 {
   cmListFileLexerAppend(lexer, yytext, yyleng);
   cmListFileLexerAppend(lexer, yytext, yyleng);
   ++lexer->line;
   ++lexer->line;
   lexer->column = 1;
   lexer->column = 1;
 }
 }
         YY_BREAK
         YY_BREAK
-case 19:
+case 20:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 239 "cmListFileLexer.in.l"
+#line 246 "cmListFileLexer.in.l"
 {
 {
   lexer->column += yyleng;
   lexer->column += yyleng;
   BEGIN(INITIAL);
   BEGIN(INITIAL);
   return 1;
   return 1;
 }
 }
-case 20:
+case 21:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 245 "cmListFileLexer.in.l"
+#line 252 "cmListFileLexer.in.l"
 {
 {
   cmListFileLexerAppend(lexer, yytext, yyleng);
   cmListFileLexerAppend(lexer, yytext, yyleng);
   lexer->column += yyleng;
   lexer->column += yyleng;
 }
 }
         YY_BREAK
         YY_BREAK
 case YY_STATE_EOF(STRING):
 case YY_STATE_EOF(STRING):
-#line 250 "cmListFileLexer.in.l"
+#line 257 "cmListFileLexer.in.l"
 {
 {
   lexer->token.type = cmListFileLexer_Token_BadString;
   lexer->token.type = cmListFileLexer_Token_BadString;
   BEGIN(INITIAL);
   BEGIN(INITIAL);
   return 1;
   return 1;
 }
 }
-case 21:
+case 22:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 256 "cmListFileLexer.in.l"
+#line 263 "cmListFileLexer.in.l"
 {
 {
   lexer->token.type = cmListFileLexer_Token_Space;
   lexer->token.type = cmListFileLexer_Token_Space;
   cmListFileLexerSetToken(lexer, yytext, yyleng);
   cmListFileLexerSetToken(lexer, yytext, yyleng);
   lexer->column += yyleng;
   lexer->column += yyleng;
   return 1;
   return 1;
 }
 }
-case 22:
+case 23:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 263 "cmListFileLexer.in.l"
+#line 270 "cmListFileLexer.in.l"
 {
 {
   lexer->token.type = cmListFileLexer_Token_BadCharacter;
   lexer->token.type = cmListFileLexer_Token_BadCharacter;
   cmListFileLexerSetToken(lexer, yytext, yyleng);
   cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -1188,18 +1197,18 @@ YY_RULE_SETUP
 }
 }
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMENT):
 case YY_STATE_EOF(COMMENT):
-#line 270 "cmListFileLexer.in.l"
+#line 277 "cmListFileLexer.in.l"
 {
 {
   lexer->token.type = cmListFileLexer_Token_None;
   lexer->token.type = cmListFileLexer_Token_None;
   cmListFileLexerSetToken(lexer, 0, 0);
   cmListFileLexerSetToken(lexer, 0, 0);
   return 0;
   return 0;
 }
 }
-case 23:
+case 24:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 276 "cmListFileLexer.in.l"
+#line 283 "cmListFileLexer.in.l"
 ECHO;
 ECHO;
         YY_BREAK
         YY_BREAK
-#line 1220 "cmListFileLexer.c"
+#line 1238 "cmListFileLexer.c"
 
 
         case YY_END_OF_BUFFER:
         case YY_END_OF_BUFFER:
                 {
                 {
@@ -2320,7 +2329,7 @@ void cmListFileLexer_yyfree (void * ptr , yyscan_t yyscanner)
 
 
 #define YYTABLES_NAME "yytables"
 #define YYTABLES_NAME "yytables"
 
 
-#line 276 "cmListFileLexer.in.l"
+#line 282 "cmListFileLexer.in.l"
 
 
 
 
 
 

+ 7 - 0
Source/cmListFileLexer.in.l

@@ -212,6 +212,13 @@ LEGACY {MAKEVAR}|{UNQUOTED}|\"({MAKEVAR}|{UNQUOTED}|[ \t[=])*\"
   return 1;
   return 1;
 }
 }
 
 
+\[ {
+  lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted;
+  cmListFileLexerSetToken(lexer, yytext, yyleng);
+  lexer->column += yyleng;
+  return 1;
+}
+
 \" {
 \" {
   lexer->token.type = cmListFileLexer_Token_ArgumentQuoted;
   lexer->token.type = cmListFileLexer_Token_ArgumentQuoted;
   cmListFileLexerSetToken(lexer, "", 0);
   cmListFileLexerSetToken(lexer, "", 0);

+ 1 - 1
Tests/RunCMake/Syntax/Unquoted1-stderr.txt

@@ -1 +1 @@
-^\[\]\[=\]\[\$\$\(MV\)-DSTR=" \[="\[;\]$
+^\[\]\[=\]\[\$\$\(MV\)-DSTR=" \[="\[;\]\]\[$

+ 1 - 1
Tests/RunCMake/Syntax/Unquoted1.cmake

@@ -1 +1 @@
-message([] [=] [$ $(MV) -DSTR=" [=" [;])
+message([] [=] [$ $(MV) -DSTR=" [=" [;] ] [)