From: Kenneth Graunke Date: Wed, 16 Jun 2010 23:58:31 +0000 (-0700) Subject: glcpp: Set locations on tokens. X-Git-Tag: 062012170305~10660^2~625^2~82 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b78c9ddfbfecb983f7ab519bb07889333bdab959;p=profile%2Fivi%2Fmesa.git glcpp: Set locations on tokens. --- diff --git a/glcpp/glcpp-parse.y b/glcpp/glcpp-parse.y index 52927d8..f26dd9a 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 1d139af..2d4c847 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 {