int main (int argc, char *argv[]) { int parse_rv; #ifdef YYDEBUG yydebug = 1; #endif if (argc > 1) { yyin = fopen (argv[1], "r"); assert (NULL != yyin); } init_sym_table (); init_last_redeclared (); parse_rv = yyparse (); if (0 == parse_rv) { printf ("Parsing completed."); if (0 == error_count) printf (" No errors found."); printf ("\n"); } else printf ("Parsing aborted due to unrecoverable error(s).\n"); if (argc > 1) { assert (0 == fclose (yyin)); } destroy_sym_table (); /* * Not precisely as indicated by the manual, but seems to be the right * thing to do based on the C code generated by flex. */ yylex_destroy (); /* * Successful exit code even if parsing failed. Unit test script depends * on this behavior. */ exit (EXIT_SUCCESS); }
int main(int argc, char *argv[]) { boolean print_parse = FALSE; boolean print_expanded = FALSE; char *arg; char *source_name = NULL; char *output_name = NULL; FILE *file; add_header_handler("module", set_module); add_header_handler("library", set_library); add_header_handler(NULL, end_of_headers); init_sym_table(); init_feature(); init_info(); init_expand(); init_compile(); #ifdef MACOS add_feature(symbol("macos")); # ifndef SHLB argc = ccommand( &argv ); # endif #endif while ((arg = *++argv) != NULL) { if (arg[0] == '-') { switch (arg[1]) { case 'd': if (arg[2] == '\0') { print_parse = TRUE; print_expanded = TRUE; } else { char *ptr; for (ptr = arg+2; *ptr != '\0'; ptr++) { switch (*ptr) { case 'p': print_parse = TRUE; break; case 'e': print_expanded = TRUE; break; default: fprintf(stderr, "Invalid thing to print: ``%c''\n", *ptr); usage(); } } } break; case 'o': if (output_name != NULL) { fprintf(stderr, "-o can only be used once.\n"); usage(); } else if (arg[2] != '\0') output_name = arg+2; else if (*++argv == NULL) { fprintf(stderr, "-o must be followed by the output " "file name.\n"); usage(); } else output_name = *argv; break; case 'l': if (LibraryName != NULL) { fprintf(stderr, "-l can only be used once.\n"); usage(); } if (arg[2] != '\0') LibraryName = symbol(arg+2); else if (*++argv == NULL) { fprintf(stderr, "-l must be followed by the library " "name.\n"); usage(); } else LibraryName = symbol(*argv); break; case 'q': GiveWarnings = FALSE; break; case 'D': if (arg[2] != '\0') add_feature(symbol(arg + 2)); else if (*++argv == NULL) { fprintf(stderr, "-D must be followed by the feature to define.\n"); usage(); } else add_feature(symbol(*argv)); break; case 'U': if (arg[2] != '\0') remove_feature(symbol(arg + 2)); else if (*++argv == NULL) { fprintf(stderr, "-U must be followed by the feature " "to undefine.\n"); usage(); } else remove_feature(symbol(*argv)); break; default: fprintf(stderr, "Invalid flag: ``%s''\n", arg); usage(); } } else if (source_name != NULL) { fprintf(stderr, "Too many files\n"); usage(); } else source_name = arg; } if (source_name == NULL) usage(); yyin = fopen(source_name, "rb"); if (yyin == NULL) { /* Try the same filename but in the current directory */ /* Start ptr at the null termination, and work backwards to a path separator. */ char *ptr = source_name + strlen(source_name); for ( ; ptr != source_name; ptr--) { if (*ptr == '/' || *ptr == '\\') { /* We're pointing at the path separator, which is too far */ ptr++; break; } } /* If ptr is a different string than source_name, and it isn't the empty string... */ if (ptr != source_name && *ptr != 0) { yyin = fopen(ptr, "rb"); } if (yyin == NULL) { perror(source_name); exit(1); } } current_file = source_name; yyparse(); if (print_parse) { printf("================ Original Parse Tree ================\n"); print_body(Program, 0); } if (nerrors != 0) exit(1); /* Do the various source-to-source expansions. */ expand(Program); if (print_expanded) { printf("================ Expanded Parse Tree ================\n"); print_body(Program, 0); } if (nerrors != 0) exit(1); /* Run environment analysis */ environment_analysis(Program); if (nerrors != 0) exit(1); if (output_name == NULL) output_name = make_output_name(source_name, ".dbc"); if (strcmp(output_name, "-") == 0) file = stdout; else file = fopen(output_name, "wb"); if (file == NULL) { perror(output_name); exit(1); } dump_setup_output(source_name, file); /* Generate code. */ compile(Program); dump_finalize_output(); fclose(file); exit(0); return 0; }