summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-06-16 16:58:31 -0700
committerKenneth Graunke <kenneth@whitecape.org>2010-06-21 11:31:56 -0700
commitb78c9ddfbfecb983f7ab519bb07889333bdab959 (patch)
tree4aa66a736f4324efc165770435ad43a23f888e53
parentdb938103c7d22a3bd4b14202f7f69f273840f2cc (diff)
glcpp: Set locations on tokens.
-rw-r--r--glcpp/glcpp-parse.y33
-rw-r--r--glcpp/glcpp.h1
2 files changed, 25 insertions, 9 deletions
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 {