^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) }