1 /* 2 * Copyright (c) 1989 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Robert Paul Corbett. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #ifndef lint 12 char copyright[] = 13 "@(#) Copyright (c) 1989 The Regents of the University of California.\n\ 14 All rights reserved.\n"; 15 #endif /* not lint */ 16 17 #ifndef lint 18 static char sccsid[] = "@(#)main.c 5.5 (Berkeley) 05/24/93"; 19 #endif /* not lint */ 20 21 #include <signal.h> 22 #include "defs.h" 23 24 char dflag; 25 char lflag; 26 char rflag; 27 char tflag; 28 char vflag; 29 30 char *symbol_prefix; 31 char *file_prefix = "y"; 32 char *myname = "yacc"; 33 char *temp_form = "yacc.XXXXXXX"; 34 35 int lineno; 36 int outline; 37 38 char *action_file_name; 39 char *code_file_name; 40 char *defines_file_name; 41 char *input_file_name = ""; 42 char *output_file_name; 43 char *text_file_name; 44 char *union_file_name; 45 char *verbose_file_name; 46 47 FILE *action_file; /* a temp file, used to save actions associated */ 48 /* with rules until the parser is written */ 49 FILE *code_file; /* y.code.c (used when the -r option is specified) */ 50 FILE *defines_file; /* y.tab.h */ 51 FILE *input_file; /* the input file */ 52 FILE *output_file; /* y.tab.c */ 53 FILE *text_file; /* a temp file, used to save text until all */ 54 /* symbols have been defined */ 55 FILE *union_file; /* a temp file, used to save the union */ 56 /* definition until all symbol have been */ 57 /* defined */ 58 FILE *verbose_file; /* y.output */ 59 60 int nitems; 61 int nrules; 62 int nsyms; 63 int ntokens; 64 int nvars; 65 66 int start_symbol; 67 char **symbol_name; 68 short *symbol_value; 69 short *symbol_prec; 70 char *symbol_assoc; 71 72 short *ritem; 73 short *rlhs; 74 short *rrhs; 75 short *rprec; 76 char *rassoc; 77 short **derives; 78 char *nullable; 79 80 extern char *mktemp(); 81 extern char *getenv(); 82 83 84 done(k) 85 int k; 86 { 87 if (action_file) { fclose(action_file); unlink(action_file_name); } 88 if (text_file) { fclose(text_file); unlink(text_file_name); } 89 if (union_file) { fclose(union_file); unlink(union_file_name); } 90 exit(k); 91 } 92 93 94 void 95 onintr(signo) 96 int signo; 97 { 98 done(1); 99 } 100 101 102 set_signals() 103 { 104 #ifdef SIGINT 105 if (signal(SIGINT, SIG_IGN) != SIG_IGN) 106 signal(SIGINT, onintr); 107 #endif 108 #ifdef SIGTERM 109 if (signal(SIGTERM, SIG_IGN) != SIG_IGN) 110 signal(SIGTERM, onintr); 111 #endif 112 #ifdef SIGHUP 113 if (signal(SIGHUP, SIG_IGN) != SIG_IGN) 114 signal(SIGHUP, onintr); 115 #endif 116 } 117 118 119 usage() 120 { 121 fprintf(stderr, "usage: %s [-dlrtv] [-b file_prefix] [-p symbol_prefix] filename\n", myname); 122 exit(1); 123 } 124 125 126 getargs(argc, argv) 127 int argc; 128 char *argv[]; 129 { 130 register int i; 131 register char *s; 132 133 if (argc > 0) myname = argv[0]; 134 for (i = 1; i < argc; ++i) 135 { 136 s = argv[i]; 137 if (*s != '-') break; 138 switch (*++s) 139 { 140 case '\0': 141 input_file = stdin; 142 if (i + 1 < argc) usage(); 143 return; 144 145 case '-': 146 ++i; 147 goto no_more_options; 148 149 case 'b': 150 if (*++s) 151 file_prefix = s; 152 else if (++i < argc) 153 file_prefix = argv[i]; 154 else 155 usage(); 156 continue; 157 158 case 'd': 159 dflag = 1; 160 break; 161 162 case 'l': 163 lflag = 1; 164 break; 165 166 case 'p': 167 if (*++s) 168 symbol_prefix = s; 169 else if (++i < argc) 170 symbol_prefix = argv[i]; 171 else 172 usage(); 173 continue; 174 175 case 'r': 176 rflag = 1; 177 break; 178 179 case 't': 180 tflag = 1; 181 break; 182 183 case 'v': 184 vflag = 1; 185 break; 186 187 default: 188 usage(); 189 } 190 191 for (;;) 192 { 193 switch (*++s) 194 { 195 case '\0': 196 goto end_of_option; 197 198 case 'd': 199 dflag = 1; 200 break; 201 202 case 'l': 203 lflag = 1; 204 break; 205 206 case 'r': 207 rflag = 1; 208 break; 209 210 case 't': 211 tflag = 1; 212 break; 213 214 case 'v': 215 vflag = 1; 216 break; 217 218 default: 219 usage(); 220 } 221 } 222 end_of_option:; 223 } 224 225 no_more_options:; 226 if (i + 1 != argc) usage(); 227 input_file_name = argv[i]; 228 } 229 230 231 char * 232 allocate(n) 233 unsigned n; 234 { 235 register char *p; 236 237 p = NULL; 238 if (n) 239 { 240 p = CALLOC(1, n); 241 if (!p) no_space(); 242 } 243 return (p); 244 } 245 246 247 create_file_names() 248 { 249 int i, len; 250 char *tmpdir; 251 252 tmpdir = getenv("TMPDIR"); 253 if (tmpdir == 0) tmpdir = "/tmp"; 254 255 len = strlen(tmpdir); 256 i = len + 13; 257 if (len && tmpdir[len-1] != '/') 258 ++i; 259 260 action_file_name = MALLOC(i); 261 if (action_file_name == 0) no_space(); 262 text_file_name = MALLOC(i); 263 if (text_file_name == 0) no_space(); 264 union_file_name = MALLOC(i); 265 if (union_file_name == 0) no_space(); 266 267 strcpy(action_file_name, tmpdir); 268 strcpy(text_file_name, tmpdir); 269 strcpy(union_file_name, tmpdir); 270 271 if (len && tmpdir[len - 1] != '/') 272 { 273 action_file_name[len] = '/'; 274 text_file_name[len] = '/'; 275 union_file_name[len] = '/'; 276 ++len; 277 } 278 279 strcpy(action_file_name + len, temp_form); 280 strcpy(text_file_name + len, temp_form); 281 strcpy(union_file_name + len, temp_form); 282 283 action_file_name[len + 5] = 'a'; 284 text_file_name[len + 5] = 't'; 285 union_file_name[len + 5] = 'u'; 286 287 mktemp(action_file_name); 288 mktemp(text_file_name); 289 mktemp(union_file_name); 290 291 len = strlen(file_prefix); 292 293 output_file_name = MALLOC(len + 7); 294 if (output_file_name == 0) 295 no_space(); 296 strcpy(output_file_name, file_prefix); 297 strcpy(output_file_name + len, OUTPUT_SUFFIX); 298 299 if (rflag) 300 { 301 code_file_name = MALLOC(len + 8); 302 if (code_file_name == 0) 303 no_space(); 304 strcpy(code_file_name, file_prefix); 305 strcpy(code_file_name + len, CODE_SUFFIX); 306 } 307 else 308 code_file_name = output_file_name; 309 310 if (dflag) 311 { 312 defines_file_name = MALLOC(len + 7); 313 if (defines_file_name == 0) 314 no_space(); 315 strcpy(defines_file_name, file_prefix); 316 strcpy(defines_file_name + len, DEFINES_SUFFIX); 317 } 318 319 if (vflag) 320 { 321 verbose_file_name = MALLOC(len + 8); 322 if (verbose_file_name == 0) 323 no_space(); 324 strcpy(verbose_file_name, file_prefix); 325 strcpy(verbose_file_name + len, VERBOSE_SUFFIX); 326 } 327 } 328 329 330 open_files() 331 { 332 create_file_names(); 333 334 if (input_file == 0) 335 { 336 input_file = fopen(input_file_name, "r"); 337 if (input_file == 0) 338 open_error(input_file_name); 339 } 340 341 action_file = fopen(action_file_name, "w"); 342 if (action_file == 0) 343 open_error(action_file_name); 344 345 text_file = fopen(text_file_name, "w"); 346 if (text_file == 0) 347 open_error(text_file_name); 348 349 if (vflag) 350 { 351 verbose_file = fopen(verbose_file_name, "w"); 352 if (verbose_file == 0) 353 open_error(verbose_file_name); 354 } 355 356 if (dflag) 357 { 358 defines_file = fopen(defines_file_name, "w"); 359 if (defines_file == 0) 360 open_error(defines_file_name); 361 union_file = fopen(union_file_name, "w"); 362 if (union_file == 0) 363 open_error(union_file_name); 364 } 365 366 output_file = fopen(output_file_name, "w"); 367 if (output_file == 0) 368 open_error(output_file_name); 369 370 if (rflag) 371 { 372 code_file = fopen(code_file_name, "w"); 373 if (code_file == 0) 374 open_error(code_file_name); 375 } 376 else 377 code_file = output_file; 378 } 379 380 381 int 382 main(argc, argv) 383 int argc; 384 char *argv[]; 385 { 386 set_signals(); 387 getargs(argc, argv); 388 open_files(); 389 reader(); 390 lr0(); 391 lalr(); 392 make_parser(); 393 verbose(); 394 output(); 395 done(0); 396 /*NOTREACHED*/ 397 } 398