Lines Matching refs:parser
35 yyerror(YYLTYPE *locp, glcpp_parser_t *parser, const char *error);
38 _define_object_macro(glcpp_parser_t *parser,
44 _define_function_macro(glcpp_parser_t *parser,
51 _string_list_create(glcpp_parser_t *parser);
54 _string_list_append_item(glcpp_parser_t *parser, string_list_t *list,
70 _argument_list_create(glcpp_parser_t *parser);
73 _argument_list_append(glcpp_parser_t *parser, argument_list_t *list,
83 _token_create_str(glcpp_parser_t *parser, int type, char *str);
86 _token_create_ival(glcpp_parser_t *parser, int type, int ival);
89 _token_list_create(glcpp_parser_t *parser);
92 _token_list_append(glcpp_parser_t *parser, token_list_t *list, token_t *token);
101 _parser_active_list_push(glcpp_parser_t *parser, const char *identifier,
105 _parser_active_list_pop(glcpp_parser_t *parser);
108 _parser_active_list_contains(glcpp_parser_t *parser, const char *identifier);
119 _glcpp_parser_expand_and_lex_from(glcpp_parser_t *parser, int head_token_type,
124 _glcpp_parser_expand_token_list(glcpp_parser_t *parser, token_list_t *list,
128 _glcpp_parser_print_expanded_token_list(glcpp_parser_t *parser,
132 _glcpp_parser_skip_stack_push_if(glcpp_parser_t *parser, YYLTYPE *loc,
136 _glcpp_parser_skip_stack_change_if(glcpp_parser_t *parser, YYLTYPE *loc,
140 _glcpp_parser_skip_stack_pop(glcpp_parser_t *parser, YYLTYPE *loc);
143 _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t version,
147 glcpp_parser_lex(YYSTYPE *yylval, YYLTYPE *yylloc, glcpp_parser_t *parser);
150 glcpp_parser_lex_from(glcpp_parser_t *parser, token_list_t *list);
153 add_builtin_define(glcpp_parser_t *parser, const char *name, int value);
157 %pure-parser
169 %parse-param {glcpp_parser_t *parser}
170 %lex-param {glcpp_parser_t *parser}
210 _glcpp_parser_print_expanded_token_list (parser, $1);
211 _mesa_string_buffer_append_char(parser->output, '\n');
218 if (parser->is_gles && $2.undefined_macro)
219 glcpp_error(& @1, parser, "undefined macro %s in expression (illegal in GLES)", $2.undefined_macro);
220 _glcpp_parser_skip_stack_push_if (parser, & @1, $2.value);
223 if (parser->is_gles && $2.undefined_macro)
224 glcpp_error(& @1, parser, "undefined macro %s in expression (illegal in GLES)", $2.undefined_macro);
225 _glcpp_parser_skip_stack_change_if (parser, & @1, "elif", $2.value);
228 parser->has_new_line_number = 1;
229 parser->new_line_number = $2;
230 _mesa_string_buffer_printf(parser->output, "#line %" PRIiMAX "\n", $2);
233 parser->has_new_line_number = 1;
234 parser->new_line_number = $2;
235 parser->has_new_source_number = 1;
236 parser->new_source_number = $3;
237 _mesa_string_buffer_printf(parser->output,
245 _define_object_macro (parser, & @1, $1, $2);
248 _define_function_macro (parser, & @1, $1, NULL, $4);
251 _define_function_macro (parser, & @1, $1, $3, $5);
257 _mesa_string_buffer_append_char(parser->output, '\n');
262 if (parser->skip_stack == NULL ||
263 parser->skip_stack->type == SKIP_NO_SKIP)
265 _glcpp_parser_expand_and_lex_from (parser,
300 glcpp_error(& @1, parser, "Built-in (pre-defined)"
303 if (parser->is_gles
304 && parser->version >= 300
308 glcpp_error(& @1, parser, "Built-in (pre-defined)"
310 } else if (parser->is_gles && parser->version <= 300) {
311 glcpp_error(& @1, parser,
315 glcpp_warning(& @1, parser,
321 entry = _mesa_hash_table_search (parser->defines, $3);
323 _mesa_hash_table_remove (parser->defines, entry);
334 if (parser->skip_stack == NULL ||
335 parser->skip_stack->type == SKIP_NO_SKIP)
337 _glcpp_parser_expand_and_lex_from (parser,
343 _glcpp_parser_skip_stack_push_if (parser, & @1, 0);
344 parser->skip_stack->type = SKIP_TO_ENDIF;
350 if (parser->skip_stack == NULL ||
351 parser->skip_stack->type == SKIP_NO_SKIP)
353 glcpp_error(& @1, parser, "#if with no expression");
355 _glcpp_parser_skip_stack_push_if (parser, & @1, 0);
359 _mesa_hash_table_search(parser->defines, $3);
361 _glcpp_parser_skip_stack_push_if (parser, & @1, macro != NULL);
365 _mesa_hash_table_search(parser->defines, $3);
367 _glcpp_parser_skip_stack_push_if (parser, & @3, macro == NULL);
377 if (parser->skip_stack &&
378 parser->skip_stack->type == SKIP_TO_ELSE)
380 _glcpp_parser_expand_and_lex_from (parser,
384 else if (parser->skip_stack &&
385 parser->skip_stack->has_else)
387 glcpp_error(& @1, parser, "#elif after #else");
391 _glcpp_parser_skip_stack_change_if (parser, & @1,
398 if (parser->skip_stack &&
399 parser->skip_stack->type == SKIP_TO_ELSE)
401 glcpp_error(& @1, parser, "#elif with no expression");
403 else if (parser->skip_stack &&
404 parser->skip_stack->has_else)
406 glcpp_error(& @1, parser, "#elif after #else");
410 _glcpp_parser_skip_stack_change_if (parser, & @1,
412 glcpp_warning(& @1, parser, "ignoring illegal #elif without expression");
415 | HASH_TOKEN ELSE { parser->lexing_directive = 1; } NEWLINE {
416 if (parser->skip_stack &&
417 parser->skip_stack->has_else)
419 glcpp_error(& @1, parser, "multiple #else");
423 _glcpp_parser_skip_stack_change_if (parser, & @1, "else", 1);
424 if (parser->skip_stack)
425 parser->skip_stack->has_else = true;
429 _glcpp_parser_skip_stack_pop (parser, & @1);
432 if (parser->version_set) {
433 glcpp_error(& @1, parser, "#version must appear on the first line");
435 _glcpp_parser_handle_version_declaration(parser, $3, NULL, true);
438 if (parser->version_set) {
439 glcpp_error(& @1, parser, "#version must appear on the first line");
441 _glcpp_parser_handle_version_declaration(parser, $3, $4, true);
444 glcpp_parser_resolve_implicit_version(parser);
447 _mesa_string_buffer_printf(parser->output, "#%s", $2);
453 glcpp_error(& @1, parser, "#%s", $2);
456 glcpp_error (& @1, parser, "#define without macro name");
459 glcpp_error (& @1, parser, "Illegal non-directive after #");
476 glcpp_error(&@1, parser, "invalid #version \"%s\" (not a decimal constant)", $1);
490 if (parser->is_gles)
491 $$.undefined_macro = linear_strdup(parser->linalloc, $1);
610 yyerror (& @1, parser,
622 yyerror (& @1, parser,
662 $$ = _string_list_create (parser);
663 _string_list_append_item (parser, $$, $1);
667 _string_list_append_item (parser, $$, $3);
684 glcpp_error(&@1, parser, "extra tokens at end of directive");
690 parser->space_tokens = 1;
691 $$ = _token_list_create (parser);
692 _token_list_append (parser, $$, $1);
696 _token_list_append (parser, $$, $2);
702 $$ = _token_create_str (parser, IDENTIFIER, $1);
706 $$ = _token_create_str (parser, INTEGER_STRING, $1);
710 $$ = _token_create_ival (parser, $1, $1);
714 $$ = _token_create_ival (parser, DEFINED, DEFINED);
718 $$ = _token_create_str (parser, OTHER, $1);
722 $$ = _token_create_ival (parser, SPACE, SPACE);
766 _string_list_create(glcpp_parser_t *parser)
770 list = linear_alloc_child(parser->linalloc, sizeof(string_list_t));
778 _string_list_append_item(glcpp_parser_t *parser, string_list_t *list,
783 node = linear_alloc_child(parser->linalloc, sizeof(string_node_t));
784 node->str = linear_strdup(parser->linalloc, str);
877 _argument_list_create(glcpp_parser_t *parser)
881 list = linear_alloc_child(parser->linalloc, sizeof(argument_list_t));
889 _argument_list_append(glcpp_parser_t *parser,
894 node = linear_alloc_child(parser->linalloc, sizeof(argument_node_t));
946 _token_create_str(glcpp_parser_t *parser, int type, char *str)
950 token = linear_alloc_child(parser->linalloc, sizeof(token_t));
958 _token_create_ival(glcpp_parser_t *parser, int type, int ival)
962 token = linear_alloc_child(parser->linalloc, sizeof(token_t));
970 _token_list_create(glcpp_parser_t *parser)
974 list = linear_alloc_child(parser->linalloc, sizeof(token_list_t));
983 _token_list_append(glcpp_parser_t *parser, token_list_t *list, token_t *token)
987 node = linear_alloc_child(parser->linalloc, sizeof(token_node_t));
1019 _token_list_copy(glcpp_parser_t *parser, token_list_t *other)
1027 copy = _token_list_create (parser);
1029 token_t *new_token = linear_alloc_child(parser->linalloc, sizeof(token_t));
1031 _token_list_append (parser, copy, new_token);
1206 _token_paste(glcpp_parser_t *parser, token_t *token, token_t *other)
1223 combined = _token_create_ival (parser, LEFT_SHIFT, LEFT_SHIFT);
1225 combined = _token_create_ival (parser, LESS_OR_EQUAL, LESS_OR_EQUAL);
1229 combined = _token_create_ival (parser, RIGHT_SHIFT, RIGHT_SHIFT);
1231 combined = _token_create_ival (parser, GREATER_OR_EQUAL, GREATER_OR_EQUAL);
1235 combined = _token_create_ival (parser, EQUAL, EQUAL);
1239 combined = _token_create_ival (parser, NOT_EQUAL, NOT_EQUAL);
1243 combined = _token_create_ival (parser, AND, AND);
1247 combined = _token_create_ival (parser, OR, OR);
1291 str = linear_asprintf(parser->linalloc, "%" PRIiMAX, token->value.ival);
1293 str = linear_strdup(parser->linalloc, token->value.str);
1296 linear_asprintf_append(parser->linalloc, &str, "%" PRIiMAX, other->value.ival);
1298 linear_strcat(parser->linalloc, &str, other->value.str);
1307 combined = _token_create_str (parser, combined_type, str);
1313 glcpp_error (&token->location, parser, "");
1314 _mesa_string_buffer_append(parser->info_log, "Pasting \"");
1315 _token_print(parser->info_log, token);
1316 _mesa_string_buffer_append(parser->info_log, "\" and \"");
1317 _token_print(parser->info_log, other);
1318 _mesa_string_buffer_append(parser->info_log, "\" does not give a valid preprocessing token.\n");
1324 _token_list_print(glcpp_parser_t *parser, token_list_t *list)
1332 _token_print(parser->output, node->token);
1336 yyerror(YYLTYPE *locp, glcpp_parser_t *parser, const char *error)
1338 glcpp_error(locp, parser, "%s", error);
1342 add_builtin_define(glcpp_parser_t *parser, const char *name, int value)
1347 tok = _token_create_ival (parser, INTEGER, value);
1349 list = _token_list_create(parser);
1350 _token_list_append(parser, list, tok);
1351 _define_object_macro(parser, NULL, name, list);
1363 glcpp_parser_t *parser;
1365 parser = ralloc (NULL, glcpp_parser_t);
1367 glcpp_lex_init_extra (parser, &parser->scanner);
1368 parser->defines = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
1370 parser->linalloc = linear_alloc_parent(parser, 0);
1371 parser->active = NULL;
1372 parser->lexing_directive = 0;
1373 parser->lexing_version_directive = 0;
1374 parser->space_tokens = 1;
1375 parser->last_token_was_newline = 0;
1376 parser->last_token_was_space = 0;
1377 parser->first_non_space_token_this_line = 1;
1378 parser->newline_as_space = 0;
1379 parser->in_control_line = 0;
1380 parser->paren_count = 0;
1381 parser->commented_newlines = 0;
1383 parser->skip_stack = NULL;
1384 parser->skipping = 0;
1386 parser->lex_from_list = NULL;
1387 parser->lex_from_node = NULL;
1389 parser->output = _mesa_string_buffer_create(parser,
1391 parser->info_log = _mesa_string_buffer_create(parser,
1393 parser->error = 0;
1395 parser->extensions = extensions;
1396 parser->extension_list = extension_list;
1397 parser->state = state;
1398 parser->api = api;
1399 parser->version = 0;
1400 parser->version_set = false;
1402 parser->has_new_line_number = 0;
1403 parser->new_line_number = 1;
1404 parser->has_new_source_number = 0;
1405 parser->new_source_number = 0;
1407 parser->is_gles = false;
1409 return parser;
1413 glcpp_parser_destroy(glcpp_parser_t *parser)
1415 glcpp_lex_destroy (parser->scanner);
1416 _mesa_hash_table_destroy(parser->defines, NULL);
1417 ralloc_free (parser);
1451 _arguments_parse(glcpp_parser_t *parser,
1469 argument = _token_list_create (parser);
1470 _argument_list_append (parser, arguments, argument);
1483 argument = _token_list_create (parser);
1484 _argument_list_append (parser, arguments, argument);
1491 _token_list_append(parser, argument, node->token);
1504 _token_list_create_with_one_ival(glcpp_parser_t *parser, int type, int ival)
1509 list = _token_list_create(parser);
1510 node = _token_create_ival(parser, type, ival);
1511 _token_list_append(parser, list, node);
1517 _token_list_create_with_one_space(glcpp_parser_t *parser)
1519 return _token_list_create_with_one_ival(parser, SPACE, SPACE);
1523 _token_list_create_with_one_integer(glcpp_parser_t *parser, int ival)
1525 return _token_list_create_with_one_ival(parser, INTEGER, ival);
1550 _glcpp_parser_evaluate_defined(glcpp_parser_t *parser, token_node_t *node,
1596 return _mesa_hash_table_search(parser->defines,
1600 glcpp_error (&defined->token->location, parser,
1608 _glcpp_parser_evaluate_defined_in_list(glcpp_parser_t *parser,
1625 value = _glcpp_parser_evaluate_defined (parser, node, &last);
1629 replacement = linear_alloc_child(parser->linalloc, sizeof(token_node_t));
1630 replacement->token = _token_create_ival (parser, INTEGER, value);
1659 _glcpp_parser_expand_and_lex_from(glcpp_parser_t *parser, int head_token_type,
1665 expanded = _token_list_create (parser);
1666 token = _token_create_ival (parser, head_token_type, head_token_type);
1667 _token_list_append (parser, expanded, token);
1668 _glcpp_parser_expand_token_list (parser, list, mode);
1670 glcpp_parser_lex_from (parser, expanded);
1674 _glcpp_parser_apply_pastes(glcpp_parser_t *parser, token_list_t *list)
1701 yyerror(&node->token->location, parser, "'##' cannot appear at either end of a macro expansion\n");
1705 node->token = _token_paste(parser, node->token, next_non_space->token);
1735 _glcpp_parser_expand_function(glcpp_parser_t *parser, token_node_t *node,
1748 entry = _mesa_hash_table_search(parser->defines, identifier);
1753 arguments = _argument_list_create(parser);
1754 status = _arguments_parse(parser, arguments, node, last);
1762 glcpp_error(&node->token->location, parser, "Macro %s call has unbalanced parentheses\n", identifier);
1768 return _token_list_create_with_one_space(parser);
1776 glcpp_error(&node->token->location, parser,
1784 substituted = _token_list_create(parser);
1796 expanded_argument = _token_list_copy(parser, argument);
1797 _glcpp_parser_expand_token_list(parser, expanded_argument, mode);
1802 new_token = _token_create_ival(parser, PLACEHOLDER,
1804 _token_list_append(parser, substituted, new_token);
1807 _token_list_append(parser, substituted, node->token);
1816 _glcpp_parser_apply_pastes(parser, substituted);
1840 _glcpp_parser_expand_node(glcpp_parser_t *parser, token_node_t *node,
1860 return _token_list_create_with_one_integer(parser,
1864 return _token_list_create_with_one_integer(parser,
1869 entry = _mesa_hash_table_search(parser->defines, identifier);
1878 if (_parser_active_list_contains (parser, identifier)) {
1885 str = linear_strdup(parser->linalloc, token->value.str);
1886 final = _token_create_str(parser, OTHER, str);
1887 expansion = _token_list_create(parser);
1888 _token_list_append(parser, expansion, final);
1897 return _token_list_create_with_one_space(parser);
1899 replacement = _token_list_copy(parser, macro->replacements);
1900 _glcpp_parser_apply_pastes(parser, replacement);
1904 return _glcpp_parser_expand_function(parser, node, last, mode);
1907 /* Push a new identifier onto the parser's active list.
1915 _parser_active_list_push(glcpp_parser_t *parser, const char *identifier,
1920 node = linear_alloc_child(parser->linalloc, sizeof(active_list_t));
1921 node->identifier = linear_strdup(parser->linalloc, identifier);
1923 node->next = parser->active;
1925 parser->active = node;
1929 _parser_active_list_pop(glcpp_parser_t *parser)
1931 active_list_t *node = parser->active;
1934 parser->active = NULL;
1938 node = parser->active->next;
1939 parser->active = node;
1943 _parser_active_list_contains(glcpp_parser_t *parser, const char *identifier)
1947 if (parser->active == NULL)
1950 for (node = parser->active; node; node = node->next)
1979 _glcpp_parser_expand_token_list(glcpp_parser_t *parser, token_list_t *list,
1985 active_list_t *active_initial = parser->active;
1996 _glcpp_parser_evaluate_defined_in_list (parser, list);
2000 while (parser->active && parser->active->marker == node)
2001 _parser_active_list_pop (parser);
2003 expansion = _glcpp_parser_expand_node (parser, node, &last, mode);
2008 _glcpp_parser_evaluate_defined_in_list (parser, expansion);
2012 while (parser->active && parser->active->marker == n) {
2013 _parser_active_list_pop (parser);
2016 _parser_active_list_push(parser, node->token->value.str, last->next);
2046 while (parser->active && parser->active != active_initial)
2047 _parser_active_list_pop (parser);
2053 _glcpp_parser_print_expanded_token_list(glcpp_parser_t *parser,
2059 _glcpp_parser_expand_token_list (parser, list, EXPANSION_MODE_IGNORE_DEFINED);
2063 _token_list_print (parser, list);
2067 _check_for_reserved_macro_name(glcpp_parser_t *parser, YYLTYPE *loc,
2088 glcpp_warning(loc, parser, "Macro names containing \"__\" are reserved "
2092 glcpp_error (loc, parser, "Macro names starting with \"GL_\" are reserved.\n");
2095 glcpp_error (loc, parser, "\"defined\" cannot be used as a macro name");
2114 _define_object_macro(glcpp_parser_t *parser, YYLTYPE *loc,
2124 _check_for_reserved_macro_name(parser, loc, identifier);
2126 macro = linear_alloc_child(parser->linalloc, sizeof(macro_t));
2130 macro->identifier = linear_strdup(parser->linalloc, identifier);
2133 entry = _mesa_hash_table_search(parser->defines, identifier);
2139 glcpp_error (loc, parser, "Redefinition of macro %s\n", identifier);
2142 _mesa_hash_table_insert (parser->defines, identifier, macro);
2146 _define_function_macro(glcpp_parser_t *parser, YYLTYPE *loc,
2154 _check_for_reserved_macro_name(parser, loc, identifier);
2158 glcpp_error (loc, parser, "Duplicate macro parameter \"%s\"", dup);
2161 macro = linear_alloc_child(parser->linalloc, sizeof(macro_t));
2165 macro->identifier = linear_strdup(parser->linalloc, identifier);
2168 entry = _mesa_hash_table_search(parser->defines, identifier);
2174 glcpp_error (loc, parser, "Redefinition of macro %s\n", identifier);
2177 _mesa_hash_table_insert(parser->defines, identifier, macro);
2181 glcpp_parser_lex(YYSTYPE *yylval, YYLTYPE *yylloc, glcpp_parser_t *parser)
2186 if (parser->lex_from_list == NULL) {
2187 ret = glcpp_lex(yylval, yylloc, parser->scanner);
2201 if (parser->newline_as_space) {
2203 parser->paren_count++;
2205 parser->paren_count--;
2206 if (parser->paren_count == 0)
2207 parser->newline_as_space = 0;
2211 if (parser->paren_count == 0)
2212 parser->newline_as_space = 0;
2214 } else if (parser->in_control_line) {
2216 parser->in_control_line = 0;
2221 parser->in_control_line = 1;
2223 struct hash_entry *entry = _mesa_hash_table_search(parser->defines,
2227 parser->newline_as_space = 1;
2228 parser->paren_count = 0;
2235 node = parser->lex_from_node;
2238 parser->lex_from_list = NULL;
2245 parser->lex_from_node = node->next;
2251 glcpp_parser_lex_from(glcpp_parser_t *parser, token_list_t *list)
2255 assert (parser->lex_from_list == NULL);
2258 parser->lex_from_list = _token_list_create (parser);
2263 _token_list_append (parser, parser->lex_from_list, node->token);
2266 parser->lex_from_node = parser->lex_from_list->head;
2269 if (parser->lex_from_node == NULL) {
2270 parser->lex_from_list = NULL;
2275 _glcpp_parser_skip_stack_push_if(glcpp_parser_t *parser, YYLTYPE *loc,
2281 if (parser->skip_stack)
2282 current = parser->skip_stack->type;
2284 node = linear_alloc_child(parser->linalloc, sizeof(skip_node_t));
2297 node->next = parser->skip_stack;
2298 parser->skip_stack = node;
2302 _glcpp_parser_skip_stack_change_if(glcpp_parser_t *parser, YYLTYPE *loc,
2305 if (parser->skip_stack == NULL) {
2306 glcpp_error (loc, parser, "#%s without #if\n", type);
2310 if (parser->skip_stack->type == SKIP_TO_ELSE) {
2312 parser->skip_stack->type = SKIP_NO_SKIP;
2314 parser->skip_stack->type = SKIP_TO_ENDIF;
2319 _glcpp_parser_skip_stack_pop(glcpp_parser_t *parser, YYLTYPE *loc)
2323 if (parser->skip_stack == NULL) {
2324 glcpp_error (loc, parser, "#endif without #if\n");
2328 node = parser->skip_stack;
2329 parser->skip_stack = node->next;
2333 _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t version,
2337 if (parser->version_set)
2340 parser->version = version;
2341 parser->version_set = true;
2343 add_builtin_define (parser, "__VERSION__", version);
2345 parser->is_gles = (version == 100) ||
2351 if (parser->is_gles)
2352 add_builtin_define(parser, "GL_ES", 1);
2354 add_builtin_define(parser, "GL_compatibility_profile", 1);
2356 add_builtin_define(parser, "GL_core_profile", 1);
2363 if (version >= 130 || parser->is_gles)
2364 add_builtin_define (parser, "GL_FRAGMENT_PRECISION_HIGH", 1);
2367 if (parser->extensions)
2368 parser->extensions(parser->state, add_builtin_define, parser,
2369 version, parser->is_gles);
2371 if (parser->extension_list) {
2376 if (parser->extension_list->MESA_shader_integer_functions) {
2377 add_builtin_define(parser, "__have_builtin_builtin_sign64", 1);
2378 add_builtin_define(parser, "__have_builtin_builtin_umul64", 1);
2379 add_builtin_define(parser, "__have_builtin_builtin_udiv64", 1);
2380 add_builtin_define(parser, "__have_builtin_builtin_umod64", 1);
2381 add_builtin_define(parser, "__have_builtin_builtin_idiv64", 1);
2382 add_builtin_define(parser, "__have_builtin_builtin_imod64", 1);
2387 _mesa_string_buffer_printf(parser->output,
2401 glcpp_parser_resolve_implicit_version(glcpp_parser_t *parser)
2403 int language_version = parser->api == API_OPENGLES2 ?
2406 _glcpp_parser_handle_version_declaration(parser, language_version,