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.
This commit is contained in:
Brad King 2014-08-18 10:18:20 -04:00
parent 55d6aa36a5
commit 02b3cba9df
4 changed files with 51 additions and 35 deletions

View File

@ -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_NUM_RULES 24
#define YY_END_OF_BUFFER 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, 25, 13, 22, 1, 16, 3, 13, 5, 6, 7,
22, 22, 16, 18, 19, 20, 10, 11, 8, 12, 15, 23, 17, 19, 20, 21, 10, 11, 8, 12,
9, 4, 13, 0, 13, 0, 21, 0, 0, 7, 9, 4, 13, 0, 13, 0, 22, 0, 0, 7,
13, 0, 13, 0, 2, 0, 13, 16, 0, 17, 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, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1,
0, 0, 0, 0, }; 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: case 18:
/* rule 17 can match eol */ /* 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: case 19:
/* rule 18 can match eol */ /* 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"

View File

@ -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);

View File

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

View File

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