mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 11:48:06 +02:00
Use new token_list_t rather than string_list_t for macro values.
There's not yet any change in functionality here, (at least according to the test suite). But we now have the option of specifying a type for each string in the token list. This will allow us to finalize an unexpanded macro name so that it won't be subjected to excess expansion later.
This commit is contained in:
parent
aaa9acbf10
commit
472524413d
2 changed files with 97 additions and 31 deletions
111
glcpp-parse.y
111
glcpp-parse.y
|
|
@ -34,13 +34,13 @@ yyerror (void *scanner, const char *error);
|
|||
void
|
||||
_define_object_macro (glcpp_parser_t *parser,
|
||||
const char *macro,
|
||||
string_list_t *replacements);
|
||||
token_list_t *replacements);
|
||||
|
||||
void
|
||||
_define_function_macro (glcpp_parser_t *parser,
|
||||
const char *macro,
|
||||
string_list_t *parameters,
|
||||
string_list_t *replacements);
|
||||
token_list_t *replacements);
|
||||
|
||||
void
|
||||
_expand_object_macro (glcpp_parser_t *parser, const char *identifier);
|
||||
|
|
@ -72,14 +72,23 @@ argument_list_t *
|
|||
_argument_list_create (void *ctx);
|
||||
|
||||
void
|
||||
_argument_list_append (argument_list_t *list, string_list_t *argument);
|
||||
_argument_list_append (argument_list_t *list, token_list_t *argument);
|
||||
|
||||
int
|
||||
_argument_list_length (argument_list_t *list);
|
||||
|
||||
string_list_t *
|
||||
token_list_t *
|
||||
_argument_list_member_at (argument_list_t *list, int index);
|
||||
|
||||
token_list_t *
|
||||
_token_list_create (void *ctx);
|
||||
|
||||
void
|
||||
_token_list_append (token_list_t *list, int type, const char *value);
|
||||
|
||||
void
|
||||
_token_list_append_list (token_list_t *list, token_list_t *tail);
|
||||
|
||||
static void
|
||||
glcpp_parser_push_expansion_macro (glcpp_parser_t *parser,
|
||||
macro_t *macro,
|
||||
|
|
@ -97,8 +106,9 @@ glcpp_parser_lex (glcpp_parser_t *parser);
|
|||
|
||||
%union {
|
||||
char *str;
|
||||
string_list_t *string_list;
|
||||
argument_list_t *argument_list;
|
||||
string_list_t *string_list;
|
||||
token_list_t *token_list;
|
||||
}
|
||||
|
||||
%parse-param {glcpp_parser_t *parser}
|
||||
|
|
@ -106,8 +116,9 @@ glcpp_parser_lex (glcpp_parser_t *parser);
|
|||
|
||||
%token DEFINE FUNC_MACRO IDENTIFIER OBJ_MACRO NEWLINE SPACE TOKEN UNDEF
|
||||
%type <str> argument_word FUNC_MACRO IDENTIFIER OBJ_MACRO TOKEN
|
||||
%type <string_list> argument macro parameter_list replacement_list pp_tokens
|
||||
%type <argument_list> argument_list
|
||||
%type <string_list> macro parameter_list
|
||||
%type <token_list> argument replacement_list pp_tokens
|
||||
|
||||
/* Hard to remove shift/reduce conflicts documented as follows:
|
||||
*
|
||||
|
|
@ -177,18 +188,18 @@ argument_list:
|
|||
|
||||
argument:
|
||||
argument_word {
|
||||
$$ = _string_list_create (parser);
|
||||
_string_list_append_item ($$, $1);
|
||||
$$ = _token_list_create (parser);
|
||||
_token_list_append ($$, IDENTIFIER, $1);
|
||||
}
|
||||
| argument argument_word {
|
||||
_string_list_append_item ($1, $2);
|
||||
_token_list_append ($1, IDENTIFIER, $2);
|
||||
talloc_free ($2);
|
||||
$$ = $1;
|
||||
}
|
||||
| argument '(' argument ')' {
|
||||
_string_list_append_item ($1, "(");
|
||||
_string_list_append_list ($1, $3);
|
||||
_string_list_append_item ($1, ")");
|
||||
_token_list_append ($1, '(', "(");
|
||||
_token_list_append_list ($1, $3);
|
||||
_token_list_append ($1, ')', ")");
|
||||
$$ = $1;
|
||||
}
|
||||
;
|
||||
|
|
@ -203,7 +214,7 @@ argument_word:
|
|||
|
||||
directive:
|
||||
DEFINE IDENTIFIER NEWLINE {
|
||||
string_list_t *list = _string_list_create (parser);
|
||||
token_list_t *list = _token_list_create (parser);
|
||||
_define_object_macro (parser, $2, list);
|
||||
}
|
||||
| DEFINE IDENTIFIER SPACE replacement_list NEWLINE {
|
||||
|
|
@ -243,7 +254,7 @@ parameter_list:
|
|||
|
||||
replacement_list:
|
||||
/* empty */ {
|
||||
$$ = _string_list_create (parser);
|
||||
$$ = _token_list_create (parser);
|
||||
}
|
||||
| pp_tokens {
|
||||
$$ = $1;
|
||||
|
|
@ -253,11 +264,11 @@ replacement_list:
|
|||
|
||||
pp_tokens:
|
||||
TOKEN {
|
||||
$$ = _string_list_create (parser);
|
||||
_string_list_append_item ($$, $1);
|
||||
$$ = _token_list_create (parser);
|
||||
_token_list_append ($$, TOKEN, $1);
|
||||
}
|
||||
| pp_tokens TOKEN {
|
||||
_string_list_append_item ($1, $2);
|
||||
_token_list_append ($1, TOKEN, $2);
|
||||
$$ = $1;
|
||||
}
|
||||
;
|
||||
|
|
@ -370,7 +381,7 @@ _argument_list_create (void *ctx)
|
|||
}
|
||||
|
||||
void
|
||||
_argument_list_append (argument_list_t *list, string_list_t *argument)
|
||||
_argument_list_append (argument_list_t *list, token_list_t *argument)
|
||||
{
|
||||
argument_node_t *node;
|
||||
|
||||
|
|
@ -406,7 +417,7 @@ _argument_list_length (argument_list_t *list)
|
|||
return length;
|
||||
}
|
||||
|
||||
string_list_t *
|
||||
token_list_t *
|
||||
_argument_list_member_at (argument_list_t *list, int index)
|
||||
{
|
||||
argument_node_t *node;
|
||||
|
|
@ -427,6 +438,50 @@ _argument_list_member_at (argument_list_t *list, int index)
|
|||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
token_list_t *
|
||||
_token_list_create (void *ctx)
|
||||
{
|
||||
token_list_t *list;
|
||||
|
||||
list = xtalloc (ctx, token_list_t);
|
||||
list->head = NULL;
|
||||
list->tail = NULL;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
void
|
||||
_token_list_append (token_list_t *list, int type, const char *value)
|
||||
{
|
||||
token_node_t *node;
|
||||
|
||||
node = xtalloc (list, token_node_t);
|
||||
node->type = type;
|
||||
node->value = xtalloc_strdup (list, value);
|
||||
|
||||
node->next = NULL;
|
||||
|
||||
if (list->head == NULL) {
|
||||
list->head = node;
|
||||
} else {
|
||||
list->tail->next = node;
|
||||
}
|
||||
|
||||
list->tail = node;
|
||||
}
|
||||
|
||||
void
|
||||
_token_list_append_list (token_list_t *list, token_list_t *tail)
|
||||
{
|
||||
if (list->head == NULL) {
|
||||
list->head = tail->head;
|
||||
} else {
|
||||
list->tail->next = tail->head;
|
||||
}
|
||||
|
||||
list->tail = tail->tail;
|
||||
}
|
||||
|
||||
void
|
||||
yyerror (void *scanner, const char *error)
|
||||
|
|
@ -524,7 +579,7 @@ glcpp_parser_classify_token (glcpp_parser_t *parser,
|
|||
void
|
||||
_define_object_macro (glcpp_parser_t *parser,
|
||||
const char *identifier,
|
||||
string_list_t *replacements)
|
||||
token_list_t *replacements)
|
||||
{
|
||||
macro_t *macro;
|
||||
|
||||
|
|
@ -542,7 +597,7 @@ void
|
|||
_define_function_macro (glcpp_parser_t *parser,
|
||||
const char *identifier,
|
||||
string_list_t *parameters,
|
||||
string_list_t *replacements)
|
||||
token_list_t *replacements)
|
||||
{
|
||||
macro_t *macro;
|
||||
|
||||
|
|
@ -560,7 +615,7 @@ static void
|
|||
_glcpp_parser_push_expansion_internal (glcpp_parser_t *parser,
|
||||
macro_t *macro,
|
||||
argument_list_t *arguments,
|
||||
string_node_t *replacements)
|
||||
token_node_t *replacements)
|
||||
{
|
||||
expansion_node_t *node;
|
||||
|
||||
|
|
@ -588,7 +643,7 @@ glcpp_parser_push_expansion_argument (glcpp_parser_t *parser,
|
|||
int argument_index)
|
||||
{
|
||||
argument_list_t *arguments;
|
||||
string_list_t *argument;
|
||||
token_list_t *argument;
|
||||
|
||||
arguments = parser->expansions->arguments;
|
||||
|
||||
|
|
@ -656,7 +711,7 @@ static int
|
|||
glcpp_parser_lex (glcpp_parser_t *parser)
|
||||
{
|
||||
expansion_node_t *expansion;
|
||||
string_node_t *replacements;
|
||||
token_node_t *replacements;
|
||||
int parameter_index;
|
||||
|
||||
/* Who says C can't do efficient tail recursion? */
|
||||
|
|
@ -677,14 +732,14 @@ glcpp_parser_lex (glcpp_parser_t *parser)
|
|||
|
||||
expansion->replacements = replacements->next;
|
||||
|
||||
if (strcmp (replacements->str, "(") == 0)
|
||||
if (strcmp (replacements->value, "(") == 0)
|
||||
return '(';
|
||||
else if (strcmp (replacements->str, ")") == 0)
|
||||
else if (strcmp (replacements->value, ")") == 0)
|
||||
return ')';
|
||||
else if (strcmp (replacements->str, ",") == 0)
|
||||
else if (strcmp (replacements->value, ",") == 0)
|
||||
return ',';
|
||||
|
||||
yylval.str = xtalloc_strdup (parser, replacements->str);
|
||||
yylval.str = xtalloc_strdup (parser, replacements->value);
|
||||
|
||||
switch (glcpp_parser_classify_token (parser, yylval.str,
|
||||
¶meter_index))
|
||||
|
|
|
|||
17
glcpp.h
17
glcpp.h
|
|
@ -42,8 +42,19 @@ typedef struct string_list {
|
|||
string_node_t *tail;
|
||||
} string_list_t;
|
||||
|
||||
typedef struct token_node {
|
||||
int type;
|
||||
const char *value;
|
||||
struct token_node *next;
|
||||
} token_node_t;
|
||||
|
||||
typedef struct token_list {
|
||||
token_node_t *head;
|
||||
token_node_t *tail;
|
||||
} token_list_t;
|
||||
|
||||
typedef struct argument_node {
|
||||
string_list_t *argument;
|
||||
token_list_t *argument;
|
||||
struct argument_node *next;
|
||||
} argument_node_t;
|
||||
|
||||
|
|
@ -70,13 +81,13 @@ typedef struct {
|
|||
int is_function;
|
||||
string_list_t *parameters;
|
||||
const char *identifier;
|
||||
string_list_t *replacements;
|
||||
token_list_t *replacements;
|
||||
} macro_t;
|
||||
|
||||
typedef struct expansion_node {
|
||||
macro_t *macro;
|
||||
argument_list_t *arguments;
|
||||
string_node_t *replacements;
|
||||
token_node_t *replacements;
|
||||
struct expansion_node *next;
|
||||
} expansion_node_t;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue