From b78c9ddfbfecb983f7ab519bb07889333bdab959 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Wed, 16 Jun 2010 16:58:31 -0700 Subject: [PATCH] glcpp: Set locations on tokens. --- glcpp/glcpp-parse.y | 33 ++++++++++++++++++++++++--------- glcpp/glcpp.h | 1 + 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/glcpp/glcpp-parse.y b/glcpp/glcpp-parse.y index 52927d83c6c..f26dd9a0dbc 100644 --- a/glcpp/glcpp-parse.y +++ b/glcpp/glcpp-parse.y @@ -391,18 +391,23 @@ pp_tokens: preprocessing_token: IDENTIFIER { $$ = _token_create_str (parser, IDENTIFIER, $1); + $$->location = yylloc; } | INTEGER_STRING { $$ = _token_create_str (parser, INTEGER_STRING, $1); + $$->location = yylloc; } | operator { $$ = _token_create_ival (parser, $1, $1); + $$->location = yylloc; } | OTHER { $$ = _token_create_str (parser, OTHER, $1); + $$->location = yylloc; } | SPACE { $$ = _token_create_ival (parser, SPACE, SPACE); + $$->location = yylloc; } ; @@ -781,6 +786,8 @@ _token_print (char **out, token_t *token) static token_t * _token_paste (glcpp_parser_t *parser, token_t *token, token_t *other) { + token_t *combined = NULL; + /* Pasting a placeholder onto anything makes no change. */ if (other->type == PLACEHOLDER) return token; @@ -794,34 +801,40 @@ _token_paste (glcpp_parser_t *parser, token_t *token, token_t *other) switch (token->type) { case '<': if (other->type == '<') - return _token_create_ival (token, LEFT_SHIFT, LEFT_SHIFT); + combined = _token_create_ival (token, LEFT_SHIFT, LEFT_SHIFT); else if (other->type == '=') - return _token_create_ival (token, LESS_OR_EQUAL, LESS_OR_EQUAL); + combined = _token_create_ival (token, LESS_OR_EQUAL, LESS_OR_EQUAL); break; case '>': if (other->type == '>') - return _token_create_ival (token, RIGHT_SHIFT, RIGHT_SHIFT); + combined = _token_create_ival (token, RIGHT_SHIFT, RIGHT_SHIFT); else if (other->type == '=') - return _token_create_ival (token, GREATER_OR_EQUAL, GREATER_OR_EQUAL); + combined = _token_create_ival (token, GREATER_OR_EQUAL, GREATER_OR_EQUAL); break; case '=': if (other->type == '=') - return _token_create_ival (token, EQUAL, EQUAL); + combined = _token_create_ival (token, EQUAL, EQUAL); break; case '!': if (other->type == '=') - return _token_create_ival (token, NOT_EQUAL, NOT_EQUAL); + combined = _token_create_ival (token, NOT_EQUAL, NOT_EQUAL); break; case '&': if (other->type == '&') - return _token_create_ival (token, AND, AND); + combined = _token_create_ival (token, AND, AND); break; case '|': if (other->type == '|') - return _token_create_ival (token, OR, OR); + combined = _token_create_ival (token, OR, OR); break; } + if (combined != NULL) { + /* Inherit the location from the first token */ + combined->location = token->location; + return combined; + } + /* Two string-valued tokens can usually just be mashed * together. * @@ -837,7 +850,9 @@ _token_paste (glcpp_parser_t *parser, token_t *token, token_t *other) str = xtalloc_asprintf (token, "%s%s", token->value.str, other->value.str); - return _token_create_str (token, token->type, str); + combined = _token_create_str (token, token->type, str); + combined->location = token->location; + return combined; } glcpp_print (parser->errors, "Error: Pasting \""); diff --git a/glcpp/glcpp.h b/glcpp/glcpp.h index 1d139af064f..2d4c84796ba 100644 --- a/glcpp/glcpp.h +++ b/glcpp/glcpp.h @@ -72,6 +72,7 @@ typedef struct YYLTYPE { struct token { int type; YYSTYPE value; + YYLTYPE location; }; typedef struct token_node { -- 2.30.2