1 %
{ /* -*- c -*- emacs mode c */
4 TREELANG Compiler parser.
6 ---------------------------------------------------------------------
8 Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
10 This program is free software; you can redistribute it and/or modify it
11 under the terms of the GNU General Public License as published by the
12 Free Software Foundation; either version 2, or (at your option) any
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA.
25 In other words, you are welcome to use, share and improve this program.
26 You are forbidden to forbid anyone else to use, share and improve
27 what you give them. Help stamp out software-hoarding!
29 ---------------------------------------------------------------------
31 Written by Tim Josling 1999-2001, based in part on other parts of
41 There are no conflicts in this grammar. Please keep it that way.
47 #include "coretypes.h"
49 #include "diagnostic.h"
55 #define YYPRINT(file, type, value) print_token (file, type, value)
56 #define YYERROR_VERBOSE YES
59 extern
int option_parser_trace
;
61 /* Local prototypes. */
63 static void yyerror (const char *error_message
);
66 void print_token
(FILE * file
, unsigned int type ATTRIBUTE_UNUSED
, YYSTYPE value
);
67 static struct prod_token_parm_item
*reverse_prod_list
(struct prod_token_parm_item
*old_first
);
68 static void ensure_not_void
(unsigned int type
, struct prod_token_parm_item
* name
);
69 static int check_type_match
(int type_num
, struct prod_token_parm_item
*exp
);
70 static int get_common_type
(struct prod_token_parm_item
*type1
, struct prod_token_parm_item
*type2
);
71 static struct prod_token_parm_item
*make_integer_constant
(struct prod_token_parm_item
* value
);
72 static void set_storage
(struct prod_token_parm_item
*prod
);
74 /* File global variables. */
76 static struct prod_token_parm_item
*current_function
=NULL
;
80 /* Not %raw - seems to have bugs. */
86 %token RIGHT_SQUARE_BRACKET
87 %token LEFT_SQUARE_BRACKET
88 %token RIGHT_PARENTHESIS
89 %token LEFT_PARENTHESIS
113 %token EXTERNAL_DEFINITION
114 %token EXTERNAL_REFERENCE
116 /* Tokens not passed to parser. */
120 /* Pseudo tokens - productions. */
121 %token PROD_VARIABLE_NAME
122 %token PROD_TYPE_NAME
123 %token PROD_FUNCTION_NAME
124 %token PROD_INTEGER_CONSTANT
125 %token PROD_PLUS_EXPRESSION
126 %token PROD_MINUS_EXPRESSION
127 %token PROD_ASSIGN_EXPRESSION
128 %token PROD_VARIABLE_REFERENCE_EXPRESSION
129 %token PROD_PARAMETER
130 %token PROD_FUNCTION_INVOCATION
148 | declarations declaration
{
157 |function_prototype
{
166 storage typename NAME init_opt SEMICOLON
{
167 struct prod_token_parm_item
* tok
;
168 struct prod_token_parm_item
*prod
;
170 prod
= make_production
(PROD_VARIABLE_NAME
, tok
);
171 SYMBOL_TABLE_NAME
(prod
) = tok
;
172 EXPRESSION_TYPE
(prod
) = $2;
173 VAR_INIT
(prod
) = $4;
174 NUMERIC_TYPE
(prod
) = NUMERIC_TYPE
(( (struct prod_token_parm_item
*)EXPRESSION_TYPE
(prod
)));
175 ensure_not_void
(NUMERIC_TYPE
(prod
), tok
);
176 if
(insert_tree_name
(prod
))
180 STORAGE_CLASS_TOKEN
(prod
) = $1;
185 if
(! ((struct prod_token_parm_item
*)VAR_INIT
(prod
))->tp.pro.code
)
187 if
(STORAGE_CLASS
(prod
) == EXTERNAL_REFERENCE_STORAGE
)
189 fprintf
(stderr
, "%s:%i:%i: External reference variables may not have initial value\n", in_fname
,
190 tok
->tp.tok.lineno
, tok
->tp.tok.charno
);
191 print_token
(stderr
, 0, tok
);
196 prod
->tp.pro.code
= tree_code_create_variable
197 (STORAGE_CLASS
(prod
),
198 ((struct prod_token_parm_item
*)SYMBOL_TABLE_NAME
(prod
))->tp.tok.chars
,
199 ((struct prod_token_parm_item
*)SYMBOL_TABLE_NAME
(prod
))->tp.tok.length
,
201 VAR_INIT
(prod
)?
((struct prod_token_parm_item
*)VAR_INIT
(prod
))->tp.pro.code
:NULL
,
204 if
(!prod
->tp.pro.code
)
218 struct prod_token_parm_item
* tok
;
219 struct prod_token_parm_item
*prod
;
220 struct prod_token_parm_item
*prod2
;
222 prod
= make_production
(PROD_VARIABLE_NAME
, tok
);
223 SYMBOL_TABLE_NAME
(prod
) = $2;
224 EXPRESSION_TYPE
(prod
) = $1;
225 NUMERIC_TYPE
(prod
) = NUMERIC_TYPE
(( (struct prod_token_parm_item
*)EXPRESSION_TYPE
(prod
)));
226 ensure_not_void
(NUMERIC_TYPE
(prod
), tok
);
227 if
(insert_tree_name
(prod
))
231 prod2
= make_production
(PROD_PARAMETER
, tok
);
232 VARIABLE
(prod2
) = prod
;
238 storage typename NAME LEFT_PARENTHESIS parameters RIGHT_PARENTHESIS SEMICOLON
{
239 struct prod_token_parm_item
* tok
;
240 struct prod_token_parm_item
*prod
;
241 struct prod_token_parm_item
*type
;
242 struct prod_token_parm_item
* first_parms
;
243 struct prod_token_parm_item
* last_parms
;
244 struct prod_token_parm_item
* this_parms
;
245 struct prod_token_parm_item
*this_parm
;
246 struct prod_token_parm_item
*this_parm_var
;
248 prod
= make_production
(PROD_FUNCTION_NAME
, $3);
249 SYMBOL_TABLE_NAME
(prod
) = $3;
250 EXPRESSION_TYPE
(prod
) = $2;
251 NUMERIC_TYPE
(prod
) = NUMERIC_TYPE
(( (struct prod_token_parm_item
*)EXPRESSION_TYPE
(prod
)));
252 PARAMETERS
(prod
) = reverse_prod_list
($5);
253 insert_tree_name
(prod
);
254 STORAGE_CLASS_TOKEN
(prod
) = $1;
256 switch
(STORAGE_CLASS
(prod
))
259 case EXTERNAL_DEFINITION_STORAGE
:
262 case AUTOMATIC_STORAGE
:
263 fprintf
(stderr
, "%s:%i:%i: A function cannot be automatic\n", in_fname
,
264 tok
->tp.tok.lineno
, tok
->tp.tok.charno
);
265 print_token
(stderr
, 0, tok
);
273 type
= EXPRESSION_TYPE
(prod
);
274 /* Create a parameter list in a non-front end specific format. */
275 for
(first_parms
= NULL
, last_parms
= NULL
, this_parm
= PARAMETERS
(prod
);
277 this_parm
= this_parm
->tp.pro.next
)
279 if
(this_parm
->category
!= production_category
)
281 this_parm_var
= VARIABLE
(this_parm
);
284 if
(this_parm_var
->category
!= production_category
)
286 this_parms
= my_malloc
(sizeof
(struct prod_token_parm_item
));
287 if
(!this_parm_var
->tp.pro.main_token
)
289 this_parms
->tp.par.variable_name
= this_parm_var
->tp.pro.main_token
->tp.tok.chars
;
290 this_parms
->type
= NUMERIC_TYPE
(( (struct prod_token_parm_item
*)EXPRESSION_TYPE
(this_parm_var
)));
293 last_parms
->tp.par.next
= this_parms
;
294 last_parms
= this_parms
;
298 first_parms
= this_parms
;
299 last_parms
= this_parms
;
301 this_parms
->tp.par.where_to_put_var_tree
=
302 & (( (struct prod_token_parm_item
*)VARIABLE
(this_parm
))->tp.pro.code
);
304 FIRST_PARMS
(prod
) = first_parms
;
306 prod
->tp.pro.code
= tree_code_create_function_prototype
307 (tok
->tp.tok.chars
, STORAGE_CLASS
(prod
), NUMERIC_TYPE
(type
),
308 first_parms
, in_fname
, tok
->tp.tok.lineno
);
315 struct prod_token_parm_item
*proto
;
316 struct prod_token_parm_item search_prod
;
317 struct prod_token_parm_item
* tok
;
318 struct prod_token_parm_item
*this_parm
;
320 SYMBOL_TABLE_NAME
((&search_prod
)) = tok
;
321 current_function
= proto
= lookup_tree_name
(&search_prod
);
324 fprintf
(stderr
, "%s:%i:%i: Function prototype not found\n", in_fname
,
325 tok
->tp.tok.lineno
, tok
->tp.tok.charno
);
326 print_token
(stderr
, 0, tok
);
330 if
(!proto
->tp.pro.code
)
332 tree_code_create_function_initial
333 (proto
->tp.pro.code
, in_fname
, tok
->tp.tok.lineno
,
334 FIRST_PARMS
(current_function
));
336 /* Check all the parameters have code. */
337 for
(this_parm
= PARAMETERS
(proto
);
339 this_parm
= this_parm
->tp.pro.next
)
341 if
(! (struct prod_token_parm_item
*)VARIABLE
(this_parm
))
343 if
(! (( (struct prod_token_parm_item
*)VARIABLE
(this_parm
))->tp.pro.code
))
347 variable_defs_opt statements_opt RIGHT_BRACE
{
348 struct prod_token_parm_item
* tok
;
350 tree_code_create_function_wrapup
(in_fname
, tok
->tp.tok.lineno
);
351 current_function
= NULL
;
377 |variable_defs variable_def
{
384 struct prod_token_parm_item
* tok
;
385 struct prod_token_parm_item
*prod
;
387 prod
= make_production
(PROD_TYPE_NAME
, tok
);
388 NUMERIC_TYPE
(prod
) = SIGNED_INT
;
389 prod
->tp.pro.code
= tree_code_get_type
(NUMERIC_TYPE
(prod
));
393 struct prod_token_parm_item
* tok
;
394 struct prod_token_parm_item
*prod
;
396 prod
= make_production
(PROD_TYPE_NAME
, tok
);
397 NUMERIC_TYPE
(prod
) = UNSIGNED_INT
;
398 prod
->tp.pro.code
= tree_code_get_type
(NUMERIC_TYPE
(prod
));
402 struct prod_token_parm_item
* tok
;
403 struct prod_token_parm_item
*prod
;
405 prod
= make_production
(PROD_TYPE_NAME
, tok
);
406 NUMERIC_TYPE
(prod
) = SIGNED_CHAR
;
407 prod
->tp.pro.code
= tree_code_get_type
(NUMERIC_TYPE
(prod
));
411 struct prod_token_parm_item
* tok
;
412 struct prod_token_parm_item
*prod
;
414 prod
= make_production
(PROD_TYPE_NAME
, tok
);
415 NUMERIC_TYPE
(prod
) = UNSIGNED_CHAR
;
416 prod
->tp.pro.code
= tree_code_get_type
(NUMERIC_TYPE
(prod
));
420 struct prod_token_parm_item
* tok
;
421 struct prod_token_parm_item
*prod
;
423 prod
= make_production
(PROD_TYPE_NAME
, tok
);
424 NUMERIC_TYPE
(prod
) = VOID_TYPE
;
425 prod
->tp.pro.code
= tree_code_get_type
(NUMERIC_TYPE
(prod
));
435 |parameters COMMA parameter
{
436 struct prod_token_parm_item
*prod1
;
438 prod1
->tp.pro.next
= $1; /* Insert in reverse order. */
447 |statements statement
{
453 expression SEMICOLON
{
454 struct prod_token_parm_item
*exp
;
456 tree_code_output_expression_statement
(exp
->tp.pro.code
, in_fname
, exp
->tp.pro.main_token
->tp.tok.lineno
);
467 IF LEFT_PARENTHESIS expression RIGHT_PARENTHESIS
{
468 struct prod_token_parm_item
* tok
;
469 struct prod_token_parm_item
*exp
;
472 ensure_not_void
(NUMERIC_TYPE
(exp
), exp
->tp.pro.main_token
);
473 tree_code_if_start
(exp
->tp.pro.code
, in_fname
, tok
->tp.tok.lineno
);
475 LEFT_BRACE statements_opt RIGHT_BRACE
{
476 /* Just let the statements flow. */
479 struct prod_token_parm_item
* tok
;
481 tree_code_if_else
(in_fname
, tok
->tp.tok.lineno
);
483 LEFT_BRACE statements_opt RIGHT_BRACE
{
484 struct prod_token_parm_item
* tok
;
486 tree_code_if_end
(in_fname
, tok
->tp.tok.lineno
);
492 RETURN expression_opt
{
493 struct prod_token_parm_item
*type_prod
;
494 struct prod_token_parm_item
* ret_tok
;
496 type_prod
= EXPRESSION_TYPE
(current_function
);
497 if
(NUMERIC_TYPE
(type_prod
) == VOID
)
499 tree_code_generate_return
(type_prod
->tp.pro.code
, NULL
);
502 fprintf
(stderr
, "%s:%i:%i: Redundant expression in return\n", in_fname
,
503 ret_tok
->tp.tok.lineno
, ret_tok
->tp.tok.charno
);
504 print_token
(stderr
, 0, ret_tok
);
506 tree_code_generate_return
(type_prod
->tp.pro.code
, NULL
);
511 fprintf
(stderr
, "%s:%i:%i: Expression missing in return\n", in_fname
,
512 ret_tok
->tp.tok.lineno
, ret_tok
->tp.tok.charno
);
513 print_token
(stderr
, 0, ret_tok
);
518 struct prod_token_parm_item
*exp
;
520 /* Check same type. */
521 if
(check_type_match
(NUMERIC_TYPE
(type_prod
), $2))
523 if
(!type_prod
->tp.pro.code
)
525 if
(!exp
->tp.pro.code
)
527 /* Generate the code. */
528 tree_code_generate_return
(type_prod
->tp.pro.code
, exp
->tp.pro.code
);
539 struct prod_token_parm_item
*exp
;
541 if
(!exp
->tp.pro.code
)
550 $$
= make_integer_constant
($1);
555 |expression PLUS expression
{
556 struct prod_token_parm_item
* tok
;
557 struct prod_token_parm_item
*prod
;
558 struct prod_token_parm_item
*op1
;
559 struct prod_token_parm_item
*op2
;
565 ensure_not_void
(NUMERIC_TYPE
(op1
), op1
->tp.pro.main_token
);
566 ensure_not_void
(NUMERIC_TYPE
(op2
), op2
->tp.pro.main_token
);
567 prod
= make_production
(PROD_PLUS_EXPRESSION
, tok
);
568 NUMERIC_TYPE
(prod
) = get_common_type
(op1
, op2
);
569 if
(!NUMERIC_TYPE
(prod
))
573 type
= get_type_for_numeric_type
(NUMERIC_TYPE
(prod
));
579 prod
->tp.pro.code
= tree_code_get_expression
580 (EXP_PLUS
, type
, op1
->tp.pro.code
, op2
->tp.pro.code
, NULL
);
584 |expression MINUS expression %prec PLUS
{
585 struct prod_token_parm_item
* tok
;
586 struct prod_token_parm_item
*prod
;
587 struct prod_token_parm_item
*op1
;
588 struct prod_token_parm_item
*op2
;
593 ensure_not_void
(NUMERIC_TYPE
(op1
), op1
->tp.pro.main_token
);
594 ensure_not_void
(NUMERIC_TYPE
(op2
), op2
->tp.pro.main_token
);
596 prod
= make_production
(PROD_PLUS_EXPRESSION
, tok
);
597 NUMERIC_TYPE
(prod
) = get_common_type
(op1
, op2
);
598 if
(!NUMERIC_TYPE
(prod
))
602 type
= get_type_for_numeric_type
(NUMERIC_TYPE
(prod
));
608 prod
->tp.pro.code
= tree_code_get_expression
(EXP_MINUS
,
609 type
, op1
->tp.pro.code
, op2
->tp.pro.code
, NULL
);
613 |expression EQUALS expression
{
614 struct prod_token_parm_item
* tok
;
615 struct prod_token_parm_item
*prod
;
616 struct prod_token_parm_item
*op1
;
617 struct prod_token_parm_item
*op2
;
622 ensure_not_void
(NUMERIC_TYPE
(op1
), op1
->tp.pro.main_token
);
623 ensure_not_void
(NUMERIC_TYPE
(op2
), op2
->tp.pro.main_token
);
625 prod
= make_production
(PROD_PLUS_EXPRESSION
, tok
);
626 NUMERIC_TYPE
(prod
) = SIGNED_INT
;
627 if
(!NUMERIC_TYPE
(prod
))
631 type
= get_type_for_numeric_type
(NUMERIC_TYPE
(prod
));
637 prod
->tp.pro.code
= tree_code_get_expression
(EXP_EQUALS
,
638 type
, op1
->tp.pro.code
, op2
->tp.pro.code
, NULL
);
642 |variable_ref ASSIGN expression
{
643 struct prod_token_parm_item
* tok
;
644 struct prod_token_parm_item
*prod
;
645 struct prod_token_parm_item
*op1
;
646 struct prod_token_parm_item
*op2
;
652 ensure_not_void
(NUMERIC_TYPE
(op2
), op2
->tp.pro.main_token
);
653 prod
= make_production
(PROD_ASSIGN_EXPRESSION
, tok
);
654 NUMERIC_TYPE
(prod
) = NUMERIC_TYPE
(op1
);
655 if
(!NUMERIC_TYPE
(prod
))
659 type
= get_type_for_numeric_type
(NUMERIC_TYPE
(prod
));
664 prod
->tp.pro.code
= tree_code_get_expression
(EXP_ASSIGN
,
665 type
, op1
->tp.pro.code
, op2
->tp.pro.code
, NULL
);
669 |function_invocation
{
675 NAME LEFT_PARENTHESIS expressions_with_commas RIGHT_PARENTHESIS
{
676 struct prod_token_parm_item
*prod
;
677 struct prod_token_parm_item
* tok
;
678 struct prod_token_parm_item search_prod
;
679 struct prod_token_parm_item
*proto
;
680 struct prod_token_parm_item
*exp
;
681 struct prod_token_parm_item
*exp_proto
;
682 struct prod_token_parm_item
*var
;
689 prod
= make_production
(PROD_FUNCTION_INVOCATION
, tok
);
690 SYMBOL_TABLE_NAME
(prod
) = tok
;
691 PARAMETERS
(prod
) = reverse_prod_list
($3);
692 SYMBOL_TABLE_NAME
((&search_prod
)) = tok
;
693 proto
= lookup_tree_name
(&search_prod
);
696 fprintf
(stderr
, "%s:%i:%i: Function prototype not found\n", in_fname
,
697 tok
->tp.tok.lineno
, tok
->tp.tok.charno
);
698 print_token
(stderr
, 0, tok
);
702 EXPRESSION_TYPE
(prod
) = EXPRESSION_TYPE
(proto
);
703 NUMERIC_TYPE
(prod
) = NUMERIC_TYPE
(proto
);
704 /* Count the expressions and ensure they match the prototype. */
705 for
(exp_proto_count
= 0, exp_proto
= PARAMETERS
(proto
);
706 exp_proto
; exp_proto
= exp_proto
->tp.pro.next
)
709 for
(exp_count
= 0, exp
= PARAMETERS
(prod
); exp
; exp
= exp
->tp.pro.next
)
712 if
(exp_count
!= exp_proto_count
)
714 fprintf
(stderr
, "%s:%i:%i: expression count mismatch with prototype\n", in_fname
,
715 tok
->tp.tok.lineno
, tok
->tp.tok.charno
);
716 print_token
(stderr
, 0, tok
);
720 parms
= tree_code_init_parameters
();
721 for
(exp_proto
= PARAMETERS
(proto
), exp
= PARAMETERS
(prod
);
723 exp
= exp
->tp.pro.next
, exp_proto
= exp_proto
->tp.pro.next
)
729 if
(!exp
->tp.pro.code
)
731 var
= VARIABLE
(exp_proto
);
734 if
(!var
->tp.pro.code
)
736 parms
= tree_code_add_parameter
(parms
, var
->tp.pro.code
, exp
->tp.pro.code
);
738 type
= get_type_for_numeric_type
(NUMERIC_TYPE
(prod
));
739 prod
->tp.pro.code
= tree_code_get_expression
740 (EXP_FUNCTION_INVOCATION
, type
, proto
->tp.pro.code
, parms
, NULL
);
745 expressions_with_commas:
747 struct prod_token_parm_item
*exp
;
749 ensure_not_void
(NUMERIC_TYPE
(exp
), exp
->tp.pro.main_token
);
752 |expressions_with_commas COMMA expression
{
753 struct prod_token_parm_item
*exp
;
755 ensure_not_void
(NUMERIC_TYPE
(exp
), exp
->tp.pro.main_token
);
756 exp
->tp.pro.next
= $1; /* Reverse order. */
763 struct prod_token_parm_item search_prod
;
764 struct prod_token_parm_item
*prod
;
765 struct prod_token_parm_item
*symbol_table_entry
;
766 struct prod_token_parm_item
* tok
;
770 SYMBOL_TABLE_NAME
((&search_prod
)) = tok
;
771 symbol_table_entry
= lookup_tree_name
(&search_prod
);
772 if
(!symbol_table_entry
)
774 fprintf
(stderr
, "%s:%i:%i: Variable referred to but not defined\n", in_fname
,
775 tok
->tp.tok.lineno
, tok
->tp.tok.charno
);
776 print_token
(stderr
, 0, tok
);
781 prod
= make_production
(PROD_VARIABLE_REFERENCE_EXPRESSION
, tok
);
782 NUMERIC_TYPE
(prod
) = NUMERIC_TYPE
(symbol_table_entry
);
783 type
= get_type_for_numeric_type
(NUMERIC_TYPE
(prod
));
784 if
(!NUMERIC_TYPE
(prod
))
788 prod
->tp.pro.code
= tree_code_get_expression
(EXP_REFERENCE
, type
,
789 symbol_table_entry
->tp.pro.code
, NULL
, NULL
);
803 ASSIGN init_element
{
809 $$
= make_integer_constant
($1);
815 /* Print a token VALUE to file FILE. Ignore TYPE which is the token
819 print_token
(FILE * file
, unsigned int type ATTRIBUTE_UNUSED
, YYSTYPE value
)
821 struct prod_token_parm_item
*tok
;
825 fprintf
(file
, "%d \"", tok
->tp.tok.lineno
);
826 for
(ix
= 0; ix
< tok
->tp.tok.length
; ix
++)
827 fprintf
(file
, "%c", tok
->tp.tok.chars
[ix
]);
828 fprintf
(file
, "\"");
831 /* Output a message ERROR_MESSAGE from the parser. */
833 yyerror (const char *error_message
)
835 struct prod_token_parm_item
*tok
;
840 fprintf
(stderr
, "%s:%i:%i: %s\n", in_fname
, tok
->tp.tok.lineno
, tok
->tp.tok.charno
, error_message
);
841 print_token
(stderr
, 0, tok
);
844 fprintf
(stderr
, "%s\n", error_message
);
850 /* Reverse the order of a token list, linked by parse_next, old first
851 token is OLD_FIRST. */
853 static struct prod_token_parm_item
*
854 reverse_prod_list
(struct prod_token_parm_item
*old_first
)
856 struct prod_token_parm_item
*current
;
857 struct prod_token_parm_item
*next
;
858 struct prod_token_parm_item
*prev
= NULL
;
865 if
(current
->category
!= production_category
)
867 next
= current
->tp.pro.next
;
868 current
->tp.pro.next
= prev
;
875 /* Ensure TYPE is not VOID. Use NAME as the token for the error location. */
878 ensure_not_void
(unsigned int type
, struct prod_token_parm_item
* name
)
882 fprintf
(stderr
, "%s:%i:%i: Type must not be void in this context\n", in_fname
,
883 name
->tp.tok.lineno
, name
->tp.tok.charno
);
884 print_token
(stderr
, 0, name
);
889 /* Check TYPE1 and TYPE2 which are integral types. Return the lowest
890 common type (min is signed int). */
893 get_common_type
(struct prod_token_parm_item
*type1
, struct prod_token_parm_item
*type2
)
895 if
(NUMERIC_TYPE
(type1
) == UNSIGNED_INT
)
897 if
(NUMERIC_TYPE
(type2
) == UNSIGNED_INT
)
903 /* Check type (TYPE_NUM) and expression (EXP) match. Return the 1 if
904 OK else 0. Must be exact match - same name unless it is an
908 check_type_match
(int type_num
, struct prod_token_parm_item
*exp
)
916 switch
(NUMERIC_TYPE
(exp
))
941 /* Make a production for an integer constant VALUE. */
943 static struct prod_token_parm_item
*
944 make_integer_constant
(struct prod_token_parm_item
* value
)
946 struct prod_token_parm_item
* tok
;
947 struct prod_token_parm_item
*prod
;
949 prod
= make_production
(PROD_INTEGER_CONSTANT
, tok
);
950 if
((tok
->tp.tok.chars
[0] == (unsigned char)'-')||
(tok
->tp.tok.chars
[0] == (unsigned char)'+'))
951 NUMERIC_TYPE
(prod
) = SIGNED_INT
;
953 NUMERIC_TYPE
(prod
) = UNSIGNED_INT
;
954 prod
->tp.pro.code
= tree_code_get_integer_value
(tok
->tp.tok.chars
, tok
->tp.tok.length
);
958 /* Set STORAGE_CLASS in PROD according to CLASS_TOKEN. */
961 set_storage
(struct prod_token_parm_item
*prod
)
963 struct prod_token_parm_item
* stg_class
;
964 stg_class
= STORAGE_CLASS_TOKEN
(prod
);
965 switch
(stg_class
->type
)
968 STORAGE_CLASS
(prod
) = STATIC_STORAGE
;
972 STORAGE_CLASS
(prod
) = AUTOMATIC_STORAGE
;
975 case EXTERNAL_DEFINITION
:
976 STORAGE_CLASS
(prod
) = EXTERNAL_DEFINITION_STORAGE
;
979 case EXTERNAL_REFERENCE
:
980 STORAGE_CLASS
(prod
) = EXTERNAL_REFERENCE_STORAGE
;
988 /* Set parse trace. */
991 treelang_debug
(void)
993 if
(option_parser_trace
)