PR c++/27177
[official-gcc.git] / gcc / treelang / parse.y
blob65225205bd52e056d00a7f60a82d2bb875a1dfcc
1 /* -*- c -*- emacs mode c */
2 /* TREELANG Compiler parser.
4 ---------------------------------------------------------------------
6 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
7 Free Software Foundation, Inc.
9 This program is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 3, or (at your option) any
12 later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>.
23 In other words, you are welcome to use, share and improve this program.
24 You are forbidden to forbid anyone else to use, share and improve
25 what you give them. Help stamp out software-hoarding!
27 ---------------------------------------------------------------------
29 Written by Tim Josling 1999-2001, based in part on other parts of
30 the GCC compiler. */
32 /* Grammar Conflicts
33 *****************
34 There are no conflicts in this grammar. Please keep it that way. */
37 #include "config.h"
38 #include "system.h"
39 #include "coretypes.h"
40 #include "tm.h"
41 #include "timevar.h"
42 #include "tree.h"
44 #include "treelang.h"
45 #include "treetree.h"
46 #include "toplev.h"
48 #define YYDEBUG 1
49 #define YYPRINT(file, type, value) print_token (file, type, value)
50 #define YYERROR_VERBOSE YES
52 /* My yylex routine used to intercept calls to flex generated code, to
53 record lex time. */
54 int yylex (void);
55 static inline int my_yylex (void);
57 /* Call lex, but ensure time is charged to TV_LEX. */
58 static inline int
59 my_yylex (void)
61 int res;
62 timevar_push (TV_LEX);
63 res = yylex ();
64 timevar_pop (TV_LEX);
65 return res;
67 #define yylex my_yylex
69 extern int option_parser_trace;
71 /* Local prototypes. */
72 static void yyerror (const char *error_message);
73 int yyparse (void);
74 void print_token (FILE *file, unsigned int type ATTRIBUTE_UNUSED,
75 YYSTYPE value);
76 static struct prod_token_parm_item *reverse_prod_list
77 (struct prod_token_parm_item *old_first);
78 static void ensure_not_void (unsigned int type,
79 struct prod_token_parm_item *name);
80 static int check_type_match (int type_num, struct prod_token_parm_item *exp);
81 static int get_common_type (struct prod_token_parm_item *type1,
82 struct prod_token_parm_item *type2);
83 static struct prod_token_parm_item *make_integer_constant
84 (struct prod_token_parm_item *value);
85 static struct prod_token_parm_item *make_plus_expression
86 (struct prod_token_parm_item *tok, struct prod_token_parm_item *op1,
87 struct prod_token_parm_item *op2, int type_code, int prod_code);
88 static void set_storage (struct prod_token_parm_item *prod);
90 /* File global variables. */
91 static struct prod_token_parm_item *current_function = NULL;
94 /* Not %raw - seems to have bugs. */
95 %token_table
97 /* Punctuation. */
98 %token RIGHT_BRACE
99 %token LEFT_BRACE
100 %token RIGHT_SQUARE_BRACKET
101 %token LEFT_SQUARE_BRACKET
102 %token RIGHT_PARENTHESIS
103 %token LEFT_PARENTHESIS
104 %token SEMICOLON
105 %token ASTERISK
106 %token COMMA
107 %right EQUALS
108 %right ASSIGN
109 %left tl_PLUS
110 %left tl_MINUS
112 /* Literals. */
113 %token INTEGER
115 /* Keywords. */
116 %token IF
117 %token ELSE
118 %token tl_RETURN
119 %token CHAR
120 %token INT
121 %token UNSIGNED
122 %token VOID
123 %token TYPEDEF
124 %token NAME
125 %token STATIC
126 %token AUTOMATIC
127 %token EXTERNAL_DEFINITION
128 %token EXTERNAL_REFERENCE
130 /* Tokens not passed to parser. */
131 %token WHITESPACE
132 %token COMMENT
134 /* Pseudo tokens - productions. */
135 %token PROD_VARIABLE_NAME
136 %token PROD_TYPE_NAME
137 %token PROD_FUNCTION_NAME
138 %token PROD_INTEGER_CONSTANT
139 %token PROD_PLUS_EXPRESSION
140 %token PROD_MINUS_EXPRESSION
141 %token PROD_ASSIGN_EXPRESSION
142 %token PROD_VARIABLE_REFERENCE_EXPRESSION
143 %token PROD_PARAMETER
144 %token PROD_FUNCTION_INVOCATION
145 %expect 0
148 file:
149 /* Nil. */ {
150 /* Nothing to do. */
152 |declarations {
153 /* Nothing to do. */
158 declarations:
159 declaration {
160 /* Nothing to do. */
162 | declarations declaration {
163 /* Nothing to do. */
167 declaration:
168 variable_def {
169 /* Nothing to do. */
171 |function_prototype {
172 /* Nothing to do. */
174 |function {
175 /* Nothing to do. */
179 variable_def:
180 storage typename NAME init_opt SEMICOLON {
181 struct prod_token_parm_item *tok;
182 struct prod_token_parm_item *prod;
183 tok = $3;
184 prod = make_production (PROD_VARIABLE_NAME, tok);
185 SYMBOL_TABLE_NAME (prod) = tok;
186 EXPRESSION_TYPE (prod) = $2;
187 VAR_INIT (prod) = $4;
188 NUMERIC_TYPE (prod) =
189 NUMERIC_TYPE (( (struct prod_token_parm_item *)EXPRESSION_TYPE (prod)));
190 ensure_not_void (NUMERIC_TYPE (prod), tok);
191 if (insert_tree_name (prod))
193 YYERROR;
195 STORAGE_CLASS_TOKEN (prod) = $1;
196 set_storage (prod);
198 if (VAR_INIT (prod))
200 gcc_assert (((struct prod_token_parm_item *)
201 VAR_INIT (prod))->tp.pro.code);
202 if (STORAGE_CLASS (prod) == EXTERNAL_REFERENCE_STORAGE)
204 error("%Hexternal reference variable %q.*s has an initial value",
205 &tok->tp.tok.location, tok->tp.tok.length, tok->tp.tok.chars);
206 YYERROR;
207 VAR_INIT (prod) = NULL;
212 prod->tp.pro.code = tree_code_create_variable
213 (STORAGE_CLASS (prod),
214 ((struct prod_token_parm_item *)SYMBOL_TABLE_NAME (prod))->tp.tok.chars,
215 ((struct prod_token_parm_item *)SYMBOL_TABLE_NAME (prod))->tp.tok.length,
216 NUMERIC_TYPE (prod),
217 VAR_INIT (prod) ?
218 ((struct prod_token_parm_item *)VAR_INIT (prod))->tp.pro.code : NULL,
219 tok->tp.tok.location);
220 gcc_assert (prod->tp.pro.code);
224 storage:
225 STATIC
226 |AUTOMATIC
227 |EXTERNAL_DEFINITION
228 |EXTERNAL_REFERENCE
231 parameter:
232 typename NAME {
233 struct prod_token_parm_item *tok;
234 struct prod_token_parm_item *prod;
235 struct prod_token_parm_item *prod2;
236 tok = $2;
237 prod = make_production (PROD_VARIABLE_NAME, tok);
238 SYMBOL_TABLE_NAME (prod) = $2;
239 EXPRESSION_TYPE (prod) = $1;
240 NUMERIC_TYPE (prod) =
241 NUMERIC_TYPE (( (struct prod_token_parm_item *)EXPRESSION_TYPE (prod)));
242 ensure_not_void (NUMERIC_TYPE (prod), tok);
243 if (insert_tree_name (prod))
245 YYERROR;
247 prod2 = make_production (PROD_PARAMETER, tok);
248 VARIABLE (prod2) = prod;
249 $$ = prod2;
253 function_prototype:
254 storage typename NAME LEFT_PARENTHESIS parameters_opt RIGHT_PARENTHESIS SEMICOLON {
255 struct prod_token_parm_item *tok;
256 struct prod_token_parm_item *prod;
257 struct prod_token_parm_item *type;
258 struct prod_token_parm_item *first_parms;
259 struct prod_token_parm_item *last_parms;
260 struct prod_token_parm_item *this_parms;
261 struct prod_token_parm_item *this_parm;
262 struct prod_token_parm_item *this_parm_var;
263 tok = $3;
264 prod = make_production (PROD_FUNCTION_NAME, $3);
265 SYMBOL_TABLE_NAME (prod) = $3;
266 EXPRESSION_TYPE (prod) = $2;
267 NUMERIC_TYPE (prod) =
268 NUMERIC_TYPE (( (struct prod_token_parm_item *)EXPRESSION_TYPE (prod)));
269 PARAMETERS (prod) = reverse_prod_list ($5);
270 insert_tree_name (prod);
271 STORAGE_CLASS_TOKEN (prod) = $1;
272 set_storage (prod);
273 switch (STORAGE_CLASS (prod))
275 case STATIC_STORAGE:
276 case EXTERNAL_DEFINITION_STORAGE:
277 case EXTERNAL_REFERENCE_STORAGE:
278 break;
280 case AUTOMATIC_STORAGE:
281 error ("%Hfunction %q.*s cannot be automatic",
282 &tok->tp.tok.location, tok->tp.tok.length, tok->tp.tok.chars);
283 YYERROR;
284 break;
286 default:
287 gcc_unreachable ();
289 type = EXPRESSION_TYPE (prod);
290 /* Create a parameter list in a non-front end specific format. */
291 for (first_parms = NULL, last_parms = NULL, this_parm = PARAMETERS (prod);
292 this_parm;
293 this_parm = this_parm->tp.pro.next)
295 gcc_assert (this_parm->category == production_category);
296 this_parm_var = VARIABLE (this_parm);
298 gcc_assert (this_parm_var);
299 gcc_assert (this_parm_var->category == production_category);
300 gcc_assert (this_parm_var->tp.pro.main_token);
302 this_parms = my_malloc (sizeof (struct prod_token_parm_item));
304 this_parms->tp.par.variable_name =
305 this_parm_var->tp.pro.main_token->tp.tok.chars;
306 this_parms->category = parameter_category;
307 this_parms->type = NUMERIC_TYPE
308 (( (struct prod_token_parm_item *)EXPRESSION_TYPE (this_parm_var)));
309 if (last_parms)
311 last_parms->tp.par.next = this_parms;
312 last_parms = this_parms;
314 else
316 first_parms = this_parms;
317 last_parms = this_parms;
319 this_parms->tp.par.where_to_put_var_tree =
320 & (((struct prod_token_parm_item *)VARIABLE (this_parm))->tp.pro.code);
322 FIRST_PARMS (prod) = first_parms;
324 prod->tp.pro.code =
325 tree_code_create_function_prototype (tok->tp.tok.chars,
326 STORAGE_CLASS (prod),
327 NUMERIC_TYPE (type),
328 first_parms, tok->tp.tok.location);
330 #ifdef ENABLE_CHECKING
331 /* Check all the parameters have code. */
332 for (this_parm = PARAMETERS (prod);
333 this_parm;
334 this_parm = this_parm->tp.pro.next)
336 gcc_assert ((struct prod_token_parm_item *)VARIABLE (this_parm));
337 gcc_assert (((struct prod_token_parm_item *)
338 VARIABLE (this_parm))->tp.pro.code);
340 #endif
344 function:
345 NAME LEFT_BRACE {
346 struct prod_token_parm_item *proto;
347 struct prod_token_parm_item search_prod;
348 struct prod_token_parm_item *tok;
349 tok = $1;
350 SYMBOL_TABLE_NAME ((&search_prod)) = tok;
351 search_prod.category = token_category;
352 current_function = proto = lookup_tree_name (&search_prod);
353 if (!proto)
355 error ("%Hno prototype found for %q.*s", &tok->tp.tok.location,
356 tok->tp.tok.length, tok->tp.tok.chars);
357 YYERROR;
360 gcc_assert (proto->tp.pro.code);
362 tree_code_create_function_initial (proto->tp.pro.code, tok->tp.tok.location);
365 variable_defs_opt statements_opt RIGHT_BRACE {
366 struct prod_token_parm_item *tok;
367 tok = $1;
368 tree_code_create_function_wrapup (tok->tp.tok.location);
369 current_function = NULL;
373 variable_defs_opt:
374 /* Nil. */ {
375 $$ = 0;
377 |variable_defs {
378 $$ = $1;
382 statements_opt:
383 /* Nil. */ {
384 $$ = 0;
386 |statements {
387 $$ = $1;
391 variable_defs:
392 variable_def {
393 /* Nothing to do. */
395 |variable_defs variable_def {
396 /* Nothing to do. */
400 typename:
401 INT {
402 struct prod_token_parm_item *tok;
403 struct prod_token_parm_item *prod;
404 tok = $1;
405 prod = make_production (PROD_TYPE_NAME, tok);
406 NUMERIC_TYPE (prod) = SIGNED_INT;
407 prod->tp.pro.code = tree_code_get_type (NUMERIC_TYPE (prod));
408 $$ = prod;
410 |UNSIGNED INT {
411 struct prod_token_parm_item *tok;
412 struct prod_token_parm_item *prod;
413 tok = $1;
414 prod = make_production (PROD_TYPE_NAME, tok);
415 NUMERIC_TYPE (prod) = UNSIGNED_INT;
416 prod->tp.pro.code = tree_code_get_type (NUMERIC_TYPE (prod));
417 $$ = prod;
419 |CHAR {
420 struct prod_token_parm_item *tok;
421 struct prod_token_parm_item *prod;
422 tok = $1;
423 prod = make_production (PROD_TYPE_NAME, tok);
424 NUMERIC_TYPE (prod) = SIGNED_CHAR;
425 prod->tp.pro.code = tree_code_get_type (NUMERIC_TYPE (prod));
426 $$ = prod;
428 |UNSIGNED CHAR {
429 struct prod_token_parm_item *tok;
430 struct prod_token_parm_item *prod;
431 tok = $1;
432 prod = make_production (PROD_TYPE_NAME, tok);
433 NUMERIC_TYPE (prod) = UNSIGNED_CHAR;
434 prod->tp.pro.code = tree_code_get_type (NUMERIC_TYPE (prod));
435 $$ = prod;
437 |VOID {
438 struct prod_token_parm_item *tok;
439 struct prod_token_parm_item *prod;
440 tok = $1;
441 prod = make_production (PROD_TYPE_NAME, tok);
442 NUMERIC_TYPE (prod) = VOID_TYPE;
443 prod->tp.pro.code = tree_code_get_type (NUMERIC_TYPE (prod));
444 $$ = prod;
448 parameters_opt:
449 /* Nothing to do. */ {
450 $$ = 0;
452 | parameters {
453 $$ = $1;
457 parameters:
458 parameter {
459 /* Nothing to do. */
460 $$ = $1;
462 |parameters COMMA parameter {
463 struct prod_token_parm_item *prod1;
464 prod1 = $3;
465 prod1->tp.pro.next = $1; /* Insert in reverse order. */
466 $$ = prod1;
470 statements:
471 statement {
472 /* Nothing to do. */
474 |statements statement {
475 /* Nothing to do. */
479 statement:
480 expression SEMICOLON {
481 struct prod_token_parm_item *exp;
482 exp = $1;
483 tree_code_output_expression_statement (exp->tp.pro.code,
484 exp->tp.pro.main_token->tp.tok.location);
486 |return SEMICOLON {
487 /* Nothing to do. */
489 |if_statement {
490 /* Nothing to do. */
494 if_statement:
495 IF LEFT_PARENTHESIS expression RIGHT_PARENTHESIS {
496 struct prod_token_parm_item *tok;
497 struct prod_token_parm_item *exp;
498 tok = $1;
499 exp = $3;
500 ensure_not_void (NUMERIC_TYPE (exp), exp->tp.pro.main_token);
501 tree_code_if_start (exp->tp.pro.code, tok->tp.tok.location);
503 LEFT_BRACE variable_defs_opt statements_opt RIGHT_BRACE {
504 /* Just let the statements flow. */
506 ELSE {
507 struct prod_token_parm_item *tok;
508 tok = $1;
509 tree_code_if_else (tok->tp.tok.location);
511 LEFT_BRACE variable_defs_opt statements_opt RIGHT_BRACE {
512 struct prod_token_parm_item *tok;
513 tok = $1;
514 tree_code_if_end (tok->tp.tok.location);
519 return:
520 tl_RETURN expression_opt {
521 struct prod_token_parm_item *type_prod;
522 struct prod_token_parm_item *ret_tok = $1;
523 struct prod_token_parm_item *exp = $2;
525 type_prod = EXPRESSION_TYPE (current_function);
526 if (NUMERIC_TYPE (type_prod) == VOID_TYPE)
527 if (exp == NULL)
528 tree_code_generate_return (type_prod->tp.pro.code, NULL);
529 else
531 warning (0, "%Hredundant expression in return",
532 &ret_tok->tp.tok.location);
533 tree_code_generate_return (type_prod->tp.pro.code, NULL);
535 else
536 if (exp == NULL)
537 error ("%Hexpression missing in return", &ret_tok->tp.tok.location);
538 else
540 /* Check same type. */
541 if (check_type_match (NUMERIC_TYPE (type_prod), exp))
543 gcc_assert (type_prod->tp.pro.code);
544 gcc_assert (exp->tp.pro.code);
546 /* Generate the code. */
547 tree_code_generate_return (type_prod->tp.pro.code,
548 exp->tp.pro.code);
554 expression_opt:
555 /* Nil. */ {
556 $$ = 0;
558 |expression {
559 struct prod_token_parm_item *exp;
560 exp = $1;
561 gcc_assert (exp->tp.pro.code);
563 $$ = $1;
567 expression:
568 INTEGER {
569 $$ = make_integer_constant ($1);
571 |variable_ref {
572 $$ = $1;
574 |expression tl_PLUS expression {
575 struct prod_token_parm_item *tok = $2;
576 struct prod_token_parm_item *op1 = $1;
577 struct prod_token_parm_item *op2 = $3;
578 int type_code = get_common_type (op1, op2);
579 if (!type_code)
580 YYERROR;
581 $$ = make_plus_expression (tok, op1, op2, type_code, EXP_PLUS);
583 |expression tl_MINUS expression %prec tl_PLUS {
584 struct prod_token_parm_item *tok = $2;
585 struct prod_token_parm_item *op1 = $1;
586 struct prod_token_parm_item *op2 = $3;
587 int type_code = get_common_type (op1, op2);
588 if (!type_code)
589 YYERROR;
590 $$ = make_plus_expression (tok, op1, op2, type_code, EXP_MINUS);
592 |expression EQUALS expression {
593 struct prod_token_parm_item *tok = $2;
594 struct prod_token_parm_item *op1 = $1;
595 struct prod_token_parm_item *op2 = $3;
596 int type_code = NUMERIC_TYPE (op1);
597 if (!type_code)
598 YYERROR;
599 $$ = make_plus_expression
600 (tok, op1, op2, type_code, EXP_EQUALS);
602 |variable_ref ASSIGN expression {
603 struct prod_token_parm_item *tok = $2;
604 struct prod_token_parm_item *op1 = $1;
605 struct prod_token_parm_item *op2 = $3;
606 int type_code = NUMERIC_TYPE (op1);
607 if (!type_code)
608 YYERROR;
609 $$ = make_plus_expression
610 (tok, op1, op2, type_code, EXP_ASSIGN);
612 |function_invocation {
613 $$ = $1;
617 function_invocation:
618 NAME LEFT_PARENTHESIS expressions_with_commas_opt RIGHT_PARENTHESIS {
619 struct prod_token_parm_item *prod;
620 struct prod_token_parm_item *tok;
621 struct prod_token_parm_item search_prod;
622 struct prod_token_parm_item *proto;
623 struct prod_token_parm_item *exp;
624 struct prod_token_parm_item *exp_proto;
625 struct prod_token_parm_item *var;
626 int exp_proto_count;
627 int exp_count;
628 tree parms;
629 tree type;
631 tok = $1;
632 prod = make_production (PROD_FUNCTION_INVOCATION, tok);
633 SYMBOL_TABLE_NAME (prod) = tok;
634 PARAMETERS (prod) = reverse_prod_list ($3);
635 SYMBOL_TABLE_NAME ((&search_prod)) = tok;
636 search_prod.category = token_category;
637 proto = lookup_tree_name (&search_prod);
638 if (!proto)
640 error ("%Hfunction prototype not found for %q.*s",
641 &tok->tp.tok.location, tok->tp.tok.length, tok->tp.tok.chars);
642 YYERROR;
644 EXPRESSION_TYPE (prod) = EXPRESSION_TYPE (proto);
645 NUMERIC_TYPE (prod) = NUMERIC_TYPE (proto);
646 /* Count the expressions and ensure they match the prototype. */
647 for (exp_proto_count = 0, exp_proto = PARAMETERS (proto);
648 exp_proto; exp_proto = exp_proto->tp.pro.next)
649 exp_proto_count++;
651 for (exp_count = 0, exp = PARAMETERS (prod); exp; exp = exp->tp.pro.next)
652 exp_count++;
654 if (exp_count != exp_proto_count)
656 error ("%Hexpression count mismatch %q.*s with prototype",
657 &tok->tp.tok.location, tok->tp.tok.length, tok->tp.tok.chars);
658 YYERROR;
660 parms = tree_code_init_parameters ();
661 for (exp_proto = PARAMETERS (proto), exp = PARAMETERS (prod);
662 exp_proto;
663 exp = exp->tp.pro.next, exp_proto = exp_proto->tp.pro.next)
665 gcc_assert (exp);
666 gcc_assert (exp_proto);
667 gcc_assert (exp->tp.pro.code);
669 var = VARIABLE (exp_proto);
671 gcc_assert (var);
672 gcc_assert (var->tp.pro.code);
674 parms = tree_code_add_parameter (parms, var->tp.pro.code,
675 exp->tp.pro.code);
677 type = tree_code_get_type (NUMERIC_TYPE (prod));
678 prod->tp.pro.code = tree_code_get_expression (EXP_FUNCTION_INVOCATION, type,
679 proto->tp.pro.code,
680 nreverse (parms),
681 NULL, tok->tp.tok.location);
682 $$ = prod;
686 expressions_with_commas_opt:
687 /* Nil. */ {
688 $$ = 0
690 |expressions_with_commas { $$ = $1 }
693 expressions_with_commas:
694 expression {
695 struct prod_token_parm_item *exp;
696 exp = $1;
697 ensure_not_void (NUMERIC_TYPE (exp), exp->tp.pro.main_token);
698 $$ = $1;
700 |expressions_with_commas COMMA expression {
701 struct prod_token_parm_item *exp;
702 exp = $3;
703 ensure_not_void (NUMERIC_TYPE (exp), exp->tp.pro.main_token);
704 exp->tp.pro.next = $1; /* Reverse order. */
705 $$ = exp;
709 variable_ref:
710 NAME {
711 struct prod_token_parm_item search_prod;
712 struct prod_token_parm_item *prod;
713 struct prod_token_parm_item *symbol_table_entry;
714 struct prod_token_parm_item *tok;
715 tree type;
717 tok = $1;
718 SYMBOL_TABLE_NAME ((&search_prod)) = tok;
719 search_prod.category = token_category;
720 symbol_table_entry = lookup_tree_name (&search_prod);
721 if (!symbol_table_entry)
723 error ("%Hvariable %q.*s not defined",
724 &tok->tp.tok.location, tok->tp.tok.length, tok->tp.tok.chars);
725 YYERROR;
728 prod = make_production (PROD_VARIABLE_REFERENCE_EXPRESSION, tok);
729 NUMERIC_TYPE (prod) = NUMERIC_TYPE (symbol_table_entry);
730 type = tree_code_get_type (NUMERIC_TYPE (prod));
731 if (!NUMERIC_TYPE (prod))
732 YYERROR;
733 OP1 (prod) = $1;
735 prod->tp.pro.code =
736 tree_code_get_expression (EXP_REFERENCE, type,
737 symbol_table_entry->tp.pro.code, NULL, NULL,
738 tok->tp.tok.location);
739 $$ = prod;
743 init_opt:
744 /* Nil. */ {
745 $$ = 0;
747 |init {
748 /* Pass the initialization value up. */
749 $$ = $1;
752 init:
753 ASSIGN init_element {
754 $$ = $2;
758 init_element:
759 INTEGER {
760 $$ = make_integer_constant ($1);
766 /* Print a token VALUE to file FILE. Ignore TYPE which is the token
767 type. */
769 void
770 print_token (FILE *file, unsigned int type ATTRIBUTE_UNUSED, YYSTYPE value)
772 struct prod_token_parm_item *tok;
773 unsigned int ix;
775 tok = value;
776 fprintf (file, "%d \"", LOCATION_LINE (tok->tp.tok.location));
777 for (ix = 0; ix < tok->tp.tok.length; ix++)
778 fprintf (file, "%c", tok->tp.tok.chars[ix]);
780 fprintf (file, "\"");
783 /* Output a message ERROR_MESSAGE from the parser. */
784 static void
785 yyerror (const char *error_message)
787 struct prod_token_parm_item *tok;
789 tok = yylval;
790 if (tok)
791 error ("%H%s", &tok->tp.tok.location, error_message);
792 else
793 error ("%s", error_message);
796 /* Reverse the order of a token list, linked by parse_next, old first
797 token is OLD_FIRST. */
799 static struct prod_token_parm_item*
800 reverse_prod_list (struct prod_token_parm_item *old_first)
802 struct prod_token_parm_item *current;
803 struct prod_token_parm_item *next;
804 struct prod_token_parm_item *prev = NULL;
806 current = old_first;
807 prev = NULL;
809 while (current)
811 gcc_assert (current->category == production_category);
813 next = current->tp.pro.next;
814 current->tp.pro.next = prev;
815 prev = current;
816 current = next;
818 return prev;
821 /* Ensure TYPE is not VOID. Use NAME as the token for the error location. */
823 static void
824 ensure_not_void (unsigned int type, struct prod_token_parm_item* name)
826 if (type == VOID_TYPE)
827 error ("%Htype must not be void in this context",
828 &name->tp.tok.location);
831 /* Check TYPE1 and TYPE2 which are integral types. Return the lowest
832 common type (min is signed int). */
834 static int
835 get_common_type (struct prod_token_parm_item *type1,
836 struct prod_token_parm_item *type2)
838 if (NUMERIC_TYPE (type1) == UNSIGNED_INT)
839 return UNSIGNED_INT;
840 if (NUMERIC_TYPE (type2) == UNSIGNED_INT)
841 return UNSIGNED_INT;
843 return SIGNED_INT;
846 /* Check type (TYPE_NUM) and expression (EXP) match. Return the 1 if
847 OK else 0. Must be exact match - same name unless it is an
848 integral type. */
850 static int
851 check_type_match (int type_num, struct prod_token_parm_item *exp)
853 switch (type_num)
855 case SIGNED_INT:
856 case UNSIGNED_INT:
857 case SIGNED_CHAR:
858 case UNSIGNED_CHAR:
859 switch (NUMERIC_TYPE (exp))
861 case SIGNED_INT:
862 case UNSIGNED_INT:
863 case SIGNED_CHAR:
864 case UNSIGNED_CHAR:
865 return 1;
867 case VOID_TYPE:
868 default:
869 gcc_unreachable ();
871 break;
873 case VOID_TYPE:
874 default:
875 gcc_unreachable ();
880 /* Make a production for an integer constant VALUE. */
882 static struct prod_token_parm_item *
883 make_integer_constant (struct prod_token_parm_item* value)
885 struct prod_token_parm_item *tok;
886 struct prod_token_parm_item *prod;
887 tok = value;
888 prod = make_production (PROD_INTEGER_CONSTANT, tok);
889 if ((tok->tp.tok.chars[0] == (unsigned char)'-')
890 || (tok->tp.tok.chars[0] == (unsigned char)'+'))
891 NUMERIC_TYPE (prod) = SIGNED_INT;
892 else
893 NUMERIC_TYPE (prod) = UNSIGNED_INT;
894 prod->tp.pro.code = tree_code_get_integer_value (tok->tp.tok.chars,
895 tok->tp.tok.length);
896 return prod;
900 /* Build a PROD_PLUS_EXPRESSION. This is uses for PLUS, MINUS, ASSIGN
901 and EQUALS expressions. */
903 static struct prod_token_parm_item *
904 make_plus_expression (struct prod_token_parm_item *tok,
905 struct prod_token_parm_item *op1,
906 struct prod_token_parm_item *op2,
907 int type_code, int prod_code)
909 struct prod_token_parm_item *prod;
910 tree type;
912 ensure_not_void (NUMERIC_TYPE (op1), op1->tp.pro.main_token);
913 ensure_not_void (NUMERIC_TYPE (op2), op2->tp.pro.main_token);
915 prod = make_production (PROD_PLUS_EXPRESSION, tok);
917 NUMERIC_TYPE (prod) = type_code;
918 type = tree_code_get_type (type_code);
920 gcc_assert (type);
922 OP1 (prod) = op1;
923 OP2 (prod) = op2;
925 prod->tp.pro.code = tree_code_get_expression (prod_code, type,
926 op1->tp.pro.code,
927 op2->tp.pro.code, NULL,
928 tok->tp.tok.location);
930 return prod;
934 /* Set STORAGE_CLASS in PROD according to CLASS_TOKEN. */
936 static void
937 set_storage (struct prod_token_parm_item *prod)
939 struct prod_token_parm_item *stg_class;
940 stg_class = STORAGE_CLASS_TOKEN (prod);
941 switch (stg_class->type)
943 case STATIC:
944 STORAGE_CLASS (prod) = STATIC_STORAGE;
945 break;
947 case AUTOMATIC:
948 STORAGE_CLASS (prod) = AUTOMATIC_STORAGE;
949 break;
951 case EXTERNAL_DEFINITION:
952 STORAGE_CLASS (prod) = EXTERNAL_DEFINITION_STORAGE;
953 break;
955 case EXTERNAL_REFERENCE:
956 STORAGE_CLASS (prod) = EXTERNAL_REFERENCE_STORAGE;
957 break;
959 default:
960 gcc_unreachable ();
964 /* Set parse trace. */
966 void
967 treelang_debug (void)
969 if (option_parser_trace)
970 yydebug = 1;
973 #ifdef __XGETTEXT__
974 /* Depending on the version of Bison used to compile this grammar,
975 it may issue generic diagnostics spelled "syntax error" or
976 "parse error". To prevent this from changing the translation
977 template randomly, we list all the variants of this particular
978 diagnostic here. Translators: there is no fine distinction
979 between diagnostics with "syntax error" in them, and diagnostics
980 with "parse error" in them. It's okay to give them both the same
981 translation. */
982 const char d1[] = N_("syntax error");
983 const char d2[] = N_("parse error");
984 const char d3[] = N_("syntax error; also virtual memory exhausted");
985 const char d4[] = N_("parse error; also virtual memory exhausted");
986 const char d5[] = N_("syntax error: cannot back up");
987 const char d6[] = N_("parse error: cannot back up");
988 #endif