Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * C global declaration parser for genksyms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright 1996, 1997 Linux International.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * New implementation contributed by Richard Henderson <rth@tamu.edu>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * Based on original work by Bjorn Ekwall <bj0rn@blox.se>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * This file is part of the Linux modutils.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) %{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <assert.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include "genksyms.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) static int is_typedef;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) static int is_extern;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) static char *current_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) static struct string_list *decl_spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) static void yyerror(const char *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) remove_node(struct string_list **p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)   struct string_list *node = *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)   *p = node->next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)   free_node(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) remove_list(struct string_list **pb, struct string_list **pe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)   struct string_list *b = *pb, *e = *pe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)   *pb = e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)   free_list(b, e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) /* Record definition of a struct/union/enum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) static void record_compound(struct string_list **keyw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 		       struct string_list **ident,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 		       struct string_list **body,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 		       enum symbol_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	struct string_list *b = *body, *i = *ident, *r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	if (i->in_source_file) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		remove_node(keyw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		(*ident)->tag = type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		remove_list(body, ident);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	r = copy_node(i); r->tag = type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	r->next = (*keyw)->next; *body = r; (*keyw)->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	add_symbol(i->string, type, b, is_extern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) %}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) %token ASM_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) %token ATTRIBUTE_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) %token AUTO_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) %token BOOL_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) %token BUILTIN_INT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) %token CHAR_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) %token CONST_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) %token DOUBLE_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) %token ENUM_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) %token EXTERN_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) %token EXTENSION_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) %token FLOAT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) %token INLINE_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) %token INT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) %token LONG_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) %token REGISTER_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) %token RESTRICT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) %token SHORT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) %token SIGNED_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) %token STATIC_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) %token STRUCT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) %token TYPEDEF_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) %token UNION_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) %token UNSIGNED_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) %token VOID_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) %token VOLATILE_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) %token TYPEOF_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) %token VA_LIST_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) %token EXPORT_SYMBOL_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) %token ASM_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) %token ATTRIBUTE_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) %token TYPEOF_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) %token BRACE_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) %token BRACKET_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) %token EXPRESSION_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) %token CHAR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) %token DOTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) %token IDENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) %token INT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) %token REAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) %token STRING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) %token TYPE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) %token OTHER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) %token FILENAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) %%
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) declaration_seq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	declaration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	| declaration_seq declaration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) declaration:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	{ is_typedef = 0; is_extern = 0; current_name = NULL; decl_spec = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	declaration1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	{ free_list(*$2, NULL); *$2 = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) declaration1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	EXTENSION_KEYW TYPEDEF_KEYW { is_typedef = 1; } simple_declaration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 		{ $$ = $4; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	| TYPEDEF_KEYW { is_typedef = 1; } simple_declaration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	| simple_declaration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	| function_definition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	| asm_definition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	| export_definition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	| error ';'				{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	| error '}'				{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) simple_declaration:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	decl_specifier_seq_opt init_declarator_list_opt ';'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		{ if (current_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 		    struct string_list *decl = (*$3)->next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 		    (*$3)->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		    add_symbol(current_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 			       is_typedef ? SYM_TYPEDEF : SYM_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 			       decl, is_extern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		    current_name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		  }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		  $$ = $3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) init_declarator_list_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	/* empty */				{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	| init_declarator_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) init_declarator_list:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	init_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 		{ struct string_list *decl = *$1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		  *$1 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		  add_symbol(current_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 			     is_typedef ? SYM_TYPEDEF : SYM_NORMAL, decl, is_extern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 		  current_name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 		  $$ = $1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	| init_declarator_list ',' init_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 		{ struct string_list *decl = *$3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 		  *$3 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 		  free_list(*$2, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 		  *$2 = decl_spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 		  add_symbol(current_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 			     is_typedef ? SYM_TYPEDEF : SYM_NORMAL, decl, is_extern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		  current_name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 		  $$ = $3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) init_declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	declarator asm_phrase_opt attribute_opt initializer_opt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		{ $$ = $4 ? $4 : $3 ? $3 : $2 ? $2 : $1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /* Hang on to the specifiers so that we can reuse them.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) decl_specifier_seq_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	/* empty */				{ decl_spec = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	| decl_specifier_seq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) decl_specifier_seq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	decl_specifier				{ decl_spec = *$1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	| decl_specifier_seq decl_specifier	{ decl_spec = *$2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) decl_specifier:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	storage_class_specifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 		{ /* Version 2 checksumming ignores storage class, as that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		     is really irrelevant to the linkage.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 		  remove_node($1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		  $$ = $1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	| type_specifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) storage_class_specifier:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	AUTO_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	| REGISTER_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	| STATIC_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	| EXTERN_KEYW	{ is_extern = 1; $$ = $1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	| INLINE_KEYW	{ is_extern = 0; $$ = $1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) type_specifier:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	simple_type_specifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	| cvar_qualifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	| TYPEOF_KEYW '(' parameter_declaration ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	| TYPEOF_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	/* References to s/u/e's defined elsewhere.  Rearrange things
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	   so that it is easier to expand the definition fully later.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	| STRUCT_KEYW IDENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		{ remove_node($1); (*$2)->tag = SYM_STRUCT; $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	| UNION_KEYW IDENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		{ remove_node($1); (*$2)->tag = SYM_UNION; $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	| ENUM_KEYW IDENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		{ remove_node($1); (*$2)->tag = SYM_ENUM; $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	/* Full definitions of an s/u/e.  Record it.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	| STRUCT_KEYW IDENT class_body
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 		{ record_compound($1, $2, $3, SYM_STRUCT); $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	| UNION_KEYW IDENT class_body
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		{ record_compound($1, $2, $3, SYM_UNION); $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	| ENUM_KEYW IDENT enum_body
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 		{ record_compound($1, $2, $3, SYM_ENUM); $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	 * Anonymous enum definition. Tell add_symbol() to restart its counter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	| ENUM_KEYW enum_body
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 		{ add_symbol(NULL, SYM_ENUM, NULL, 0); $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	/* Anonymous s/u definitions.  Nothing needs doing.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	| STRUCT_KEYW class_body			{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	| UNION_KEYW class_body				{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) simple_type_specifier:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	CHAR_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	| SHORT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	| INT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	| LONG_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	| SIGNED_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	| UNSIGNED_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	| FLOAT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	| DOUBLE_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	| VOID_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	| BOOL_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	| VA_LIST_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	| BUILTIN_INT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	| TYPE			{ (*$1)->tag = SYM_TYPEDEF; $$ = $1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ptr_operator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	'*' cvar_qualifier_seq_opt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		{ $$ = $2 ? $2 : $1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) cvar_qualifier_seq_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	/* empty */					{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	| cvar_qualifier_seq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) cvar_qualifier_seq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	cvar_qualifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	| cvar_qualifier_seq cvar_qualifier		{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) cvar_qualifier:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	CONST_KEYW | VOLATILE_KEYW | ATTRIBUTE_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	| RESTRICT_KEYW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 		{ /* restrict has no effect in prototypes so ignore it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 		  remove_node($1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 		  $$ = $1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	ptr_operator declarator			{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	| direct_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) direct_declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	IDENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 		{ if (current_name != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 		    error_with_pos("unexpected second declaration name");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 		    YYERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 		  } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 		    current_name = (*$1)->string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 		    $$ = $1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 		  }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	| TYPE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 		{ if (current_name != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 		    error_with_pos("unexpected second declaration name");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 		    YYERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 		  } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 		    current_name = (*$1)->string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 		    $$ = $1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 		  }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	| direct_declarator '(' parameter_declaration_clause ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 		{ $$ = $4; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	| direct_declarator '(' error ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 		{ $$ = $4; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	| direct_declarator BRACKET_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 		{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	| '(' declarator ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) /* Nested declarators differ from regular declarators in that they do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)    not record the symbols they find in the global symbol table.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) nested_declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	ptr_operator nested_declarator		{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	| direct_nested_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) direct_nested_declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	IDENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	| TYPE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	| direct_nested_declarator '(' parameter_declaration_clause ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 		{ $$ = $4; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	| direct_nested_declarator '(' error ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 		{ $$ = $4; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	| direct_nested_declarator BRACKET_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 		{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	| '(' nested_declarator ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	| '(' error ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) parameter_declaration_clause:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	parameter_declaration_list_opt DOTS		{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	| parameter_declaration_list_opt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	| parameter_declaration_list ',' DOTS		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) parameter_declaration_list_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	/* empty */					{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	| parameter_declaration_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) parameter_declaration_list:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	parameter_declaration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	| parameter_declaration_list ',' parameter_declaration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) parameter_declaration:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	decl_specifier_seq m_abstract_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 		{ $$ = $2 ? $2 : $1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) m_abstract_declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	ptr_operator m_abstract_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 		{ $$ = $2 ? $2 : $1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	| direct_m_abstract_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) direct_m_abstract_declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	/* empty */					{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	| IDENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 		{ /* For version 2 checksums, we don't want to remember
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 		     private parameter names.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 		  remove_node($1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 		  $$ = $1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 	/* This wasn't really a typedef name but an identifier that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	   shadows one.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	| TYPE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 		{ remove_node($1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 		  $$ = $1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	| direct_m_abstract_declarator '(' parameter_declaration_clause ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 		{ $$ = $4; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 	| direct_m_abstract_declarator '(' error ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 		{ $$ = $4; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	| direct_m_abstract_declarator BRACKET_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 		{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	| '(' m_abstract_declarator ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	| '(' error ')'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) function_definition:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	decl_specifier_seq_opt declarator BRACE_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 		{ struct string_list *decl = *$2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 		  *$2 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 		  add_symbol(current_name, SYM_NORMAL, decl, is_extern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 		  $$ = $3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) initializer_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 	/* empty */					{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 	| initializer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) /* We never care about the contents of an initializer.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) initializer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	'=' EXPRESSION_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 		{ remove_list($2, &(*$1)->next); $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) class_body:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	'{' member_specification_opt '}'		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 	| '{' error '}'					{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) member_specification_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 	/* empty */					{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	| member_specification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) member_specification:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	member_declaration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 	| member_specification member_declaration	{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) member_declaration:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	decl_specifier_seq_opt member_declarator_list_opt ';'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 		{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	| error ';'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 		{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) member_declarator_list_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	/* empty */					{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 	| member_declarator_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) member_declarator_list:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 	member_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	| member_declarator_list ',' member_declarator	{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) member_declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	nested_declarator attribute_opt			{ $$ = $2 ? $2 : $1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	| IDENT member_bitfield_declarator		{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 	| member_bitfield_declarator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) member_bitfield_declarator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	':' EXPRESSION_PHRASE				{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) attribute_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	/* empty */					{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	| attribute_opt ATTRIBUTE_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) enum_body:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	'{' enumerator_list '}'				{ $$ = $3; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	| '{' enumerator_list ',' '}'			{ $$ = $4; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) enumerator_list:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	enumerator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	| enumerator_list ',' enumerator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) enumerator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 	IDENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 			const char *name = strdup((*$1)->string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 			add_symbol(name, SYM_ENUM_CONST, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	| IDENT '=' EXPRESSION_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 			const char *name = strdup((*$1)->string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 			struct string_list *expr = copy_list_range(*$3, *$2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 			add_symbol(name, SYM_ENUM_CONST, expr, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) asm_definition:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 	ASM_PHRASE ';'					{ $$ = $2; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) asm_phrase_opt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 	/* empty */					{ $$ = NULL; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	| ASM_PHRASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) export_definition:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 	EXPORT_SYMBOL_KEYW '(' IDENT ')' ';'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 		{ export_symbol((*$3)->string); $$ = $5; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) %%
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) yyerror(const char *e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)   error_with_pos("%s", e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) }