glsl/glcpp: Add explicit error for "#define without macro name"
Previously, glcpp would emit an error like this if <EOF> happened to occur immediately after the "#define", but in general would just get confused, (leading to un-helpful error messages). To fix things to generate a clean error message, we do a few things: 1. Don't require horizontal whitespace immediately after #define 2. Add a production for the error case, (DEFINE_TOKEN followed immediately by a NEWLINE token). 3. Make the lexer reset to the <INITIAL> state after every NEWLINE. This 3rd point prevents the lexer from getting so confused and generating further spurious errors in the file because it was stuck in the <DEFINE> start condition. We also drop the similar error message from the <EOF> rule since the newly-added rule will have already printed the error message. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -371,7 +371,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
|
||||
* * Anything else, (not an identifier, not a comment,
|
||||
* and not whitespace). This will generate an error.
|
||||
*/
|
||||
<HASH>define{HSPACE}+ {
|
||||
<HASH>define{HSPACE}* {
|
||||
if (! parser->skipping) {
|
||||
BEGIN DEFINE;
|
||||
yyextra->space_tokens = 0;
|
||||
@@ -520,6 +520,8 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
|
||||
<*>[\r\n] {
|
||||
if (parser->commented_newlines) {
|
||||
BEGIN NEWLINE_CATCHUP;
|
||||
} else {
|
||||
BEGIN INITIAL;
|
||||
}
|
||||
yyextra->space_tokens = 1;
|
||||
yyextra->lexing_directive = 0;
|
||||
@@ -531,8 +533,6 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
|
||||
<INITIAL,COMMENT,DEFINE,HASH><<EOF>> {
|
||||
if (YY_START == COMMENT)
|
||||
glcpp_error(yylloc, yyextra, "Unterminated comment");
|
||||
if (YY_START == DEFINE)
|
||||
glcpp_error(yylloc, yyextra, "#define without macro name");
|
||||
BEGIN DONE; /* Don't keep matching this rule forever. */
|
||||
yyextra->lexing_directive = 0;
|
||||
if (! parser->last_token_was_newline)
|
||||
|
||||
@@ -424,6 +424,9 @@ control_line_error:
|
||||
HASH_TOKEN ERROR_TOKEN NEWLINE {
|
||||
glcpp_error(& @1, parser, "#%s", $2);
|
||||
}
|
||||
| HASH_TOKEN DEFINE_TOKEN NEWLINE {
|
||||
glcpp_error (& @1, parser, "#define without macro name");
|
||||
}
|
||||
| HASH_TOKEN GARBAGE pp_tokens NEWLINE {
|
||||
glcpp_error (& @1, parser, "Illegal non-directive after #");
|
||||
}
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
0:1(2): preprocessor error: #define without macro name
|
||||
0:1(2): preprocessor error: syntax error, unexpected NEWLINE, expecting FUNC_IDENTIFIER or OBJ_IDENTIFIER
|
||||
0:1(1): preprocessor error: #define without macro name
|
||||
|
||||
Reference in New Issue
Block a user