1 /* $NetBSD: grammar.tab.c,v 1.2 2017/02/11 19:33:13 christos Exp $ */ 2 3 /* original parser id follows */ 4 /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */ 5 /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */ 6 7 #define YYBYACC 1 8 #define YYMAJOR 1 9 #define YYMINOR 9 10 #define YYCHECK "yyyymmdd" 11 12 #define YYEMPTY (-1) 13 #define yyclearin (yychar = YYEMPTY) 14 #define yyerrok (yyerrflag = 0) 15 #define YYRECOVERING() (yyerrflag != 0) 16 #define YYENOMEM (-2) 17 #define YYEOF 0 18 19 #ifndef yyparse 20 #define yyparse grammar_parse 21 #endif /* yyparse */ 22 23 #ifndef yylex 24 #define yylex grammar_lex 25 #endif /* yylex */ 26 27 #ifndef yyerror 28 #define yyerror grammar_error 29 #endif /* yyerror */ 30 31 #ifndef yychar 32 #define yychar grammar_char 33 #endif /* yychar */ 34 35 #ifndef yyval 36 #define yyval grammar_val 37 #endif /* yyval */ 38 39 #ifndef yylval 40 #define yylval grammar_lval 41 #endif /* yylval */ 42 43 #ifndef yydebug 44 #define yydebug grammar_debug 45 #endif /* yydebug */ 46 47 #ifndef yynerrs 48 #define yynerrs grammar_nerrs 49 #endif /* yynerrs */ 50 51 #ifndef yyerrflag 52 #define yyerrflag grammar_errflag 53 #endif /* yyerrflag */ 54 55 #ifndef yylhs 56 #define yylhs grammar_lhs 57 #endif /* yylhs */ 58 59 #ifndef yylen 60 #define yylen grammar_len 61 #endif /* yylen */ 62 63 #ifndef yydefred 64 #define yydefred grammar_defred 65 #endif /* yydefred */ 66 67 #ifndef yydgoto 68 #define yydgoto grammar_dgoto 69 #endif /* yydgoto */ 70 71 #ifndef yysindex 72 #define yysindex grammar_sindex 73 #endif /* yysindex */ 74 75 #ifndef yyrindex 76 #define yyrindex grammar_rindex 77 #endif /* yyrindex */ 78 79 #ifndef yygindex 80 #define yygindex grammar_gindex 81 #endif /* yygindex */ 82 83 #ifndef yytable 84 #define yytable grammar_table 85 #endif /* yytable */ 86 87 #ifndef yycheck 88 #define yycheck grammar_check 89 #endif /* yycheck */ 90 91 #ifndef yyname 92 #define yyname grammar_name 93 #endif /* yyname */ 94 95 #ifndef yyrule 96 #define yyrule grammar_rule 97 #endif /* yyrule */ 98 #define YYPREFIX "grammar_" 99 100 #define YYPURE 0 101 102 #line 9 "grammar.y" 103 #ifdef YYBISON 104 #include <stdlib.h> 105 #define YYSTYPE_IS_DECLARED 106 #define yyerror yaccError 107 #endif 108 109 #if defined(YYBISON) || !defined(YYBYACC) 110 static void yyerror(const char *s); 111 #endif 112 #line 81 "grammar.y" 113 #include <stdio.h> 114 #include <ctype.h> 115 #include <string.h> 116 117 #define OPT_LINTLIBRARY 1 118 119 #ifndef TRUE 120 #define TRUE (1) 121 #endif 122 123 #ifndef FALSE 124 #define FALSE (0) 125 #endif 126 127 /* #include "cproto.h" */ 128 #define MAX_TEXT_SIZE 1024 129 130 /* Prototype styles */ 131 #if OPT_LINTLIBRARY 132 #define PROTO_ANSI_LLIB -2 /* form ANSI lint-library source */ 133 #define PROTO_LINTLIBRARY -1 /* form lint-library source */ 134 #endif 135 #define PROTO_NONE 0 /* do not output any prototypes */ 136 #define PROTO_TRADITIONAL 1 /* comment out parameters */ 137 #define PROTO_ABSTRACT 2 /* comment out parameter names */ 138 #define PROTO_ANSI 3 /* ANSI C prototype */ 139 140 typedef int PrototypeStyle; 141 142 typedef char boolean; 143 144 extern boolean types_out; 145 extern PrototypeStyle proto_style; 146 147 #define ansiLintLibrary() (proto_style == PROTO_ANSI_LLIB) 148 #define knrLintLibrary() (proto_style == PROTO_LINTLIBRARY) 149 #define lintLibrary() (knrLintLibrary() || ansiLintLibrary()) 150 151 #if OPT_LINTLIBRARY 152 #define FUNC_UNKNOWN -1 /* unspecified */ 153 #else 154 #define FUNC_UNKNOWN 0 /* unspecified (same as FUNC_NONE) */ 155 #endif 156 #define FUNC_NONE 0 /* not a function definition */ 157 #define FUNC_TRADITIONAL 1 /* traditional style */ 158 #define FUNC_ANSI 2 /* ANSI style */ 159 #define FUNC_BOTH 3 /* both styles */ 160 161 typedef int FuncDefStyle; 162 163 /* Source file text */ 164 typedef struct text { 165 char text[MAX_TEXT_SIZE]; /* source text */ 166 long begin; /* offset in temporary file */ 167 } Text; 168 169 /* Declaration specifier flags */ 170 #define DS_NONE 0 /* default */ 171 #define DS_EXTERN 1 /* contains "extern" specifier */ 172 #define DS_STATIC 2 /* contains "static" specifier */ 173 #define DS_CHAR 4 /* contains "char" type specifier */ 174 #define DS_SHORT 8 /* contains "short" type specifier */ 175 #define DS_FLOAT 16 /* contains "float" type specifier */ 176 #define DS_INLINE 32 /* contains "inline" specifier */ 177 #define DS_JUNK 64 /* we're not interested in this declaration */ 178 179 /* This structure stores information about a declaration specifier. */ 180 typedef struct decl_spec { 181 unsigned short flags; /* flags defined above */ 182 char *text; /* source text */ 183 long begin; /* offset in temporary file */ 184 } DeclSpec; 185 186 /* This is a list of function parameters. */ 187 typedef struct _ParameterList { 188 struct parameter *first; /* pointer to first parameter in list */ 189 struct parameter *last; /* pointer to last parameter in list */ 190 long begin_comment; /* begin offset of comment */ 191 long end_comment; /* end offset of comment */ 192 char *comment; /* comment at start of parameter list */ 193 } ParameterList; 194 195 /* This structure stores information about a declarator. */ 196 typedef struct _Declarator { 197 char *name; /* name of variable or function */ 198 char *text; /* source text */ 199 long begin; /* offset in temporary file */ 200 long begin_comment; /* begin offset of comment */ 201 long end_comment; /* end offset of comment */ 202 FuncDefStyle func_def; /* style of function definition */ 203 ParameterList params; /* function parameters */ 204 boolean pointer; /* TRUE if it declares a pointer */ 205 struct _Declarator *head; /* head function declarator */ 206 struct _Declarator *func_stack; /* stack of function declarators */ 207 struct _Declarator *next; /* next declarator in list */ 208 } Declarator; 209 210 /* This structure stores information about a function parameter. */ 211 typedef struct parameter { 212 struct parameter *next; /* next parameter in list */ 213 DeclSpec decl_spec; 214 Declarator *declarator; 215 char *comment; /* comment following the parameter */ 216 } Parameter; 217 218 /* This is a list of declarators. */ 219 typedef struct declarator_list { 220 Declarator *first; /* pointer to first declarator in list */ 221 Declarator *last; /* pointer to last declarator in list */ 222 } DeclaratorList; 223 224 /* #include "symbol.h" */ 225 typedef struct symbol { 226 struct symbol *next; /* next symbol in list */ 227 char *name; /* name of symbol */ 228 char *value; /* value of symbol (for defines) */ 229 short flags; /* symbol attributes */ 230 } Symbol; 231 232 /* parser stack entry type */ 233 typedef union { 234 Text text; 235 DeclSpec decl_spec; 236 Parameter *parameter; 237 ParameterList param_list; 238 Declarator *declarator; 239 DeclaratorList decl_list; 240 } YYSTYPE; 241 242 /* The hash table length should be a prime number. */ 243 #define SYM_MAX_HASH 251 244 245 typedef struct symbol_table { 246 Symbol *bucket[SYM_MAX_HASH]; /* hash buckets */ 247 } SymbolTable; 248 249 extern SymbolTable *new_symbol_table /* Create symbol table */ 250 (void); 251 extern void free_symbol_table /* Destroy symbol table */ 252 (SymbolTable *s); 253 extern Symbol *find_symbol /* Lookup symbol name */ 254 (SymbolTable *s, const char *n); 255 extern Symbol *new_symbol /* Define new symbol */ 256 (SymbolTable *s, const char *n, const char *v, int f); 257 258 /* #include "semantic.h" */ 259 extern void new_decl_spec (DeclSpec *, const char *, long, int); 260 extern void free_decl_spec (DeclSpec *); 261 extern void join_decl_specs (DeclSpec *, DeclSpec *, DeclSpec *); 262 extern void check_untagged (DeclSpec *); 263 extern Declarator *new_declarator (const char *, const char *, long); 264 extern void free_declarator (Declarator *); 265 extern void new_decl_list (DeclaratorList *, Declarator *); 266 extern void free_decl_list (DeclaratorList *); 267 extern void add_decl_list (DeclaratorList *, DeclaratorList *, Declarator *); 268 extern Parameter *new_parameter (DeclSpec *, Declarator *); 269 extern void free_parameter (Parameter *); 270 extern void new_param_list (ParameterList *, Parameter *); 271 extern void free_param_list (ParameterList *); 272 extern void add_param_list (ParameterList *, ParameterList *, Parameter *); 273 extern void new_ident_list (ParameterList *); 274 extern void add_ident_list (ParameterList *, ParameterList *, const char *); 275 extern void set_param_types (ParameterList *, DeclSpec *, DeclaratorList *); 276 extern void gen_declarations (DeclSpec *, DeclaratorList *); 277 extern void gen_prototype (DeclSpec *, Declarator *); 278 extern void gen_func_declarator (Declarator *); 279 extern void gen_func_definition (DeclSpec *, Declarator *); 280 281 extern void init_parser (void); 282 extern void process_file (FILE *infile, char *name); 283 extern char *cur_text (void); 284 extern char *cur_file_name (void); 285 extern char *implied_typedef (void); 286 extern void include_file (char *name, int convert); 287 extern char *supply_parm (int count); 288 extern char *xstrdup (const char *); 289 extern int already_declared (char *name); 290 extern int is_actual_func (Declarator *d); 291 extern int lint_ellipsis (Parameter *p); 292 extern int want_typedef (void); 293 extern void begin_tracking (void); 294 extern void begin_typedef (void); 295 extern void copy_typedef (char *s); 296 extern void ellipsis_varargs (Declarator *d); 297 extern void end_typedef (void); 298 extern void flush_varargs (void); 299 extern void fmt_library (int code); 300 extern void imply_typedef (const char *s); 301 extern void indent (FILE *outf); 302 extern void put_blankline (FILE *outf); 303 extern void put_body (FILE *outf, DeclSpec *decl_spec, Declarator *declarator); 304 extern void put_char (FILE *outf, int c); 305 extern void put_error (void); 306 extern void put_newline (FILE *outf); 307 extern void put_padded (FILE *outf, const char *s); 308 extern void put_string (FILE *outf, const char *s); 309 extern void track_in (void); 310 311 extern boolean file_comments; 312 extern FuncDefStyle func_style; 313 extern char base_file[]; 314 315 extern int yylex (void); 316 317 /* declaration specifier attributes for the typedef statement currently being 318 * scanned 319 */ 320 static int cur_decl_spec_flags; 321 322 /* pointer to parameter list for the current function definition */ 323 static ParameterList *func_params; 324 325 /* A parser semantic action sets this pointer to the current declarator in 326 * a function parameter declaration in order to catch any comments following 327 * the parameter declaration on the same line. If the lexer scans a comment 328 * and <cur_declarator> is not NULL, then the comment is attached to the 329 * declarator. To ignore subsequent comments, the lexer sets this to NULL 330 * after scanning a comment or end of line. 331 */ 332 static Declarator *cur_declarator; 333 334 /* temporary string buffer */ 335 static char buf[MAX_TEXT_SIZE]; 336 337 /* table of typedef names */ 338 static SymbolTable *typedef_names; 339 340 /* table of define names */ 341 static SymbolTable *define_names; 342 343 /* table of type qualifiers */ 344 static SymbolTable *type_qualifiers; 345 346 /* information about the current input file */ 347 typedef struct { 348 char *base_name; /* base input file name */ 349 char *file_name; /* current file name */ 350 FILE *file; /* input file */ 351 unsigned line_num; /* current line number in input file */ 352 FILE *tmp_file; /* temporary file */ 353 long begin_comment; /* tmp file offset after last written ) or ; */ 354 long end_comment; /* tmp file offset after last comment */ 355 boolean convert; /* if TRUE, convert function definitions */ 356 boolean changed; /* TRUE if conversion done in this file */ 357 } IncludeStack; 358 359 static IncludeStack *cur_file; /* current input file */ 360 361 /* #include "yyerror.c" */ 362 363 static int haveAnsiParam (void); 364 365 366 /* Flags to enable us to find if a procedure returns a value. 367 */ 368 static int return_val; /* nonzero on BRACES iff return-expression found */ 369 370 static const char * 371 dft_decl_spec (void) 372 { 373 return (lintLibrary() && !return_val) ? "void" : "int"; 374 } 375 376 static int 377 haveAnsiParam (void) 378 { 379 Parameter *p; 380 if (func_params != 0) { 381 for (p = func_params->first; p != 0; p = p->next) { 382 if (p->declarator->func_def == FUNC_ANSI) { 383 return TRUE; 384 } 385 } 386 } 387 return FALSE; 388 } 389 #line 388 "grammar.tab.c" 390 391 /* compatibility with bison */ 392 #ifdef YYPARSE_PARAM 393 /* compatibility with FreeBSD */ 394 # ifdef YYPARSE_PARAM_TYPE 395 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) 396 # else 397 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) 398 # endif 399 #else 400 # define YYPARSE_DECL() yyparse(void) 401 #endif 402 403 /* Parameters sent to lex. */ 404 #ifdef YYLEX_PARAM 405 # define YYLEX_DECL() yylex(void *YYLEX_PARAM) 406 # define YYLEX yylex(YYLEX_PARAM) 407 #else 408 # define YYLEX_DECL() yylex(void) 409 # define YYLEX yylex() 410 #endif 411 412 /* Parameters sent to yyerror. */ 413 #ifndef YYERROR_DECL 414 #define YYERROR_DECL() yyerror(const char *s) 415 #endif 416 #ifndef YYERROR_CALL 417 #define YYERROR_CALL(msg) yyerror(msg) 418 #endif 419 420 extern int YYPARSE_DECL(); 421 422 #define T_IDENTIFIER 257 423 #define T_TYPEDEF_NAME 258 424 #define T_DEFINE_NAME 259 425 #define T_AUTO 260 426 #define T_EXTERN 261 427 #define T_REGISTER 262 428 #define T_STATIC 263 429 #define T_TYPEDEF 264 430 #define T_INLINE 265 431 #define T_EXTENSION 266 432 #define T_CHAR 267 433 #define T_DOUBLE 268 434 #define T_FLOAT 269 435 #define T_INT 270 436 #define T_VOID 271 437 #define T_LONG 272 438 #define T_SHORT 273 439 #define T_SIGNED 274 440 #define T_UNSIGNED 275 441 #define T_ENUM 276 442 #define T_STRUCT 277 443 #define T_UNION 278 444 #define T_Bool 279 445 #define T_Complex 280 446 #define T_Imaginary 281 447 #define T_TYPE_QUALIFIER 282 448 #define T_BRACKETS 283 449 #define T_LBRACE 284 450 #define T_MATCHRBRACE 285 451 #define T_ELLIPSIS 286 452 #define T_INITIALIZER 287 453 #define T_STRING_LITERAL 288 454 #define T_ASM 289 455 #define T_ASMARG 290 456 #define T_VA_DCL 291 457 #define YYERRCODE 256 458 typedef short YYINT; 459 static const YYINT grammar_lhs[] = { -1, 460 0, 0, 26, 26, 27, 27, 27, 27, 27, 27, 461 27, 31, 30, 30, 28, 28, 34, 28, 32, 32, 462 33, 33, 35, 35, 37, 38, 29, 39, 29, 36, 463 36, 36, 40, 40, 1, 1, 2, 2, 2, 3, 464 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 465 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 466 5, 5, 6, 6, 6, 19, 19, 8, 8, 9, 467 41, 9, 7, 7, 7, 25, 23, 23, 10, 10, 468 11, 11, 11, 11, 11, 20, 20, 21, 21, 22, 469 22, 14, 14, 15, 15, 16, 16, 16, 17, 17, 470 18, 18, 24, 24, 12, 12, 12, 13, 13, 13, 471 13, 13, 13, 13, 472 }; 473 static const YYINT grammar_len[] = { 2, 474 0, 1, 1, 2, 1, 1, 1, 1, 3, 2, 475 2, 2, 3, 3, 2, 3, 0, 5, 2, 1, 476 0, 1, 1, 3, 0, 0, 7, 0, 5, 0, 477 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 478 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 479 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 480 1, 1, 3, 2, 2, 1, 1, 1, 3, 1, 481 0, 4, 3, 2, 2, 1, 1, 1, 2, 1, 482 1, 3, 2, 4, 4, 2, 3, 0, 1, 1, 483 2, 1, 3, 1, 3, 2, 2, 1, 0, 1, 484 1, 3, 1, 2, 1, 2, 1, 3, 2, 1, 485 4, 3, 3, 2, 486 }; 487 static const YYINT grammar_defred[] = { 0, 488 0, 0, 0, 0, 77, 0, 62, 40, 0, 42, 489 43, 20, 44, 0, 46, 47, 48, 49, 54, 50, 490 51, 52, 53, 76, 66, 67, 55, 56, 57, 61, 491 0, 7, 0, 0, 35, 37, 38, 39, 59, 60, 492 28, 0, 0, 0, 103, 81, 0, 0, 3, 5, 493 6, 8, 0, 10, 11, 78, 0, 90, 0, 0, 494 104, 0, 19, 0, 41, 45, 15, 36, 0, 68, 495 0, 0, 0, 83, 0, 0, 64, 0, 0, 74, 496 4, 58, 0, 82, 87, 91, 0, 14, 13, 9, 497 16, 0, 71, 0, 31, 33, 0, 0, 0, 0, 498 0, 94, 0, 0, 101, 12, 63, 73, 0, 0, 499 69, 0, 0, 0, 34, 0, 110, 96, 97, 0, 500 0, 84, 0, 85, 0, 23, 0, 0, 72, 26, 501 29, 114, 0, 0, 0, 109, 0, 93, 95, 102, 502 18, 0, 0, 108, 113, 112, 0, 24, 27, 111, 503 }; 504 static const YYINT grammar_dgoto[] = { 33, 505 87, 35, 36, 37, 38, 39, 40, 69, 70, 41, 506 42, 119, 120, 100, 101, 102, 103, 104, 43, 44, 507 59, 60, 45, 46, 47, 48, 49, 50, 51, 52, 508 77, 53, 127, 109, 128, 97, 94, 143, 72, 98, 509 112, 510 }; 511 static const YYINT grammar_sindex[] = { -2, 512 -3, 27, -239, -177, 0, 0, 0, 0, -274, 0, 513 0, 0, 0, -246, 0, 0, 0, 0, 0, 0, 514 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 515 -266, 0, 0, 455, 0, 0, 0, 0, 0, 0, 516 0, -35, -245, 128, 0, 0, -245, -2, 0, 0, 517 0, 0, 642, 0, 0, 0, -15, 0, -12, -239, 518 0, 590, 0, -27, 0, 0, 0, 0, -10, 0, 519 -11, 534, -72, 0, -237, -232, 0, -35, -232, 0, 520 0, 0, 642, 0, 0, 0, 455, 0, 0, 0, 521 0, 27, 0, 534, 0, 0, -222, 617, 209, 34, 522 39, 0, 44, 42, 0, 0, 0, 0, 27, -11, 523 0, -200, -196, -195, 0, 174, 0, 0, 0, -33, 524 243, 0, 561, 0, -177, 0, 33, 49, 0, 0, 525 0, 0, 53, 55, 417, 0, -33, 0, 0, 0, 526 0, 27, -188, 0, 0, 0, 57, 0, 0, 0, 527 }; 528 static const YYINT grammar_rindex[] = { 99, 529 0, 0, 275, 0, 0, -38, 0, 0, 481, 0, 530 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 531 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 532 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 533 0, 30, 0, 0, 0, 0, 0, 101, 0, 0, 534 0, 0, 0, 0, 0, 0, 0, 0, 343, 309, 535 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 536 98, -182, 62, 0, 0, 133, 0, 64, 379, 0, 537 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 538 0, 0, 0, -182, 0, 0, 0, -180, -19, 0, 539 65, 0, 0, 68, 0, 0, 0, 0, 51, 9, 540 0, 0, 0, 0, 0, 0, 0, 0, 0, -13, 541 19, 0, 0, 0, 0, 0, 0, 52, 0, 0, 542 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 543 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 544 }; 545 static const YYINT grammar_gindex[] = { 0, 546 11, -17, 0, 0, 13, 0, 0, 0, 20, 8, 547 -43, -1, -8, -89, 0, -9, 0, 0, 0, -44, 548 0, 0, 4, 0, 0, 0, 70, -53, 0, 0, 549 -18, 0, 0, 0, 0, 22, 0, 0, 0, 0, 550 0, 551 }; 552 #define YYTABLESIZE 924 553 static const YYINT grammar_table[] = { 58, 554 78, 58, 58, 58, 73, 58, 135, 61, 88, 57, 555 34, 5, 56, 62, 85, 58, 68, 63, 96, 7, 556 58, 98, 78, 64, 98, 84, 134, 107, 80, 3, 557 107, 90, 17, 92, 17, 4, 17, 2, 75, 3, 558 96, 71, 30, 89, 115, 147, 76, 106, 91, 93, 559 79, 75, 70, 17, 121, 55, 32, 107, 34, 105, 560 108, 114, 105, 83, 4, 68, 2, 70, 3, 68, 561 80, 121, 86, 80, 122, 106, 105, 78, 106, 5, 562 56, 68, 123, 99, 124, 125, 129, 130, 80, 131, 563 80, 141, 142, 144, 110, 145, 149, 150, 1, 110, 564 2, 30, 99, 32, 79, 92, 118, 79, 100, 21, 565 22, 111, 137, 139, 133, 113, 126, 81, 0, 0, 566 0, 0, 79, 57, 79, 0, 99, 0, 140, 0, 567 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 568 0, 70, 0, 0, 0, 99, 0, 0, 0, 148, 569 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 570 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 571 65, 0, 65, 65, 65, 0, 65, 0, 0, 0, 572 0, 0, 0, 0, 5, 6, 7, 8, 65, 10, 573 11, 65, 13, 66, 15, 16, 17, 18, 19, 20, 574 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 575 0, 4, 0, 116, 132, 3, 0, 0, 58, 58, 576 58, 58, 58, 58, 58, 78, 58, 58, 58, 58, 577 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 578 58, 58, 58, 58, 58, 78, 4, 74, 116, 136, 579 3, 17, 78, 1, 5, 6, 7, 8, 9, 10, 580 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 581 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 582 4, 54, 116, 5, 56, 0, 31, 80, 80, 80, 583 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 584 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 585 80, 80, 88, 80, 88, 88, 88, 0, 88, 0, 586 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 587 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 588 79, 79, 79, 79, 79, 79, 89, 79, 89, 89, 589 89, 0, 89, 0, 79, 25, 25, 25, 25, 25, 590 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 591 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 592 86, 25, 86, 86, 5, 56, 86, 0, 25, 65, 593 65, 65, 65, 65, 65, 65, 0, 65, 65, 65, 594 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 595 65, 65, 65, 65, 65, 65, 75, 0, 75, 75, 596 75, 0, 75, 0, 0, 0, 0, 0, 0, 0, 597 5, 6, 7, 8, 65, 10, 11, 75, 13, 66, 598 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 599 25, 26, 27, 28, 29, 30, 117, 146, 0, 0, 600 0, 0, 0, 0, 0, 5, 6, 7, 8, 65, 601 10, 11, 0, 13, 66, 15, 16, 17, 18, 19, 602 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 603 30, 117, 4, 0, 2, 0, 3, 0, 0, 5, 604 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 605 0, 0, 0, 67, 0, 0, 0, 0, 41, 0, 606 41, 0, 41, 0, 0, 117, 0, 0, 0, 0, 607 0, 88, 88, 0, 0, 0, 0, 0, 0, 41, 608 0, 0, 0, 0, 0, 0, 45, 0, 45, 0, 609 45, 0, 0, 0, 0, 0, 0, 88, 0, 0, 610 0, 0, 0, 0, 0, 89, 89, 45, 0, 0, 611 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613 0, 89, 0, 0, 0, 0, 0, 0, 0, 86, 614 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 615 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 617 0, 0, 0, 0, 0, 75, 75, 75, 75, 75, 618 75, 75, 0, 75, 75, 75, 75, 75, 75, 75, 619 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 620 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, 621 0, 0, 0, 0, 82, 7, 8, 65, 10, 11, 622 0, 13, 66, 15, 16, 17, 18, 19, 20, 21, 623 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, 624 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 625 0, 5, 6, 7, 8, 65, 10, 11, 0, 13, 626 66, 15, 16, 17, 18, 19, 20, 21, 22, 23, 627 24, 25, 26, 27, 28, 29, 30, 41, 41, 41, 628 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 629 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 630 41, 41, 41, 0, 0, 45, 45, 45, 45, 45, 631 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 632 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 633 45, 82, 7, 8, 65, 10, 11, 12, 13, 14, 634 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 635 25, 26, 27, 28, 29, 30, 0, 0, 82, 7, 636 8, 65, 10, 11, 95, 13, 66, 15, 16, 17, 637 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 638 28, 29, 30, 0, 0, 0, 138, 82, 7, 8, 639 65, 10, 11, 12, 13, 14, 15, 16, 17, 18, 640 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 641 29, 30, 0, 75, 82, 7, 8, 65, 10, 11, 642 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 643 22, 23, 24, 25, 26, 27, 28, 29, 30, 82, 644 7, 8, 65, 10, 11, 0, 13, 66, 15, 16, 645 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 646 27, 28, 29, 30, 647 }; 648 static const YYINT grammar_check[] = { 38, 649 44, 40, 41, 42, 40, 44, 40, 4, 62, 2, 650 0, 257, 258, 288, 59, 3, 34, 264, 72, 259, 651 59, 41, 61, 290, 44, 41, 116, 41, 47, 42, 652 44, 59, 38, 44, 40, 38, 42, 40, 284, 42, 653 94, 34, 282, 62, 98, 135, 43, 285, 59, 61, 654 47, 284, 44, 59, 99, 59, 59, 76, 48, 41, 655 79, 284, 44, 53, 38, 83, 40, 59, 42, 87, 656 41, 116, 60, 44, 41, 41, 73, 121, 44, 257, 657 258, 99, 44, 73, 41, 44, 287, 284, 59, 285, 658 61, 59, 44, 41, 87, 41, 285, 41, 0, 92, 659 0, 284, 41, 284, 41, 41, 99, 44, 41, 59, 660 59, 92, 121, 123, 116, 94, 109, 48, -1, -1, 661 -1, -1, 59, 116, 61, -1, 116, -1, 125, -1, 662 -1, -1, -1, 123, -1, -1, -1, -1, -1, -1, 663 -1, 44, -1, -1, -1, 135, -1, -1, -1, 142, 664 -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, 665 -1, -1, -1, -1, -1, 38, -1, 40, -1, -1, 666 38, -1, 40, 41, 42, -1, 44, -1, -1, -1, 667 -1, -1, -1, -1, 257, 258, 259, 260, 261, 262, 668 263, 59, 265, 266, 267, 268, 269, 270, 271, 272, 669 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 670 -1, 38, -1, 40, 41, 42, -1, -1, 257, 258, 671 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 672 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 673 279, 280, 281, 282, 283, 284, 38, 283, 40, 283, 674 42, 257, 291, 256, 257, 258, 259, 260, 261, 262, 675 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 676 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 677 38, 285, 40, 257, 258, -1, 289, 258, 259, 260, 678 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 679 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 680 281, 282, 38, 284, 40, 41, 42, -1, 44, -1, 681 291, 258, 259, 260, 261, 262, 263, 264, 265, 266, 682 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 683 277, 278, 279, 280, 281, 282, 38, 284, 40, 41, 684 42, -1, 44, -1, 291, 258, 259, 260, 261, 262, 685 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 686 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 687 38, 284, 40, 41, 257, 258, 44, -1, 291, 257, 688 258, 259, 260, 261, 262, 263, -1, 265, 266, 267, 689 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 690 278, 279, 280, 281, 282, 283, 38, -1, 40, 41, 691 42, -1, 44, -1, -1, -1, -1, -1, -1, -1, 692 257, 258, 259, 260, 261, 262, 263, 59, 265, 266, 693 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 694 277, 278, 279, 280, 281, 282, 283, 41, -1, -1, 695 -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, 696 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 697 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 698 282, 283, 38, -1, 40, -1, 42, -1, -1, 257, 699 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, 700 -1, -1, -1, 59, -1, -1, -1, -1, 38, -1, 701 40, -1, 42, -1, -1, 283, -1, -1, -1, -1, 702 -1, 257, 258, -1, -1, -1, -1, -1, -1, 59, 703 -1, -1, -1, -1, -1, -1, 38, -1, 40, -1, 704 42, -1, -1, -1, -1, -1, -1, 283, -1, -1, 705 -1, -1, -1, -1, -1, 257, 258, 59, -1, -1, 706 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 707 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 708 -1, 283, -1, -1, -1, -1, -1, -1, -1, 257, 709 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, 710 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 711 -1, -1, -1, -1, -1, 283, -1, -1, -1, -1, 712 -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, 713 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 714 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 715 282, 283, -1, -1, -1, -1, -1, -1, -1, -1, 716 -1, -1, -1, -1, 258, 259, 260, 261, 262, 263, 717 -1, 265, 266, 267, 268, 269, 270, 271, 272, 273, 718 274, 275, 276, 277, 278, 279, 280, 281, 282, -1, 719 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 720 -1, 257, 258, 259, 260, 261, 262, 263, -1, 265, 721 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 722 276, 277, 278, 279, 280, 281, 282, 257, 258, 259, 723 260, 261, 262, 263, -1, 265, 266, 267, 268, 269, 724 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 725 280, 281, 282, -1, -1, 257, 258, 259, 260, 261, 726 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 727 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 728 282, 258, 259, 260, 261, 262, 263, 264, 265, 266, 729 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 730 277, 278, 279, 280, 281, 282, -1, -1, 258, 259, 731 260, 261, 262, 263, 291, 265, 266, 267, 268, 269, 732 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 733 280, 281, 282, -1, -1, -1, 286, 258, 259, 260, 734 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 735 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 736 281, 282, -1, 284, 258, 259, 260, 261, 262, 263, 737 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 738 274, 275, 276, 277, 278, 279, 280, 281, 282, 258, 739 259, 260, 261, 262, 263, -1, 265, 266, 267, 268, 740 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 741 279, 280, 281, 282, 742 }; 743 #define YYFINAL 33 744 #ifndef YYDEBUG 745 #define YYDEBUG 0 746 #endif 747 #define YYMAXTOKEN 291 748 #define YYUNDFTOKEN 335 749 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a)) 750 #if YYDEBUG 751 static const char *const grammar_name[] = { 752 753 "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 754 0,0,0,0,"'&'",0,"'('","')'","'*'",0,"','",0,0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0, 755 "'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 756 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 757 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 758 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 759 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 760 "T_IDENTIFIER","T_TYPEDEF_NAME","T_DEFINE_NAME","T_AUTO","T_EXTERN", 761 "T_REGISTER","T_STATIC","T_TYPEDEF","T_INLINE","T_EXTENSION","T_CHAR", 762 "T_DOUBLE","T_FLOAT","T_INT","T_VOID","T_LONG","T_SHORT","T_SIGNED", 763 "T_UNSIGNED","T_ENUM","T_STRUCT","T_UNION","T_Bool","T_Complex","T_Imaginary", 764 "T_TYPE_QUALIFIER","T_BRACKETS","T_LBRACE","T_MATCHRBRACE","T_ELLIPSIS", 765 "T_INITIALIZER","T_STRING_LITERAL","T_ASM","T_ASMARG","T_VA_DCL",0,0,0,0,0,0,0, 766 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 767 "illegal-symbol", 768 }; 769 static const char *const grammar_rule[] = { 770 "$accept : program", 771 "program :", 772 "program : translation_unit", 773 "translation_unit : external_declaration", 774 "translation_unit : translation_unit external_declaration", 775 "external_declaration : declaration", 776 "external_declaration : function_definition", 777 "external_declaration : ';'", 778 "external_declaration : linkage_specification", 779 "external_declaration : T_ASM T_ASMARG ';'", 780 "external_declaration : error T_MATCHRBRACE", 781 "external_declaration : error ';'", 782 "braces : T_LBRACE T_MATCHRBRACE", 783 "linkage_specification : T_EXTERN T_STRING_LITERAL braces", 784 "linkage_specification : T_EXTERN T_STRING_LITERAL declaration", 785 "declaration : decl_specifiers ';'", 786 "declaration : decl_specifiers init_declarator_list ';'", 787 "$$1 :", 788 "declaration : any_typedef decl_specifiers $$1 opt_declarator_list ';'", 789 "any_typedef : T_EXTENSION T_TYPEDEF", 790 "any_typedef : T_TYPEDEF", 791 "opt_declarator_list :", 792 "opt_declarator_list : declarator_list", 793 "declarator_list : declarator", 794 "declarator_list : declarator_list ',' declarator", 795 "$$2 :", 796 "$$3 :", 797 "function_definition : decl_specifiers declarator $$2 opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE", 798 "$$4 :", 799 "function_definition : declarator $$4 opt_declaration_list T_LBRACE T_MATCHRBRACE", 800 "opt_declaration_list :", 801 "opt_declaration_list : T_VA_DCL", 802 "opt_declaration_list : declaration_list", 803 "declaration_list : declaration", 804 "declaration_list : declaration_list declaration", 805 "decl_specifiers : decl_specifier", 806 "decl_specifiers : decl_specifiers decl_specifier", 807 "decl_specifier : storage_class", 808 "decl_specifier : type_specifier", 809 "decl_specifier : type_qualifier", 810 "storage_class : T_AUTO", 811 "storage_class : T_EXTERN", 812 "storage_class : T_REGISTER", 813 "storage_class : T_STATIC", 814 "storage_class : T_INLINE", 815 "storage_class : T_EXTENSION", 816 "type_specifier : T_CHAR", 817 "type_specifier : T_DOUBLE", 818 "type_specifier : T_FLOAT", 819 "type_specifier : T_INT", 820 "type_specifier : T_LONG", 821 "type_specifier : T_SHORT", 822 "type_specifier : T_SIGNED", 823 "type_specifier : T_UNSIGNED", 824 "type_specifier : T_VOID", 825 "type_specifier : T_Bool", 826 "type_specifier : T_Complex", 827 "type_specifier : T_Imaginary", 828 "type_specifier : T_TYPEDEF_NAME", 829 "type_specifier : struct_or_union_specifier", 830 "type_specifier : enum_specifier", 831 "type_qualifier : T_TYPE_QUALIFIER", 832 "type_qualifier : T_DEFINE_NAME", 833 "struct_or_union_specifier : struct_or_union any_id braces", 834 "struct_or_union_specifier : struct_or_union braces", 835 "struct_or_union_specifier : struct_or_union any_id", 836 "struct_or_union : T_STRUCT", 837 "struct_or_union : T_UNION", 838 "init_declarator_list : init_declarator", 839 "init_declarator_list : init_declarator_list ',' init_declarator", 840 "init_declarator : declarator", 841 "$$5 :", 842 "init_declarator : declarator '=' $$5 T_INITIALIZER", 843 "enum_specifier : enumeration any_id braces", 844 "enum_specifier : enumeration braces", 845 "enum_specifier : enumeration any_id", 846 "enumeration : T_ENUM", 847 "any_id : T_IDENTIFIER", 848 "any_id : T_TYPEDEF_NAME", 849 "declarator : pointer direct_declarator", 850 "declarator : direct_declarator", 851 "direct_declarator : identifier_or_ref", 852 "direct_declarator : '(' declarator ')'", 853 "direct_declarator : direct_declarator T_BRACKETS", 854 "direct_declarator : direct_declarator '(' parameter_type_list ')'", 855 "direct_declarator : direct_declarator '(' opt_identifier_list ')'", 856 "pointer : '*' opt_type_qualifiers", 857 "pointer : '*' opt_type_qualifiers pointer", 858 "opt_type_qualifiers :", 859 "opt_type_qualifiers : type_qualifier_list", 860 "type_qualifier_list : type_qualifier", 861 "type_qualifier_list : type_qualifier_list type_qualifier", 862 "parameter_type_list : parameter_list", 863 "parameter_type_list : parameter_list ',' T_ELLIPSIS", 864 "parameter_list : parameter_declaration", 865 "parameter_list : parameter_list ',' parameter_declaration", 866 "parameter_declaration : decl_specifiers declarator", 867 "parameter_declaration : decl_specifiers abs_declarator", 868 "parameter_declaration : decl_specifiers", 869 "opt_identifier_list :", 870 "opt_identifier_list : identifier_list", 871 "identifier_list : any_id", 872 "identifier_list : identifier_list ',' any_id", 873 "identifier_or_ref : any_id", 874 "identifier_or_ref : '&' any_id", 875 "abs_declarator : pointer", 876 "abs_declarator : pointer direct_abs_declarator", 877 "abs_declarator : direct_abs_declarator", 878 "direct_abs_declarator : '(' abs_declarator ')'", 879 "direct_abs_declarator : direct_abs_declarator T_BRACKETS", 880 "direct_abs_declarator : T_BRACKETS", 881 "direct_abs_declarator : direct_abs_declarator '(' parameter_type_list ')'", 882 "direct_abs_declarator : direct_abs_declarator '(' ')'", 883 "direct_abs_declarator : '(' parameter_type_list ')'", 884 "direct_abs_declarator : '(' ')'", 885 886 }; 887 #endif 888 889 int yydebug; 890 int yynerrs; 891 892 int yyerrflag; 893 int yychar; 894 YYSTYPE yyval; 895 YYSTYPE yylval; 896 897 /* define the initial stack-sizes */ 898 #ifdef YYSTACKSIZE 899 #undef YYMAXDEPTH 900 #define YYMAXDEPTH YYSTACKSIZE 901 #else 902 #ifdef YYMAXDEPTH 903 #define YYSTACKSIZE YYMAXDEPTH 904 #else 905 #define YYSTACKSIZE 10000 906 #define YYMAXDEPTH 10000 907 #endif 908 #endif 909 910 #define YYINITSTACKSIZE 200 911 912 typedef struct { 913 unsigned stacksize; 914 YYINT *s_base; 915 YYINT *s_mark; 916 YYINT *s_last; 917 YYSTYPE *l_base; 918 YYSTYPE *l_mark; 919 } YYSTACKDATA; 920 /* variables for the parser stack */ 921 static YYSTACKDATA yystack; 922 #line 1014 "grammar.y" 923 924 /* lex.yy.c */ 925 #define BEGIN yy_start = 1 + 2 * 926 927 #define CPP1 1 928 #define INIT1 2 929 #define INIT2 3 930 #define CURLY 4 931 #define LEXYACC 5 932 #define ASM 6 933 #define CPP_INLINE 7 934 935 extern char *yytext; 936 extern FILE *yyin, *yyout; 937 938 static int curly; /* number of curly brace nesting levels */ 939 static int ly_count; /* number of occurances of %% */ 940 static int inc_depth; /* include nesting level */ 941 static SymbolTable *included_files; /* files already included */ 942 static int yy_start = 0; /* start state number */ 943 944 #define grammar_error(s) yaccError(s) 945 946 static void 947 yaccError (const char *msg) 948 { 949 func_params = NULL; 950 put_error(); /* tell what line we're on, and what file */ 951 fprintf(stderr, "%s at token '%s'\n", msg, yytext); 952 } 953 954 /* Initialize the table of type qualifier keywords recognized by the lexical 955 * analyzer. 956 */ 957 void 958 init_parser (void) 959 { 960 static const char *keywords[] = { 961 "const", 962 "restrict", 963 "volatile", 964 "interrupt", 965 #ifdef vms 966 "noshare", 967 "readonly", 968 #endif 969 #if defined(MSDOS) || defined(OS2) 970 "__cdecl", 971 "__export", 972 "__far", 973 "__fastcall", 974 "__fortran", 975 "__huge", 976 "__inline", 977 "__interrupt", 978 "__loadds", 979 "__near", 980 "__pascal", 981 "__saveregs", 982 "__segment", 983 "__stdcall", 984 "__syscall", 985 "_cdecl", 986 "_cs", 987 "_ds", 988 "_es", 989 "_export", 990 "_far", 991 "_fastcall", 992 "_fortran", 993 "_huge", 994 "_interrupt", 995 "_loadds", 996 "_near", 997 "_pascal", 998 "_saveregs", 999 "_seg", 1000 "_segment", 1001 "_ss", 1002 "cdecl", 1003 "far", 1004 "huge", 1005 "near", 1006 "pascal", 1007 #ifdef OS2 1008 "__far16", 1009 #endif 1010 #endif 1011 #ifdef __GNUC__ 1012 /* gcc aliases */ 1013 "__builtin_va_arg", 1014 "__builtin_va_list", 1015 "__const", 1016 "__const__", 1017 "__inline", 1018 "__inline__", 1019 "__restrict", 1020 "__restrict__", 1021 "__volatile", 1022 "__volatile__", 1023 #endif 1024 }; 1025 unsigned i; 1026 1027 /* Initialize type qualifier table. */ 1028 type_qualifiers = new_symbol_table(); 1029 for (i = 0; i < sizeof(keywords)/sizeof(keywords[0]); ++i) { 1030 new_symbol(type_qualifiers, keywords[i], NULL, DS_NONE); 1031 } 1032 } 1033 1034 /* Process the C source file. Write function prototypes to the standard 1035 * output. Convert function definitions and write the converted source 1036 * code to a temporary file. 1037 */ 1038 void 1039 process_file (FILE *infile, char *name) 1040 { 1041 char *s; 1042 1043 if (strlen(name) > 2) { 1044 s = name + strlen(name) - 2; 1045 if (*s == '.') { 1046 ++s; 1047 if (*s == 'l' || *s == 'y') 1048 BEGIN LEXYACC; 1049 #if defined(MSDOS) || defined(OS2) 1050 if (*s == 'L' || *s == 'Y') 1051 BEGIN LEXYACC; 1052 #endif 1053 } 1054 } 1055 1056 included_files = new_symbol_table(); 1057 typedef_names = new_symbol_table(); 1058 define_names = new_symbol_table(); 1059 inc_depth = -1; 1060 curly = 0; 1061 ly_count = 0; 1062 func_params = NULL; 1063 yyin = infile; 1064 include_file(strcpy(base_file, name), func_style != FUNC_NONE); 1065 if (file_comments) { 1066 #if OPT_LINTLIBRARY 1067 if (lintLibrary()) { 1068 put_blankline(stdout); 1069 begin_tracking(); 1070 } 1071 #endif 1072 put_string(stdout, "/* "); 1073 put_string(stdout, cur_file_name()); 1074 put_string(stdout, " */\n"); 1075 } 1076 yyparse(); 1077 free_symbol_table(define_names); 1078 free_symbol_table(typedef_names); 1079 free_symbol_table(included_files); 1080 } 1081 1082 #ifdef NO_LEAKS 1083 void 1084 free_parser(void) 1085 { 1086 free_symbol_table (type_qualifiers); 1087 #ifdef FLEX_SCANNER 1088 if (yy_current_buffer != 0) 1089 yy_delete_buffer(yy_current_buffer); 1090 #endif 1091 } 1092 #endif 1093 #line 1092 "grammar.tab.c" 1094 1095 #if YYDEBUG 1096 #include <stdio.h> /* needed for printf */ 1097 #endif 1098 1099 #include <stdlib.h> /* needed for malloc, etc */ 1100 #include <string.h> /* needed for memset */ 1101 1102 /* allocate initial stack or double stack size, up to YYMAXDEPTH */ 1103 static int yygrowstack(YYSTACKDATA *data) 1104 { 1105 int i; 1106 unsigned newsize; 1107 YYINT *newss; 1108 YYSTYPE *newvs; 1109 1110 if ((newsize = data->stacksize) == 0) 1111 newsize = YYINITSTACKSIZE; 1112 else if (newsize >= YYMAXDEPTH) 1113 return YYENOMEM; 1114 else if ((newsize *= 2) > YYMAXDEPTH) 1115 newsize = YYMAXDEPTH; 1116 1117 i = (int) (data->s_mark - data->s_base); 1118 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss)); 1119 if (newss == 0) 1120 return YYENOMEM; 1121 1122 data->s_base = newss; 1123 data->s_mark = newss + i; 1124 1125 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); 1126 if (newvs == 0) 1127 return YYENOMEM; 1128 1129 data->l_base = newvs; 1130 data->l_mark = newvs + i; 1131 1132 data->stacksize = newsize; 1133 data->s_last = data->s_base + newsize - 1; 1134 return 0; 1135 } 1136 1137 #if YYPURE || defined(YY_NO_LEAKS) 1138 static void yyfreestack(YYSTACKDATA *data) 1139 { 1140 free(data->s_base); 1141 free(data->l_base); 1142 memset(data, 0, sizeof(*data)); 1143 } 1144 #else 1145 #define yyfreestack(data) /* nothing */ 1146 #endif 1147 1148 #define YYABORT goto yyabort 1149 #define YYREJECT goto yyabort 1150 #define YYACCEPT goto yyaccept 1151 #define YYERROR goto yyerrlab 1152 1153 int 1154 YYPARSE_DECL() 1155 { 1156 int yym, yyn, yystate; 1157 #if YYDEBUG 1158 const char *yys; 1159 1160 if ((yys = getenv("YYDEBUG")) != 0) 1161 { 1162 yyn = *yys; 1163 if (yyn >= '0' && yyn <= '9') 1164 yydebug = yyn - '0'; 1165 } 1166 #endif 1167 1168 yym = 0; 1169 yyn = 0; 1170 yynerrs = 0; 1171 yyerrflag = 0; 1172 yychar = YYEMPTY; 1173 yystate = 0; 1174 1175 #if YYPURE 1176 memset(&yystack, 0, sizeof(yystack)); 1177 #endif 1178 1179 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 1180 yystack.s_mark = yystack.s_base; 1181 yystack.l_mark = yystack.l_base; 1182 yystate = 0; 1183 *yystack.s_mark = 0; 1184 1185 yyloop: 1186 if ((yyn = yydefred[yystate]) != 0) goto yyreduce; 1187 if (yychar < 0) 1188 { 1189 yychar = YYLEX; 1190 if (yychar < 0) yychar = YYEOF; 1191 #if YYDEBUG 1192 if (yydebug) 1193 { 1194 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 1195 printf("%sdebug: state %d, reading %d (%s)\n", 1196 YYPREFIX, yystate, yychar, yys); 1197 } 1198 #endif 1199 } 1200 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 && 1201 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 1202 { 1203 #if YYDEBUG 1204 if (yydebug) 1205 printf("%sdebug: state %d, shifting to state %d\n", 1206 YYPREFIX, yystate, yytable[yyn]); 1207 #endif 1208 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 1209 yystate = yytable[yyn]; 1210 *++yystack.s_mark = yytable[yyn]; 1211 *++yystack.l_mark = yylval; 1212 yychar = YYEMPTY; 1213 if (yyerrflag > 0) --yyerrflag; 1214 goto yyloop; 1215 } 1216 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 && 1217 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 1218 { 1219 yyn = yytable[yyn]; 1220 goto yyreduce; 1221 } 1222 if (yyerrflag != 0) goto yyinrecovery; 1223 1224 YYERROR_CALL("syntax error"); 1225 1226 goto yyerrlab; /* redundant goto avoids 'unused label' warning */ 1227 yyerrlab: 1228 ++yynerrs; 1229 1230 yyinrecovery: 1231 if (yyerrflag < 3) 1232 { 1233 yyerrflag = 3; 1234 for (;;) 1235 { 1236 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 && 1237 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE) 1238 { 1239 #if YYDEBUG 1240 if (yydebug) 1241 printf("%sdebug: state %d, error recovery shifting\ 1242 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); 1243 #endif 1244 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 1245 yystate = yytable[yyn]; 1246 *++yystack.s_mark = yytable[yyn]; 1247 *++yystack.l_mark = yylval; 1248 goto yyloop; 1249 } 1250 else 1251 { 1252 #if YYDEBUG 1253 if (yydebug) 1254 printf("%sdebug: error recovery discarding state %d\n", 1255 YYPREFIX, *yystack.s_mark); 1256 #endif 1257 if (yystack.s_mark <= yystack.s_base) goto yyabort; 1258 --yystack.s_mark; 1259 --yystack.l_mark; 1260 } 1261 } 1262 } 1263 else 1264 { 1265 if (yychar == YYEOF) goto yyabort; 1266 #if YYDEBUG 1267 if (yydebug) 1268 { 1269 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 1270 printf("%sdebug: state %d, error recovery discards token %d (%s)\n", 1271 YYPREFIX, yystate, yychar, yys); 1272 } 1273 #endif 1274 yychar = YYEMPTY; 1275 goto yyloop; 1276 } 1277 1278 yyreduce: 1279 #if YYDEBUG 1280 if (yydebug) 1281 printf("%sdebug: state %d, reducing by rule %d (%s)\n", 1282 YYPREFIX, yystate, yyn, yyrule[yyn]); 1283 #endif 1284 yym = yylen[yyn]; 1285 if (yym > 0) 1286 yyval = yystack.l_mark[1-yym]; 1287 else 1288 memset(&yyval, 0, sizeof yyval); 1289 1290 switch (yyn) 1291 { 1292 case 10: 1293 #line 377 "grammar.y" 1294 { 1295 yyerrok; 1296 } 1297 break; 1298 case 11: 1299 #line 381 "grammar.y" 1300 { 1301 yyerrok; 1302 } 1303 break; 1304 case 13: 1305 #line 392 "grammar.y" 1306 { 1307 /* Provide an empty action here so bison will not complain about 1308 * incompatible types in the default action it normally would 1309 * have generated. 1310 */ 1311 } 1312 break; 1313 case 14: 1314 #line 399 "grammar.y" 1315 { 1316 /* empty */ 1317 } 1318 break; 1319 case 15: 1320 #line 406 "grammar.y" 1321 { 1322 #if OPT_LINTLIBRARY 1323 if (types_out && want_typedef()) { 1324 gen_declarations(&yystack.l_mark[-1].decl_spec, (DeclaratorList *)0); 1325 flush_varargs(); 1326 } 1327 #endif 1328 free_decl_spec(&yystack.l_mark[-1].decl_spec); 1329 end_typedef(); 1330 } 1331 break; 1332 case 16: 1333 #line 417 "grammar.y" 1334 { 1335 if (func_params != NULL) { 1336 set_param_types(func_params, &yystack.l_mark[-2].decl_spec, &yystack.l_mark[-1].decl_list); 1337 } else { 1338 gen_declarations(&yystack.l_mark[-2].decl_spec, &yystack.l_mark[-1].decl_list); 1339 #if OPT_LINTLIBRARY 1340 flush_varargs(); 1341 #endif 1342 free_decl_list(&yystack.l_mark[-1].decl_list); 1343 } 1344 free_decl_spec(&yystack.l_mark[-2].decl_spec); 1345 end_typedef(); 1346 } 1347 break; 1348 case 17: 1349 #line 431 "grammar.y" 1350 { 1351 cur_decl_spec_flags = yystack.l_mark[0].decl_spec.flags; 1352 free_decl_spec(&yystack.l_mark[0].decl_spec); 1353 } 1354 break; 1355 case 18: 1356 #line 436 "grammar.y" 1357 { 1358 end_typedef(); 1359 } 1360 break; 1361 case 19: 1362 #line 443 "grammar.y" 1363 { 1364 begin_typedef(); 1365 } 1366 break; 1367 case 20: 1368 #line 447 "grammar.y" 1369 { 1370 begin_typedef(); 1371 } 1372 break; 1373 case 23: 1374 #line 459 "grammar.y" 1375 { 1376 int flags = cur_decl_spec_flags; 1377 1378 /* If the typedef is a pointer type, then reset the short type 1379 * flags so it does not get promoted. 1380 */ 1381 if (strcmp(yystack.l_mark[0].declarator->text, yystack.l_mark[0].declarator->name) != 0) 1382 flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); 1383 new_symbol(typedef_names, yystack.l_mark[0].declarator->name, NULL, flags); 1384 free_declarator(yystack.l_mark[0].declarator); 1385 } 1386 break; 1387 case 24: 1388 #line 471 "grammar.y" 1389 { 1390 int flags = cur_decl_spec_flags; 1391 1392 if (strcmp(yystack.l_mark[0].declarator->text, yystack.l_mark[0].declarator->name) != 0) 1393 flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); 1394 new_symbol(typedef_names, yystack.l_mark[0].declarator->name, NULL, flags); 1395 free_declarator(yystack.l_mark[0].declarator); 1396 } 1397 break; 1398 case 25: 1399 #line 483 "grammar.y" 1400 { 1401 check_untagged(&yystack.l_mark[-1].decl_spec); 1402 if (yystack.l_mark[0].declarator->func_def == FUNC_NONE) { 1403 yyerror("syntax error"); 1404 YYERROR; 1405 } 1406 func_params = &(yystack.l_mark[0].declarator->head->params); 1407 func_params->begin_comment = cur_file->begin_comment; 1408 func_params->end_comment = cur_file->end_comment; 1409 } 1410 break; 1411 case 26: 1412 #line 494 "grammar.y" 1413 { 1414 /* If we're converting to K&R and we've got a nominally K&R 1415 * function which has a parameter which is ANSI (i.e., a prototyped 1416 * function pointer), then we must override the deciphered value of 1417 * 'func_def' so that the parameter will be converted. 1418 */ 1419 if (func_style == FUNC_TRADITIONAL 1420 && haveAnsiParam() 1421 && yystack.l_mark[-3].declarator->head->func_def == func_style) { 1422 yystack.l_mark[-3].declarator->head->func_def = FUNC_BOTH; 1423 } 1424 1425 func_params = NULL; 1426 1427 if (cur_file->convert) 1428 gen_func_definition(&yystack.l_mark[-4].decl_spec, yystack.l_mark[-3].declarator); 1429 gen_prototype(&yystack.l_mark[-4].decl_spec, yystack.l_mark[-3].declarator); 1430 #if OPT_LINTLIBRARY 1431 flush_varargs(); 1432 #endif 1433 free_decl_spec(&yystack.l_mark[-4].decl_spec); 1434 free_declarator(yystack.l_mark[-3].declarator); 1435 } 1436 break; 1437 case 28: 1438 #line 519 "grammar.y" 1439 { 1440 if (yystack.l_mark[0].declarator->func_def == FUNC_NONE) { 1441 yyerror("syntax error"); 1442 YYERROR; 1443 } 1444 func_params = &(yystack.l_mark[0].declarator->head->params); 1445 func_params->begin_comment = cur_file->begin_comment; 1446 func_params->end_comment = cur_file->end_comment; 1447 } 1448 break; 1449 case 29: 1450 #line 529 "grammar.y" 1451 { 1452 DeclSpec decl_spec; 1453 1454 func_params = NULL; 1455 1456 new_decl_spec(&decl_spec, dft_decl_spec(), yystack.l_mark[-4].declarator->begin, DS_NONE); 1457 if (cur_file->convert) 1458 gen_func_definition(&decl_spec, yystack.l_mark[-4].declarator); 1459 gen_prototype(&decl_spec, yystack.l_mark[-4].declarator); 1460 #if OPT_LINTLIBRARY 1461 flush_varargs(); 1462 #endif 1463 free_decl_spec(&decl_spec); 1464 free_declarator(yystack.l_mark[-4].declarator); 1465 } 1466 break; 1467 case 36: 1468 #line 560 "grammar.y" 1469 { 1470 join_decl_specs(&yyval.decl_spec, &yystack.l_mark[-1].decl_spec, &yystack.l_mark[0].decl_spec); 1471 free(yystack.l_mark[-1].decl_spec.text); 1472 free(yystack.l_mark[0].decl_spec.text); 1473 } 1474 break; 1475 case 40: 1476 #line 575 "grammar.y" 1477 { 1478 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1479 } 1480 break; 1481 case 41: 1482 #line 579 "grammar.y" 1483 { 1484 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_EXTERN); 1485 } 1486 break; 1487 case 42: 1488 #line 583 "grammar.y" 1489 { 1490 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1491 } 1492 break; 1493 case 43: 1494 #line 587 "grammar.y" 1495 { 1496 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_STATIC); 1497 } 1498 break; 1499 case 44: 1500 #line 591 "grammar.y" 1501 { 1502 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_INLINE); 1503 } 1504 break; 1505 case 45: 1506 #line 595 "grammar.y" 1507 { 1508 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_JUNK); 1509 } 1510 break; 1511 case 46: 1512 #line 602 "grammar.y" 1513 { 1514 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_CHAR); 1515 } 1516 break; 1517 case 47: 1518 #line 606 "grammar.y" 1519 { 1520 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1521 } 1522 break; 1523 case 48: 1524 #line 610 "grammar.y" 1525 { 1526 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_FLOAT); 1527 } 1528 break; 1529 case 49: 1530 #line 614 "grammar.y" 1531 { 1532 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1533 } 1534 break; 1535 case 50: 1536 #line 618 "grammar.y" 1537 { 1538 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1539 } 1540 break; 1541 case 51: 1542 #line 622 "grammar.y" 1543 { 1544 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_SHORT); 1545 } 1546 break; 1547 case 52: 1548 #line 626 "grammar.y" 1549 { 1550 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1551 } 1552 break; 1553 case 53: 1554 #line 630 "grammar.y" 1555 { 1556 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1557 } 1558 break; 1559 case 54: 1560 #line 634 "grammar.y" 1561 { 1562 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1563 } 1564 break; 1565 case 55: 1566 #line 638 "grammar.y" 1567 { 1568 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_CHAR); 1569 } 1570 break; 1571 case 56: 1572 #line 642 "grammar.y" 1573 { 1574 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1575 } 1576 break; 1577 case 57: 1578 #line 646 "grammar.y" 1579 { 1580 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1581 } 1582 break; 1583 case 58: 1584 #line 650 "grammar.y" 1585 { 1586 Symbol *s; 1587 s = find_symbol(typedef_names, yystack.l_mark[0].text.text); 1588 if (s != NULL) 1589 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, s->flags); 1590 } 1591 break; 1592 case 61: 1593 #line 662 "grammar.y" 1594 { 1595 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1596 } 1597 break; 1598 case 62: 1599 #line 666 "grammar.y" 1600 { 1601 /* This rule allows the <pointer> nonterminal to scan #define 1602 * names as if they were type modifiers. 1603 */ 1604 Symbol *s; 1605 s = find_symbol(define_names, yystack.l_mark[0].text.text); 1606 if (s != NULL) 1607 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, s->flags); 1608 } 1609 break; 1610 case 63: 1611 #line 679 "grammar.y" 1612 { 1613 char *s; 1614 if ((s = implied_typedef()) == 0) 1615 (void)sprintf(s = buf, "%s %s", yystack.l_mark[-2].text.text, yystack.l_mark[-1].text.text); 1616 new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-2].text.begin, DS_NONE); 1617 } 1618 break; 1619 case 64: 1620 #line 686 "grammar.y" 1621 { 1622 char *s; 1623 if ((s = implied_typedef()) == 0) 1624 (void)sprintf(s = buf, "%s {}", yystack.l_mark[-1].text.text); 1625 new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-1].text.begin, DS_NONE); 1626 } 1627 break; 1628 case 65: 1629 #line 693 "grammar.y" 1630 { 1631 (void)sprintf(buf, "%s %s", yystack.l_mark[-1].text.text, yystack.l_mark[0].text.text); 1632 new_decl_spec(&yyval.decl_spec, buf, yystack.l_mark[-1].text.begin, DS_NONE); 1633 } 1634 break; 1635 case 66: 1636 #line 701 "grammar.y" 1637 { 1638 imply_typedef(yyval.text.text); 1639 } 1640 break; 1641 case 67: 1642 #line 705 "grammar.y" 1643 { 1644 imply_typedef(yyval.text.text); 1645 } 1646 break; 1647 case 68: 1648 #line 712 "grammar.y" 1649 { 1650 new_decl_list(&yyval.decl_list, yystack.l_mark[0].declarator); 1651 } 1652 break; 1653 case 69: 1654 #line 716 "grammar.y" 1655 { 1656 add_decl_list(&yyval.decl_list, &yystack.l_mark[-2].decl_list, yystack.l_mark[0].declarator); 1657 } 1658 break; 1659 case 70: 1660 #line 723 "grammar.y" 1661 { 1662 if (yystack.l_mark[0].declarator->func_def != FUNC_NONE && func_params == NULL && 1663 func_style == FUNC_TRADITIONAL && cur_file->convert) { 1664 gen_func_declarator(yystack.l_mark[0].declarator); 1665 fputs(cur_text(), cur_file->tmp_file); 1666 } 1667 cur_declarator = yyval.declarator; 1668 } 1669 break; 1670 case 71: 1671 #line 732 "grammar.y" 1672 { 1673 if (yystack.l_mark[-1].declarator->func_def != FUNC_NONE && func_params == NULL && 1674 func_style == FUNC_TRADITIONAL && cur_file->convert) { 1675 gen_func_declarator(yystack.l_mark[-1].declarator); 1676 fputs(" =", cur_file->tmp_file); 1677 } 1678 } 1679 break; 1680 case 73: 1681 #line 744 "grammar.y" 1682 { 1683 char *s; 1684 if ((s = implied_typedef()) == 0) 1685 (void)sprintf(s = buf, "enum %s", yystack.l_mark[-1].text.text); 1686 new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-2].text.begin, DS_NONE); 1687 } 1688 break; 1689 case 74: 1690 #line 751 "grammar.y" 1691 { 1692 char *s; 1693 if ((s = implied_typedef()) == 0) 1694 (void)sprintf(s = buf, "%s {}", yystack.l_mark[-1].text.text); 1695 new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-1].text.begin, DS_NONE); 1696 } 1697 break; 1698 case 75: 1699 #line 758 "grammar.y" 1700 { 1701 (void)sprintf(buf, "enum %s", yystack.l_mark[0].text.text); 1702 new_decl_spec(&yyval.decl_spec, buf, yystack.l_mark[-1].text.begin, DS_NONE); 1703 } 1704 break; 1705 case 76: 1706 #line 766 "grammar.y" 1707 { 1708 imply_typedef("enum"); 1709 yyval.text = yystack.l_mark[0].text; 1710 } 1711 break; 1712 case 79: 1713 #line 779 "grammar.y" 1714 { 1715 yyval.declarator = yystack.l_mark[0].declarator; 1716 (void)sprintf(buf, "%s%s", yystack.l_mark[-1].text.text, yyval.declarator->text); 1717 free(yyval.declarator->text); 1718 yyval.declarator->text = xstrdup(buf); 1719 yyval.declarator->begin = yystack.l_mark[-1].text.begin; 1720 yyval.declarator->pointer = TRUE; 1721 } 1722 break; 1723 case 81: 1724 #line 792 "grammar.y" 1725 { 1726 yyval.declarator = new_declarator(yystack.l_mark[0].text.text, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin); 1727 } 1728 break; 1729 case 82: 1730 #line 796 "grammar.y" 1731 { 1732 yyval.declarator = yystack.l_mark[-1].declarator; 1733 (void)sprintf(buf, "(%s)", yyval.declarator->text); 1734 free(yyval.declarator->text); 1735 yyval.declarator->text = xstrdup(buf); 1736 yyval.declarator->begin = yystack.l_mark[-2].text.begin; 1737 } 1738 break; 1739 case 83: 1740 #line 804 "grammar.y" 1741 { 1742 yyval.declarator = yystack.l_mark[-1].declarator; 1743 (void)sprintf(buf, "%s%s", yyval.declarator->text, yystack.l_mark[0].text.text); 1744 free(yyval.declarator->text); 1745 yyval.declarator->text = xstrdup(buf); 1746 } 1747 break; 1748 case 84: 1749 #line 811 "grammar.y" 1750 { 1751 yyval.declarator = new_declarator("%s()", yystack.l_mark[-3].declarator->name, yystack.l_mark[-3].declarator->begin); 1752 yyval.declarator->params = yystack.l_mark[-1].param_list; 1753 yyval.declarator->func_stack = yystack.l_mark[-3].declarator; 1754 yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; 1755 yyval.declarator->func_def = FUNC_ANSI; 1756 } 1757 break; 1758 case 85: 1759 #line 819 "grammar.y" 1760 { 1761 yyval.declarator = new_declarator("%s()", yystack.l_mark[-3].declarator->name, yystack.l_mark[-3].declarator->begin); 1762 yyval.declarator->params = yystack.l_mark[-1].param_list; 1763 yyval.declarator->func_stack = yystack.l_mark[-3].declarator; 1764 yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; 1765 yyval.declarator->func_def = FUNC_TRADITIONAL; 1766 } 1767 break; 1768 case 86: 1769 #line 830 "grammar.y" 1770 { 1771 (void)sprintf(yyval.text.text, "*%s", yystack.l_mark[0].text.text); 1772 yyval.text.begin = yystack.l_mark[-1].text.begin; 1773 } 1774 break; 1775 case 87: 1776 #line 835 "grammar.y" 1777 { 1778 (void)sprintf(yyval.text.text, "*%s%s", yystack.l_mark[-1].text.text, yystack.l_mark[0].text.text); 1779 yyval.text.begin = yystack.l_mark[-2].text.begin; 1780 } 1781 break; 1782 case 88: 1783 #line 843 "grammar.y" 1784 { 1785 strcpy(yyval.text.text, ""); 1786 yyval.text.begin = 0L; 1787 } 1788 break; 1789 case 90: 1790 #line 852 "grammar.y" 1791 { 1792 (void)sprintf(yyval.text.text, "%s ", yystack.l_mark[0].decl_spec.text); 1793 yyval.text.begin = yystack.l_mark[0].decl_spec.begin; 1794 free(yystack.l_mark[0].decl_spec.text); 1795 } 1796 break; 1797 case 91: 1798 #line 858 "grammar.y" 1799 { 1800 (void)sprintf(yyval.text.text, "%s%s ", yystack.l_mark[-1].text.text, yystack.l_mark[0].decl_spec.text); 1801 yyval.text.begin = yystack.l_mark[-1].text.begin; 1802 free(yystack.l_mark[0].decl_spec.text); 1803 } 1804 break; 1805 case 93: 1806 #line 868 "grammar.y" 1807 { 1808 add_ident_list(&yyval.param_list, &yystack.l_mark[-2].param_list, "..."); 1809 } 1810 break; 1811 case 94: 1812 #line 875 "grammar.y" 1813 { 1814 new_param_list(&yyval.param_list, yystack.l_mark[0].parameter); 1815 } 1816 break; 1817 case 95: 1818 #line 879 "grammar.y" 1819 { 1820 add_param_list(&yyval.param_list, &yystack.l_mark[-2].param_list, yystack.l_mark[0].parameter); 1821 } 1822 break; 1823 case 96: 1824 #line 886 "grammar.y" 1825 { 1826 check_untagged(&yystack.l_mark[-1].decl_spec); 1827 yyval.parameter = new_parameter(&yystack.l_mark[-1].decl_spec, yystack.l_mark[0].declarator); 1828 } 1829 break; 1830 case 97: 1831 #line 891 "grammar.y" 1832 { 1833 check_untagged(&yystack.l_mark[-1].decl_spec); 1834 yyval.parameter = new_parameter(&yystack.l_mark[-1].decl_spec, yystack.l_mark[0].declarator); 1835 } 1836 break; 1837 case 98: 1838 #line 896 "grammar.y" 1839 { 1840 check_untagged(&yystack.l_mark[0].decl_spec); 1841 yyval.parameter = new_parameter(&yystack.l_mark[0].decl_spec, (Declarator *)0); 1842 } 1843 break; 1844 case 99: 1845 #line 904 "grammar.y" 1846 { 1847 new_ident_list(&yyval.param_list); 1848 } 1849 break; 1850 case 101: 1851 #line 912 "grammar.y" 1852 { 1853 new_ident_list(&yyval.param_list); 1854 add_ident_list(&yyval.param_list, &yyval.param_list, yystack.l_mark[0].text.text); 1855 } 1856 break; 1857 case 102: 1858 #line 917 "grammar.y" 1859 { 1860 add_ident_list(&yyval.param_list, &yystack.l_mark[-2].param_list, yystack.l_mark[0].text.text); 1861 } 1862 break; 1863 case 103: 1864 #line 924 "grammar.y" 1865 { 1866 yyval.text = yystack.l_mark[0].text; 1867 } 1868 break; 1869 case 104: 1870 #line 928 "grammar.y" 1871 { 1872 #if OPT_LINTLIBRARY 1873 if (lintLibrary()) { /* Lint doesn't grok C++ ref variables */ 1874 yyval.text = yystack.l_mark[0].text; 1875 } else 1876 #endif 1877 (void)sprintf(yyval.text.text, "&%s", yystack.l_mark[0].text.text); 1878 yyval.text.begin = yystack.l_mark[-1].text.begin; 1879 } 1880 break; 1881 case 105: 1882 #line 941 "grammar.y" 1883 { 1884 yyval.declarator = new_declarator(yystack.l_mark[0].text.text, "", yystack.l_mark[0].text.begin); 1885 } 1886 break; 1887 case 106: 1888 #line 945 "grammar.y" 1889 { 1890 yyval.declarator = yystack.l_mark[0].declarator; 1891 (void)sprintf(buf, "%s%s", yystack.l_mark[-1].text.text, yyval.declarator->text); 1892 free(yyval.declarator->text); 1893 yyval.declarator->text = xstrdup(buf); 1894 yyval.declarator->begin = yystack.l_mark[-1].text.begin; 1895 } 1896 break; 1897 case 108: 1898 #line 957 "grammar.y" 1899 { 1900 yyval.declarator = yystack.l_mark[-1].declarator; 1901 (void)sprintf(buf, "(%s)", yyval.declarator->text); 1902 free(yyval.declarator->text); 1903 yyval.declarator->text = xstrdup(buf); 1904 yyval.declarator->begin = yystack.l_mark[-2].text.begin; 1905 } 1906 break; 1907 case 109: 1908 #line 965 "grammar.y" 1909 { 1910 yyval.declarator = yystack.l_mark[-1].declarator; 1911 (void)sprintf(buf, "%s%s", yyval.declarator->text, yystack.l_mark[0].text.text); 1912 free(yyval.declarator->text); 1913 yyval.declarator->text = xstrdup(buf); 1914 } 1915 break; 1916 case 110: 1917 #line 972 "grammar.y" 1918 { 1919 yyval.declarator = new_declarator(yystack.l_mark[0].text.text, "", yystack.l_mark[0].text.begin); 1920 } 1921 break; 1922 case 111: 1923 #line 976 "grammar.y" 1924 { 1925 yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-3].declarator->begin); 1926 yyval.declarator->params = yystack.l_mark[-1].param_list; 1927 yyval.declarator->func_stack = yystack.l_mark[-3].declarator; 1928 yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; 1929 yyval.declarator->func_def = FUNC_ANSI; 1930 } 1931 break; 1932 case 112: 1933 #line 984 "grammar.y" 1934 { 1935 yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-2].declarator->begin); 1936 yyval.declarator->func_stack = yystack.l_mark[-2].declarator; 1937 yyval.declarator->head = (yystack.l_mark[-2].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-2].declarator->head; 1938 yyval.declarator->func_def = FUNC_ANSI; 1939 } 1940 break; 1941 case 113: 1942 #line 991 "grammar.y" 1943 { 1944 Declarator *d; 1945 1946 d = new_declarator("", "", yystack.l_mark[-2].text.begin); 1947 yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-2].text.begin); 1948 yyval.declarator->params = yystack.l_mark[-1].param_list; 1949 yyval.declarator->func_stack = d; 1950 yyval.declarator->head = yyval.declarator; 1951 yyval.declarator->func_def = FUNC_ANSI; 1952 } 1953 break; 1954 case 114: 1955 #line 1002 "grammar.y" 1956 { 1957 Declarator *d; 1958 1959 d = new_declarator("", "", yystack.l_mark[-1].text.begin); 1960 yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-1].text.begin); 1961 yyval.declarator->func_stack = d; 1962 yyval.declarator->head = yyval.declarator; 1963 yyval.declarator->func_def = FUNC_ANSI; 1964 } 1965 break; 1966 #line 1965 "grammar.tab.c" 1967 } 1968 yystack.s_mark -= yym; 1969 yystate = *yystack.s_mark; 1970 yystack.l_mark -= yym; 1971 yym = yylhs[yyn]; 1972 if (yystate == 0 && yym == 0) 1973 { 1974 #if YYDEBUG 1975 if (yydebug) 1976 printf("%sdebug: after reduction, shifting from state 0 to\ 1977 state %d\n", YYPREFIX, YYFINAL); 1978 #endif 1979 yystate = YYFINAL; 1980 *++yystack.s_mark = YYFINAL; 1981 *++yystack.l_mark = yyval; 1982 if (yychar < 0) 1983 { 1984 yychar = YYLEX; 1985 if (yychar < 0) yychar = YYEOF; 1986 #if YYDEBUG 1987 if (yydebug) 1988 { 1989 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 1990 printf("%sdebug: state %d, reading %d (%s)\n", 1991 YYPREFIX, YYFINAL, yychar, yys); 1992 } 1993 #endif 1994 } 1995 if (yychar == YYEOF) goto yyaccept; 1996 goto yyloop; 1997 } 1998 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 && 1999 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate) 2000 yystate = yytable[yyn]; 2001 else 2002 yystate = yydgoto[yym]; 2003 #if YYDEBUG 2004 if (yydebug) 2005 printf("%sdebug: after reduction, shifting from state %d \ 2006 to state %d\n", YYPREFIX, *yystack.s_mark, yystate); 2007 #endif 2008 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 2009 *++yystack.s_mark = (YYINT) yystate; 2010 *++yystack.l_mark = yyval; 2011 goto yyloop; 2012 2013 yyoverflow: 2014 YYERROR_CALL("yacc stack overflow"); 2015 2016 yyabort: 2017 yyfreestack(&yystack); 2018 return (1); 2019 2020 yyaccept: 2021 yyfreestack(&yystack); 2022 return (0); 2023 } 2024